source: trunk/locker/cron/src/subs.c @ 2717

Last change on this file since 2717 was 359, checked in by quentin, 17 years ago
initial checkin of cron system
File size: 2.9 KB
Line 
1
2/*
3 * SUBS.C
4 *
5 * Copyright 1994 Matthew Dillon (dillon@apollo.backplane.com)
6 * May be distributed under the GNU General Public License
7 */
8
9#include "defs.h"
10
11Prototype void logn(int level, const char *ctl, ...);
12Prototype void log9(const char *ctl, ...);
13Prototype void logfd(int fd, const char *ctl, ...);
14Prototype void fdprintf(int fd, const char *ctl, ...);
15Prototype int ChangeUser(const char *user, short dochdir);
16Prototype void vlog(int level, int fd, const char *ctl, va_list va);
17Prototype int slog(char *buf, const char *ctl, int nmax, va_list va, short useDate);
18
19extern short LogLevel;
20
21void 
22log9(const char *ctl, ...)
23{
24    va_list va;
25
26    va_start(va, ctl);
27    vlog(9, 2, ctl, va);
28    va_end(va);
29}
30
31void 
32logn(int level, const char *ctl, ...)
33{
34    va_list va;
35
36    va_start(va, ctl);
37    vlog(level, 2, ctl, va);
38    va_end(va);
39}
40
41void 
42logfd(int fd, const char *ctl, ...)
43{
44    va_list va;
45
46    va_start(va, ctl);
47    vlog(9, fd, ctl, va);
48    va_end(va);
49}
50
51void 
52fdprintf(int fd, const char *ctl, ...)
53{
54    va_list va;
55    char buf[2048];
56
57    va_start(va, ctl);
58    vsnprintf(buf, sizeof(buf), ctl, va);
59    write(fd, buf, strlen(buf));
60    va_end(va);
61}
62
63void
64vlog(int level, int fd, const char *ctl, va_list va)
65{
66    char buf[2048];
67    short n;
68    static short useDate = 1;
69
70    if (level >= LogLevel) {
71        write(fd, buf, n = slog(buf, ctl, sizeof(buf), va, useDate));
72        useDate = (n && buf[n-1] == '\n');
73    }
74}
75
76int
77slog(char *buf, const char *ctl, int nmax, va_list va, short useDate)
78{
79    time_t t = time(NULL);
80    struct tm *tp = localtime(&t);
81
82    buf[0] = 0;
83    if (useDate)
84        strftime(buf, 128, "%d-%b-%y %H:%M  ", tp);
85    vsnprintf(buf + strlen(buf), nmax, ctl, va);
86    return(strlen(buf));
87}
88
89int
90ChangeUser(const char *user, short dochdir)
91{
92    struct passwd *pas;
93
94    /*
95     * Obtain password entry and change privilages
96     */
97
98    if ((pas = getpwnam(user)) == 0) {
99        logn(9, "failed to get uid for %s", user);
100        return(-1);
101    }
102    setenv("USER", pas->pw_name, 1);
103    setenv("HOME", pas->pw_dir, 1);
104    setenv("SHELL", "/bin/sh", 1);
105
106    /*
107     * Change running state to the user in question
108     */
109
110    if (initgroups(user, pas->pw_gid) < 0) {
111        logn(9, "initgroups failed: %s %s", user, strerror(errno));
112        return(-1);
113    }
114    if (setregid(pas->pw_gid, pas->pw_gid) < 0) {
115        logn(9, "setregid failed: %s %d", user, pas->pw_gid);
116        return(-1);
117    }
118    if (setreuid(pas->pw_uid, pas->pw_uid) < 0) {
119        logn(9, "setreuid failed: %s %d", user, pas->pw_uid);
120        return(-1);
121    }
122    if (dochdir) {
123        if (chdir(pas->pw_dir) < 0) {
124            logn(8, "chdir failed: %s %s", user, pas->pw_dir);
125            if (chdir(TMPDIR) < 0) {
126                logn(9, "chdir failed: %s %s", user, pas->pw_dir);
127                logn(9, "chdir failed: %s " TMPDIR, user);
128                return(-1);
129            }
130        }
131    }
132    return(pas->pw_uid);
133}
134
135#if 0
136
137char *
138strdup(const char *str)
139{
140    char *ptr = malloc(strlen(str) + 1);
141
142    if (ptr)
143        strcpy(ptr, str);
144    return(ptr);
145}
146
147#endif
Note: See TracBrowser for help on using the repository browser.