diff -c -r /tmp/cron/Makefile cron/Makefile *** /tmp/cron/Makefile Fri Jun 18 19:37:52 1999 --- cron/Makefile Tue Jun 15 20:53:11 1999 *************** *** 45,96 **** # # there's more configuration info in config.h; edit that first! - #################################### begin configurable stuff - #<> DESTROOT = $(DESTDIR)/usr DESTSBIN = $(DESTROOT)/sbin DESTBIN = $(DESTROOT)/bin ! DESTMAN = $(DESTROOT)/share/man ! #<> INCLUDE = -I. - #INCLUDE = - #<> LIBS = ! #<> ! #OPTIM = -O ! OPTIM = -g ! #<> ! # (ATT untested) ! #COMPAT = -DATT ! #(BSD is only needed if does not define it, as on ULTRIX) ! #COMPAT = -DBSD ! # (POSIX) ! #COMPAT = -DPOSIX #<> ! LINTFLAGS = -hbxa $(INCLUDE) $(COMPAT) $(DEBUGGING) ! #<> ! #CC = vcc ! #<> DEFS = ! #(SGI IRIX systems need this) ! #DEFS = -D_BSD_SIGNALS -Dconst= ! #<> ! #INSTALL = installbsd ! INSTALL = install ! #<> ! LDFLAGS = #################################### end configurable stuff SHELL = /bin/sh ! CFLAGS = $(OPTIM) $(INCLUDE) $(COMPAT) $(DEFS) - INFOS = README CHANGES FEATURES INSTALL CONVERSION THANKS MAIL - MANPAGES = bitstring.3 crontab.5 crontab.1 cron.8 putman.sh - HEADERS = bitstring.h cron.h config.h pathnames.h \ - externs.h compat.h - SOURCES = cron.c crontab.c database.c do_command.c entry.c \ - env.c job.c user.c popen.c misc.c compat.c - SHAR_SOURCE = $(INFOS) $(MANPAGES) Makefile $(HEADERS) $(SOURCES) LINT_CRON = cron.c database.c user.c entry.c compat.c \ misc.c job.c do_command.c env.c popen.c LINT_CRONTAB = crontab.c misc.c entry.c env.c compat.c --- 45,68 ---- # # there's more configuration info in config.h; edit that first! DESTROOT = $(DESTDIR)/usr DESTSBIN = $(DESTROOT)/sbin DESTBIN = $(DESTROOT)/bin ! DESTMAN = $(DESTROOT)/man INCLUDE = -I. LIBS = ! OPTIM = -O #<> ! LINTFLAGS = -hbxa $(INCLUDE) ! CC = cc DEFS = ! INSTALL = install ! LDFLAGS = -i #################################### end configurable stuff SHELL = /bin/sh ! CFLAGS = $(OPTIM) $(INCLUDE) $(DEFS) LINT_CRON = cron.c database.c user.c entry.c compat.c \ misc.c job.c do_command.c env.c popen.c LINT_CRONTAB = crontab.c misc.c entry.c env.c compat.c *************** *** 98,128 **** misc.o env.o popen.o compat.o CRONTAB_OBJ = crontab.o misc.o entry.o env.o compat.o ! all : cron crontab ! lint : ! lint $(LINTFLAGS) $(LINT_CRON) $(LIBS) \ ! |grep -v "constant argument to NOT" 2>&1 ! lint $(LINTFLAGS) $(LINT_CRONTAB) $(LIBS) \ ! |grep -v "constant argument to NOT" 2>&1 ! cron : $(CRON_OBJ) ! $(CC) $(LDFLAGS) -o cron $(CRON_OBJ) $(LIBS) ! crontab : $(CRONTAB_OBJ) ! $(CC) $(LDFLAGS) -o crontab $(CRONTAB_OBJ) $(LIBS) ! install : all ! $(INSTALL) -c -m 111 -o root -s cron $(DESTSBIN)/ ! $(INSTALL) -c -m 4111 -o root -s crontab $(DESTBIN)/ ! sh putman.sh crontab.1 $(DESTMAN) ! sh putman.sh cron.8 $(DESTMAN) ! sh putman.sh crontab.5 $(DESTMAN) ! clean :; rm -f *.o cron crontab a.out core tags *~ #* ! ! kit : $(SHAR_SOURCE) ! makekit -m -s99k $(SHAR_SOURCE) $(CRON_OBJ) : cron.h compat.h config.h externs.h pathnames.h Makefile $(CRONTAB_OBJ) : cron.h compat.h config.h externs.h pathnames.h Makefile --- 70,98 ---- misc.o env.o popen.o compat.o CRONTAB_OBJ = crontab.o misc.o entry.o env.o compat.o ! all: cron crontab ! lint: ! lint $(LINTFLAGS) $(LINT_CRON) $(LIBS) \ ! |grep -v "constant argument to NOT" 2>&1 ! lint $(LINTFLAGS) $(LINT_CRONTAB) $(LIBS) \ ! |grep -v "constant argument to NOT" 2>&1 ! cron: $(CRON_OBJ) ! $(CC) $(LDFLAGS) -o cron $(CRON_OBJ) $(LIBS) ! crontab: $(CRONTAB_OBJ) ! $(CC) $(LDFLAGS) -o crontab $(CRONTAB_OBJ) $(LIBS) ! install: all ! $(INSTALL) -c -m 111 -o root -s cron $(DESTSBIN)/cron ! $(INSTALL) -c -m 4111 -o root -s crontab $(DESTBIN)/crontab ! sh putman.sh crontab.1 $(DESTMAN) ! sh putman.sh cron.8 $(DESTMAN) ! sh putman.sh crontab.5 $(DESTMAN) ! clean: ! rm -f *.o cron crontab a.out core tags *~ #* $(CRON_OBJ) : cron.h compat.h config.h externs.h pathnames.h Makefile $(CRONTAB_OBJ) : cron.h compat.h config.h externs.h pathnames.h Makefile diff -c -r /tmp/cron/compat.c cron/compat.c *** /tmp/cron/compat.c Fri Jun 18 19:37:52 1999 --- cron/compat.c Tue Jun 15 22:04:11 1999 *************** *** 25,233 **** #include "cron.h" - #ifdef NEED_GETDTABLESIZE - # include - #endif - #if defined(NEED_SETSID) && defined(BSD) - # include - #endif - #include ! /* the code does not depend on any of vfork's ! * side-effects; it just uses it as a quick ! * fork-and-exec. ! */ ! #ifdef NEED_VFORK ! PID_T ! vfork() { ! return (fork()); ! } ! #endif ! ! ! #ifdef NEED_STRDUP ! char * ! strdup(str) ! char *str; ! { ! char *temp; ! ! temp = malloc(strlen(str) + 1); ! (void) strcpy(temp, str); ! return temp; ! } ! #endif ! ! ! #ifdef NEED_STRERROR ! char * ! strerror(error) ! int error; ! { ! extern char *sys_errlist[]; ! extern int sys_nerr; ! static char buf[32]; ! ! if ((error <= sys_nerr) && (error > 0)) { ! return sys_errlist[error]; ! } ! ! sprintf(buf, "Unknown error: %d", error); ! return buf; ! } ! #endif ! ! ! #ifdef NEED_STRCASECMP int - strcasecmp(left, right) - char *left; - char *right; - { - while (*left && (MkLower(*left) == MkLower(*right))) { - left++; - right++; - } - return MkLower(*left) - MkLower(*right); - } - #endif - - - #ifdef NEED_SETSID - int setsid() { int newpgrp; ! # if defined(BSD) ! int fd; ! # if defined(POSIX) ! newpgrp = setpgid((pid_t)0, getpid()); ! # else newpgrp = setpgrp(0, getpid()); ! # endif ! if ((fd = open("/dev/tty", 2)) >= 0) ! { (void) ioctl(fd, TIOCNOTTY, (char*)0); (void) close(fd); ! } ! # else /*BSD*/ ! newpgrp = setpgrp(); ! ! (void) close(STDIN); (void) open("/dev/null", 0); ! (void) close(STDOUT); (void) open("/dev/null", 1); ! (void) close(STDERR); (void) open("/dev/null", 2); ! # endif /*BSD*/ return newpgrp; } - #endif /*NEED_SETSID*/ - - - #ifdef NEED_GETDTABLESIZE - int - getdtablesize() { - #ifdef _SC_OPEN_MAX - return sysconf(_SC_OPEN_MAX); - #else - return _POSIX_OPEN_MAX; - #endif - } - #endif - - - #ifdef NEED_FLOCK - /* The following flock() emulation snarfed intact *) from the HP-UX - * "BSD to HP-UX porting tricks" maintained by - * system@alchemy.chem.utoronto.ca (System Admin (Mike Peterson)) - * from the version "last updated: 11-Jan-1993" - * Snarfage done by Jarkko Hietaniemi - * *) well, almost, had to K&R the function entry, HPUX "cc" - * does not grok ANSI function prototypes */ - - /* - * flock (fd, operation) - * - * This routine performs some file locking like the BSD 'flock' - * on the object described by the int file descriptor 'fd', - * which must already be open. - * - * The operations that are available are: - * - * LOCK_SH - get a shared lock. - * LOCK_EX - get an exclusive lock. - * LOCK_NB - don't block (must be ORed with LOCK_SH or LOCK_EX). - * LOCK_UN - release a lock. - * - * Return value: 0 if lock successful, -1 if failed. - * - * Note that whether the locks are enforced or advisory is - * controlled by the presence or absence of the SETGID bit on - * the executable. - * - * Note that there is no difference between shared and exclusive - * locks, since the 'lockf' system call in SYSV doesn't make any - * distinction. - * - * The file "" should be modified to contain the definitions - * of the available operations, which must be added manually (see below - * for the values). - */ - - /* this code has been reformatted by vixie */ - - int - flock(fd, operation) - int fd; - int operation; - { - int i; - - switch (operation) { - case LOCK_SH: /* get a shared lock */ - case LOCK_EX: /* get an exclusive lock */ - i = lockf (fd, F_LOCK, 0); - break; - - case LOCK_SH|LOCK_NB: /* get a non-blocking shared lock */ - case LOCK_EX|LOCK_NB: /* get a non-blocking exclusive lock */ - i = lockf (fd, F_TLOCK, 0); - if (i == -1) - if ((errno == EAGAIN) || (errno == EACCES)) - errno = EWOULDBLOCK; - break; - - case LOCK_UN: /* unlock */ - i = lockf (fd, F_ULOCK, 0); - break; - - default: /* can't decipher operation */ - i = -1; - errno = EINVAL; - break; - } - - return (i); - } - #endif /*NEED_FLOCK*/ - - - #ifdef NEED_SETENV - int - setenv(name, value, overwrite) - char *name, *value; - int overwrite; - { - char *tmp; - - if (overwrite && getenv(name)) - return -1; - - if (!(tmp = malloc(strlen(name) + strlen(value) + 2))) { - errno = ENOMEM; - return -1; - } - - sprintf("%s=%s", name, value); - return putenv(tmp); /* intentionally orphan 'tmp' storage */ - } - #endif --- 25,57 ---- #include "cron.h" + #include + #include ! /* ! * Ripped off from daemon(3) - differences are this sets the process group ! * and does not fork (because that has been done already). ! */ int setsid() { int newpgrp; ! register int fd; ! newpgrp = setpgrp(0, getpid()); ! if ((fd = open(_PATH_TTY, 2)) >= 0) ! { (void) ioctl(fd, TIOCNOTTY, (char*)0); (void) close(fd); ! } ! if ((fd = open(_PATH_DEVNULL, O_RDWR, 0)) != -1) ! { ! (void)dup2(fd, 0); ! (void)dup2(fd, 1); ! (void)dup2(fd, 2); ! if (fd > 2) ! (void)close(fd); ! } return newpgrp; } diff -c -r /tmp/cron/compat.h cron/compat.h *** /tmp/cron/compat.h Fri Jun 18 19:37:52 1999 --- cron/compat.h Tue Jun 15 20:32:58 1999 *************** *** 20,137 **** */ #ifndef __P ! # ifdef __STDC__ ! # define __P(x) x ! # else ! # define __P(x) () ! # define const ! # endif #endif - #if defined(UNIXPC) || defined(unixpc) - # define UNIXPC 1 - # define ATT 1 - #endif - - #if defined(hpux) || defined(_hpux) || defined(__hpux) - # define HPUX 1 - # define seteuid(e) setresuid(-1,e,-1) - # define setreuid(r,e) setresuid(r,e,-1) - #endif - - #if defined(_IBMR2) - # define AIX 1 - #endif - - #if defined(__convex__) - # define CONVEX 1 - #endif - - #if defined(sgi) || defined(_sgi) || defined(__sgi) - # define IRIX 1 - /* IRIX 4 hdrs are broken: one cannot #include both - * and because they disagree on system(), perror(). - * Therefore we must zap the "const" keyword BEFORE including - * either of them. - */ - # define const - #endif - - #if defined(_UNICOS) - # define UNICOS 1 - #endif - - #ifndef POSIX - # if (BSD >= 199103) || defined(__linux) || defined(ultrix) || defined(AIX) ||\ - defined(HPUX) || defined(CONVEX) || defined(IRIX) - # define POSIX - # endif - #endif - - #ifndef BSD - # if defined(ultrix) - # define BSD 198902 - # endif - #endif - /*****************************************************************/ ! #if !defined(BSD) && !defined(HPUX) && !defined(CONVEX) && !defined(__linux) ! # define NEED_VFORK ! #endif ! ! #if (!defined(BSD) || (BSD < 198902)) && !defined(__linux) && \ ! !defined(IRIX) && !defined(NeXT) && !defined(HPUX) ! # define NEED_STRCASECMP ! #endif ! ! #if (!defined(BSD) || (BSD < 198911)) && !defined(__linux) &&\ ! !defined(IRIX) && !defined(UNICOS) && !defined(HPUX) ! # define NEED_STRDUP ! #endif ! ! #if (!defined(BSD) || (BSD < 198911)) && !defined(POSIX) && !defined(NeXT) ! # define NEED_STRERROR ! #endif ! ! #if defined(HPUX) || defined(AIX) || defined(UNIXPC) ! # define NEED_FLOCK ! #endif ! ! #ifndef POSIX ! # define NEED_SETSID ! #endif ! ! #if (defined(POSIX) && !defined(BSD)) && !defined(__linux) ! # define NEED_GETDTABLESIZE ! #endif ! ! #if (BSD >= 199103) ! # define HAVE_SAVED_UIDS ! #endif ! ! #if !defined(ATT) && !defined(__linux) && !defined(IRIX) && !defined(UNICOS) ! # define USE_SIGCHLD ! #endif ! ! #if !defined(AIX) && !defined(UNICOS) ! # define SYS_TIME_H 1 ! #else ! # define SYS_TIME_H 0 ! #endif ! ! #if defined(BSD) && !defined(POSIX) ! # define USE_UTIMES ! #endif ! ! #if defined(AIX) || defined(HPUX) || defined(IRIX) ! # define NEED_SETENV ! #endif ! ! #if !defined(UNICOS) && !defined(UNIXPC) ! # define HAS_FCHOWN ! #endif ! ! #if !defined(UNICOS) && !defined(UNIXPC) ! # define HAS_FCHMOD ! #endif --- 20,31 ---- */ #ifndef __P ! #define __P(x) () ! #define const #endif /*****************************************************************/ ! #define WAIT_T union wait ! #define PID_T pid_t ! #define TIME_T time_t diff -c -r /tmp/cron/cron.c cron/cron.c *** /tmp/cron/cron.c Fri Jun 18 19:37:52 1999 --- cron/cron.c Tue Jun 15 21:11:15 1999 *************** *** 25,45 **** #include "cron.h" #include ! #if SYS_TIME_H ! # include ! #else ! # include ! #endif - static void usage __P((void)), run_reboot_jobs __P((cron_db *)), cron_tick __P((cron_db *)), cron_sync __P((void)), cron_sleep __P((void)), - #ifdef USE_SIGCHLD sigchld_handler __P((int)), - #endif sighup_handler __P((int)), parse_args __P((int c, char *v[])); --- 25,38 ---- #include "cron.h" #include ! #include static void usage __P((void)), run_reboot_jobs __P((cron_db *)), cron_tick __P((cron_db *)), cron_sync __P((void)), cron_sleep __P((void)), sigchld_handler __P((int)), sighup_handler __P((int)), parse_args __P((int c, char *v[])); *************** *** 60,77 **** ProgramName = argv[0]; - #if defined(BSD) setlinebuf(stdout); setlinebuf(stderr); - #endif parse_args(argc, argv); - #ifdef USE_SIGCHLD (void) signal(SIGCHLD, sigchld_handler); - #else - (void) signal(SIGCLD, SIG_IGN); - #endif (void) signal(SIGHUP, sighup_handler); acquire_daemonlock(0); --- 53,64 ---- *************** *** 78,86 **** set_cron_uid(); set_cron_cwd(); - #if defined(POSIX) setenv("PATH", _PATH_DEFPATH, 1); - #endif /* if there are no debug flags turned on, fork as a daemon should. */ --- 65,71 ---- *************** *** 244,250 **** } - #ifdef USE_SIGCHLD static void sigchld_handler(x) { WAIT_T waiter; --- 229,234 ---- *************** *** 251,261 **** PID_T pid; for (;;) { - #ifdef POSIX pid = waitpid(-1, &waiter, WNOHANG); - #else - pid = wait3(&waiter, WNOHANG, (struct rusage *)0); - #endif switch (pid) { case -1: Debug(DPROC, --- 235,241 ---- *************** *** 272,279 **** } } } - #endif /*USE_SIGCHLD*/ - static void sighup_handler(x) { --- 252,257 ---- diff -c -r /tmp/cron/cron.h cron/cron.h *** /tmp/cron/cron.h Fri Jun 18 19:37:52 1999 --- cron/cron.h Tue Jun 15 20:31:36 1999 *************** *** 112,119 **** ; #endif /* DEBUGGING */ - #define MkLower(ch) (isupper(ch) ? tolower(ch) : ch) - #define MkUpper(ch) (islower(ch) ? toupper(ch) : ch) #define Set_LineNum(ln) {Debug(DPARS|DEXT,("linenum=%d\n",ln)); \ LineNumber = ln; \ } --- 112,117 ---- diff -c -r /tmp/cron/crontab.c cron/crontab.c *** /tmp/cron/crontab.c Fri Jun 18 19:48:38 1999 --- cron/crontab.c Tue Jun 15 21:11:42 1999 *************** *** 33,52 **** #include #include #include ! #ifdef USE_UTIMES ! # include ! #else ! # include ! # include ! #endif ! #if defined(POSIX) ! # include ! #endif - #define NHEADER_LINES 3 - enum opt_t { opt_unknown, opt_list, opt_delete, opt_edit, opt_replace }; #if DEBUGGING --- 33,42 ---- #include #include #include ! #include #define NHEADER_LINES 3 enum opt_t { opt_unknown, opt_list, opt_delete, opt_edit, opt_replace }; #if DEBUGGING *************** *** 95,107 **** Pid = getpid(); ProgramName = argv[0]; - #if defined(POSIX) - setlocale(LC_ALL, ""); - #endif - - #if defined(BSD) setlinebuf(stderr); ! #endif parse_args(argc, argv); /* sets many globals, opens a file */ set_cron_uid(); set_cron_cwd(); --- 85,92 ---- Pid = getpid(); ProgramName = argv[0]; setlinebuf(stderr); ! parse_args(argc, argv); /* sets many globals, opens a file */ set_cron_uid(); set_cron_cwd(); *************** *** 242,248 **** static void list_cmd() { char n[MAX_FNAME]; ! FILE *f; int ch; log_it(RealUser, Pid, "LIST", User); --- 227,233 ---- static void list_cmd() { char n[MAX_FNAME]; ! register FILE *f; int ch; log_it(RealUser, Pid, "LIST", User); *************** *** 293,300 **** static void edit_cmd() { char n[MAX_FNAME], q[MAX_TEMPSTR], *editor; ! FILE *f; ! int ch, t, x; struct stat statbuf; time_t mtime; WAIT_T waiter; --- 278,286 ---- static void edit_cmd() { char n[MAX_FNAME], q[MAX_TEMPSTR], *editor; ! register FILE *f; ! register int ch; ! int t, x; struct stat statbuf; time_t mtime; WAIT_T waiter; *************** *** 320,330 **** perror(Filename); goto fatal; } - #ifdef HAS_FCHOWN if (fchown(t, getuid(), getgid()) < 0) { - #else - if (chown(Filename, getuid(), getgid()) < 0) { - #endif perror("fchown"); goto fatal; } --- 306,312 ---- *************** *** 490,497 **** static int replace_cmd() { char n[MAX_FNAME], envstr[MAX_ENVSTR], tn[MAX_FNAME]; ! FILE *tmp; ! int ch, eof; entry *e; time_t now = time(NULL); char **envp = env_init(); --- 472,480 ---- static int replace_cmd() { char n[MAX_FNAME], envstr[MAX_ENVSTR], tn[MAX_FNAME]; ! register FILE *tmp; ! register int ch; ! int eof; entry *e; time_t now = time(NULL); char **envp = env_init(); *************** *** 557,583 **** return (-1); } - #ifdef HAS_FCHOWN if (fchown(fileno(tmp), ROOT_UID, -1) < OK) ! #else ! if (chown(tn, ROOT_UID, -1) < OK) ! #endif ! { perror("chown"); fclose(tmp); unlink(tn); return (-2); ! } - #ifdef HAS_FCHMOD if (fchmod(fileno(tmp), 0600) < OK) ! #else ! if (chmod(tn, 0600) < OK) ! #endif ! { perror("chown"); fclose(tmp); unlink(tn); return (-2); ! } if (fclose(tmp) == EOF) { perror("fclose"); --- 540,558 ---- return (-1); } if (fchown(fileno(tmp), ROOT_UID, -1) < OK) ! { perror("chown"); fclose(tmp); unlink(tn); return (-2); ! } if (fchmod(fileno(tmp), 0600) < OK) ! { perror("chown"); fclose(tmp); unlink(tn); return (-2); ! } if (fclose(tmp) == EOF) { perror("fclose"); *************** *** 603,613 **** static void poke_daemon() { - #ifdef USE_UTIMES struct timeval tvs[2]; - struct timezone tz; ! (void) gettimeofday(&tvs[0], &tz); tvs[1] = tvs[0]; if (utimes(SPOOL_DIR, tvs) < OK) { fprintf(stderr, "crontab: can't update mtime on spooldir\n"); --- 578,586 ---- static void poke_daemon() { struct timeval tvs[2]; ! (void) gettimeofday(&tvs[0], NULL); tvs[1] = tvs[0]; if (utimes(SPOOL_DIR, tvs) < OK) { fprintf(stderr, "crontab: can't update mtime on spooldir\n"); *************** *** 614,624 **** perror(SPOOL_DIR); return; } - #else - if (utime(SPOOL_DIR, NULL) < OK) { - fprintf(stderr, "crontab: can't update mtime on spooldir\n"); - perror(SPOOL_DIR); - return; - } - #endif /*USE_UTIMES*/ } --- 587,590 ---- diff -c -r /tmp/cron/database.c cron/database.c *** /tmp/cron/database.c Fri Jun 18 19:37:52 1999 --- cron/database.c Sat Jun 12 16:04:08 1999 *************** *** 44,50 **** DIR *dir; struct stat statbuf; struct stat syscron_stat; ! DIR_T *dp; cron_db new_db; user *u, *nu; --- 44,50 ---- DIR *dir; struct stat statbuf; struct stat syscron_stat; ! register DIR_T *dp; cron_db new_db; user *u, *nu; *************** *** 145,152 **** void link_user(db, u) ! cron_db *db; ! user *u; { if (db->head == NULL) db->head = u; --- 145,152 ---- void link_user(db, u) ! register cron_db *db; ! register user *u; { if (db->head == NULL) db->head = u; *************** *** 160,167 **** void unlink_user(db, u) ! cron_db *db; ! user *u; { if (u->prev == NULL) db->head = u->next; --- 160,167 ---- void unlink_user(db, u) ! register cron_db *db; ! register user *u; { if (u->prev == NULL) db->head = u->next; *************** *** 178,187 **** user * find_user(db, name) cron_db *db; ! char *name; { char *env_get(); ! user *u; for (u = db->head; u != NULL; u = u->next) if (!strcmp(u->name, name)) --- 178,187 ---- user * find_user(db, name) cron_db *db; ! register char *name; { char *env_get(); ! register user *u; for (u = db->head; u != NULL; u = u->next) if (!strcmp(u->name, name)) *************** *** 201,207 **** { struct passwd *pw = NULL; int crontab_fd = OK - 1; ! user *u; if (strcmp(fname, "*system*") && !(pw = getpwnam(uname))) { /* file doesn't have a user in passwd file. --- 201,207 ---- { struct passwd *pw = NULL; int crontab_fd = OK - 1; ! register user *u; if (strcmp(fname, "*system*") && !(pw = getpwnam(uname))) { /* file doesn't have a user in passwd file. diff -c -r /tmp/cron/do_command.c cron/do_command.c *** /tmp/cron/do_command.c Fri Jun 18 19:37:56 1999 --- cron/do_command.c Tue Jun 15 21:24:29 1999 *************** *** 19,39 **** static char rcsid[] = "$Id: do_command.c,v 2.12 1994/01/15 20:43:43 vixie Exp $"; #endif - #include "cron.h" #include - #if defined(sequent) - # include - #endif #if defined(SYSLOG) # include #endif - static void child_process __P((entry *, user *)), - do_univ __P((user *)); - - void do_command(e, u) entry *e; --- 19,32 ---- static char rcsid[] = "$Id: do_command.c,v 2.12 1994/01/15 20:43:43 vixie Exp $"; #endif #include "cron.h" #include #if defined(SYSLOG) # include #endif + static void child_process __P((entry *, user *)); void do_command(e, u) entry *e; *************** *** 76,82 **** int stdin_pipe[2], stdout_pipe[2]; register char *input_data; char *usernm, *mailto; ! int children = 0; Debug(DPROC, ("[%d] child_process('%s')\n", getpid(), e->cmd)) --- 69,76 ---- int stdin_pipe[2], stdout_pipe[2]; register char *input_data; char *usernm, *mailto; ! register int ch; ! int children = 0, escaped; Debug(DPROC, ("[%d] child_process('%s')\n", getpid(), e->cmd)) *************** *** 83,101 **** /* mark ourselves as different to PS command watchers by upshifting * our program name. This has no effect on some kernels. */ ! /*local*/{ ! register char *pch; - for (pch = ProgramName; *pch; pch++) - *pch = MkUpper(*pch); - } - /* discover some useful and important environment settings */ usernm = env_get("LOGNAME", e->envp); mailto = env_get("MAILTO", e->envp); - #ifdef USE_SIGCHLD /* our parent is watching for our death by catching SIGCHLD. we * do not care to watch for our children's deaths this way -- we * use wait() explictly. so we have to disable the signal (which --- 77,90 ---- /* mark ourselves as different to PS command watchers by upshifting * our program name. This has no effect on some kernels. */ ! for (input_data = ProgramName; ch = *input_data; input_data++) ! *input_data = (islower(ch) ? toupper(ch) : ch); /* discover some useful and important environment settings */ usernm = env_get("LOGNAME", e->envp); mailto = env_get("MAILTO", e->envp); /* our parent is watching for our death by catching SIGCHLD. we * do not care to watch for our children's deaths this way -- we * use wait() explictly. so we have to disable the signal (which *************** *** 102,114 **** * was inherited from the parent). */ (void) signal(SIGCHLD, SIG_IGN); - #else - /* on system-V systems, we are ignoring SIGCLD. we have to stop - * ignoring it now or the wait() in cron_pclose() won't work. - * because of this, we have to wait() for our children here, as well. - */ - (void) signal(SIGCLD, SIG_DFL); - #endif /*BSD*/ /* create some pipes to talk to our future child */ --- 91,96 ---- *************** *** 123,146 **** * the command. Subsequent %'s will be transformed into newlines, * but that happens later. */ ! /*local*/{ ! register int escaped = FALSE; ! register int ch; ! ! for (input_data = e->cmd; ch = *input_data; input_data++) { ! if (escaped) { ! escaped = FALSE; ! continue; ! } ! if (ch == '\\') { ! escaped = TRUE; ! continue; ! } ! if (ch == '%') { ! *input_data++ = '\0'; ! break; ! } } } /* fork again, this time so we can exec the user's command. --- 105,124 ---- * the command. Subsequent %'s will be transformed into newlines, * but that happens later. */ ! escaped = FALSE; ! for (input_data = e->cmd; ch = *input_data; input_data++) { ! if (escaped) { ! escaped = FALSE; ! continue; } + if (ch == '\\') { + escaped = TRUE; + continue; + } + if (ch == '%') { + *input_data++ = '\0'; + break; + } } /* fork again, this time so we can exec the user's command. *************** *** 197,215 **** close(stdin_pipe[READ_PIPE]); close(stdout_pipe[WRITE_PIPE]); - /* set our login universe. Do this in the grandchild - * so that the child can invoke /usr/lib/sendmail - * without surprises. - */ - do_univ(u); - /* set our directory, uid and gid. Set gid first, since once * we set uid, we've lost root privledges. */ setgid(e->gid); - # if defined(BSD) initgroups(env_get("LOGNAME", e->envp), e->gid); - # endif setuid(e->uid); /* we aren't root after this... */ chdir(env_get("HOME", e->envp)); --- 175,185 ---- *************** *** 460,501 **** Debug(DPROC, (", dumped core")) Debug(DPROC, ("\n")) } - } - - - static void - do_univ(u) - user *u; - { - #if defined(sequent) - /* Dynix (Sequent) hack to put the user associated with - * the passed user structure into the ATT universe if - * necessary. We have to dig the gecos info out of - * the user's password entry to see if the magic - * "universe(att)" string is present. - */ - - struct passwd *p; - char *s; - int i; - - p = getpwuid(u->uid); - (void) endpwent(); - - if (p == NULL) - return; - - s = p->pw_gecos; - - for (i = 0; i < 4; i++) - { - if ((s = strchr(s, ',')) == NULL) - return; - s++; - } - if (strcmp(s, "universe(att)")) - return; - - (void) universe(U_ATT); - #endif } --- 430,433 ---- diff -c -r /tmp/cron/entry.c cron/entry.c *** /tmp/cron/entry.c Fri Jun 18 19:37:56 1999 --- cron/entry.c Tue Jun 15 21:11:55 1999 *************** *** 55,61 **** void free_entry(e) ! entry *e; { free(e->cmd); env_free(e->envp); --- 55,61 ---- void free_entry(e) ! register entry *e; { free(e->cmd); env_free(e->envp); *************** *** 70,76 **** load_entry(file, error_func, pw, envp) FILE *file; void (*error_func)(); ! struct passwd *pw; char **envp; { /* this function reads one crontab entry -- the next -- from a file. --- 70,76 ---- load_entry(file, error_func, pw, envp) FILE *file; void (*error_func)(); ! register struct passwd *pw; char **envp; { /* this function reads one crontab entry -- the next -- from a file. *************** *** 87,93 **** */ ecode_e ecode = e_none; ! entry *e; int ch; char cmd[MAX_COMMAND]; char envstr[MAX_ENVSTR]; --- 87,93 ---- */ ecode_e ecode = e_none; ! register entry *e; int ch; char cmd[MAX_COMMAND]; char envstr[MAX_ENVSTR]; *************** *** 262,271 **** } sprintf(envstr, "%s=%s", "LOGNAME", pw->pw_name); e->envp = env_set(e->envp, envstr); - #if defined(BSD) sprintf(envstr, "%s=%s", "USER", pw->pw_name); e->envp = env_set(e->envp, envstr); - #endif Debug(DPARS, ("load_entry()...about to parse command\n")) --- 262,269 ---- *************** *** 309,315 **** int low, high; /* bounds, impl. offset for bitstr */ char *names[]; /* NULL or *[] of names for these elements */ int ch; /* current character being processed */ ! FILE *file; /* file being read */ { register int done; --- 307,313 ---- int low, high; /* bounds, impl. offset for bitstr */ char *names[]; /* NULL or *[] of names for these elements */ int ch; /* current character being processed */ ! register FILE *file; /* file being read */ { register int done; *************** *** 355,361 **** bitstr_t *bits; /* one bit per flag, default=FALSE */ int low, high; /* bounds, impl. offset for bitstr */ char *names[]; /* NULL or names of elements */ ! int ch; /* current character being processed */ FILE *file; /* file being read */ { /* range = number | number "-" number [ "/" number ] --- 353,359 ---- bitstr_t *bits; /* one bit per flag, default=FALSE */ int low, high; /* bounds, impl. offset for bitstr */ char *names[]; /* NULL or names of elements */ ! register int ch; /* current character being processed */ FILE *file; /* file being read */ { /* range = number | number "-" number [ "/" number ] *************** *** 440,446 **** int *numptr; /* where does the result go? */ int low; /* offset applied to result if symbolic enum used */ char *names[]; /* symbolic names, if any, for enums */ ! int ch; /* current character */ FILE *file; /* source */ { char temp[MAX_TEMPSTR], *pc; --- 438,444 ---- int *numptr; /* where does the result go? */ int low; /* offset applied to result if symbolic enum used */ char *names[]; /* symbolic names, if any, for enums */ ! register int ch; /* current character */ FILE *file; /* source */ { char temp[MAX_TEMPSTR], *pc; diff -c -r /tmp/cron/env.c cron/env.c *** /tmp/cron/env.c Fri Jun 18 19:48:38 1999 --- cron/env.c Sat Jun 12 16:11:43 1999 *************** *** 37,43 **** env_free(envp) char **envp; { ! char **p; for (p = envp; *p; p++) free(*p); --- 37,43 ---- env_free(envp) char **envp; { ! register char **p; for (p = envp; *p; p++) free(*p); *************** *** 47,53 **** char ** env_copy(envp) ! register char **envp; { register int count, i; register char **p; --- 47,53 ---- char ** env_copy(envp) ! char **envp; { register int count, i; register char **p; *************** *** 162,169 **** char * env_get(name, envp) ! register char *name; ! register char **envp; { register int len = strlen(name); register char *p, *q; --- 162,169 ---- char * env_get(name, envp) ! char *name; ! char **envp; { register int len = strlen(name); register char *p, *q; diff -c -r /tmp/cron/externs.h cron/externs.h *** /tmp/cron/externs.h Fri Jun 18 19:37:52 1999 --- cron/externs.h Tue Jun 15 20:32:34 1999 *************** *** 15,145 **** * Paul Vixie uunet!decwrl!vixie!paul */ ! #if defined(POSIX) || defined(ATT) ! # include ! # include ! # include ! # include ! # define DIR_T struct dirent ! # define WAIT_T int ! # define WAIT_IS_INT 1 ! extern char *tzname[2]; ! # define TZONE(tm) tzname[(tm).tm_isdst] ! #endif ! #if defined(UNIXPC) ! # undef WAIT_T ! # undef WAIT_IS_INT ! # define WAIT_T union wait ! #endif - #if defined(POSIX) - # define SIG_T sig_t - # define TIME_T time_t - # define PID_T pid_t - #endif - - #if defined(ATT) - # define SIG_T void - # define TIME_T long - # define PID_T int - #endif - - #if !defined(POSIX) && !defined(ATT) - /* classic BSD */ - extern time_t time(); - extern unsigned sleep(); - extern struct tm *localtime(); - extern struct passwd *getpwnam(); - extern int errno; - extern void perror(), exit(), free(); - extern char *getenv(), *strcpy(), *strchr(), *strtok(); - extern void *malloc(), *realloc(); - # define SIG_T void - # define TIME_T long - # define PID_T int - # define WAIT_T union wait - # define DIR_T struct direct - # include - # define TZONE(tm) (tm).tm_zone - #endif - - /* getopt() isn't part of POSIX. some systems define it in anyway. - * of those that do, some complain that our definition is different and some - * do not. to add to the misery and confusion, some systems define getopt() - * in ways that we cannot predict or comprehend, yet do not define the adjunct - * external variables needed for the interface. - */ - #if (!defined(BSD) || (BSD < 198911)) && !defined(ATT) && !defined(UNICOS) - int getopt __P((int, char * const *, const char *)); - #endif - - #if (!defined(BSD) || (BSD < 199103)) - extern char *optarg; - extern int optind, opterr, optopt; - #endif - - #if WAIT_IS_INT - # ifndef WEXITSTATUS - # define WEXITSTATUS(x) (((x) >> 8) & 0xff) - # endif - # ifndef WTERMSIG - # define WTERMSIG(x) ((x) & 0x7f) - # endif - # ifndef WCOREDUMP - # define WCOREDUMP(x) ((x) & 0x80) - # endif - #else /*WAIT_IS_INT*/ - # ifndef WEXITSTATUS - # define WEXITSTATUS(x) ((x).w_retcode) - # endif - # ifndef WTERMSIG - # define WTERMSIG(x) ((x).w_termsig) - # endif - # ifndef WCOREDUMP - # define WCOREDUMP(x) ((x).w_coredump) - # endif - #endif /*WAIT_IS_INT*/ - - #ifndef WIFSIGNALED - #define WIFSIGNALED(x) (WTERMSIG(x) != 0) - #endif - #ifndef WIFEXITED - #define WIFEXITED(x) (WTERMSIG(x) == 0) - #endif - - #ifdef NEED_STRCASECMP - extern int strcasecmp __P((char *, char *)); - #endif - - #ifdef NEED_STRDUP - extern char *strdup __P((char *)); - #endif - - #ifdef NEED_STRERROR - extern char *strerror __P((int)); - #endif - - #ifdef NEED_FLOCK - extern int flock __P((int, int)); - # define LOCK_SH 1 - # define LOCK_EX 2 - # define LOCK_NB 4 - # define LOCK_UN 8 - #endif - - #ifdef NEED_SETSID extern int setsid __P((void)); - #endif - - #ifdef NEED_GETDTABLESIZE - extern int getdtablesize __P((void)); - #endif - - #ifdef NEED_SETENV - extern int setenv __P((char *, char *, int)); - #endif - - #ifdef NEED_VFORK - extern PID_T vfork __P((void)); - #endif --- 15,28 ---- * Paul Vixie uunet!decwrl!vixie!paul */ ! #include ! #include ! #include ! #include ! #define DIR_T struct direct ! #define WEXITSTATUS(x) ((x).w_retcode) ! #define WTERMSIG(x) ((x).w_termsig) ! #define WCOREDUMP(x) ((x).w_coredump) extern int setsid __P((void)); diff -c -r /tmp/cron/misc.c cron/misc.c *** /tmp/cron/misc.c Fri Jun 18 19:37:56 1999 --- cron/misc.c Fri Jun 18 20:55:14 1999 *************** *** 25,35 **** #include "cron.h" ! #if SYS_TIME_H ! # include ! #else ! # include ! #endif #include #include #include --- 25,31 ---- #include "cron.h" ! #include #include #include #include *************** *** 44,57 **** #define LOG_CRON LOG_DAEMON #endif - static int LogFD = ERR; - int strcmp_until(left, right, until) ! char *left; ! char *right; int until; { register int diff; --- 40,51 ---- #define LOG_CRON LOG_DAEMON #endif static int LogFD = ERR; int strcmp_until(left, right, until) ! register char *left; ! register char *right; int until; { register int diff; *************** *** 76,84 **** */ int strdtb(s) ! char *s; { ! char *x = s; /* scan forward to the null */ --- 70,78 ---- */ int strdtb(s) ! register char *s; { ! register char *x = s; /* scan forward to the null */ *************** *** 120,126 **** #else /* DEBUGGING */ ! char *pc = flags; DebugFlags = 0; --- 114,120 ---- #else /* DEBUGGING */ ! register char *pc = flags; DebugFlags = 0; *************** *** 173,189 **** void set_cron_uid() { - #if defined(BSD) || defined(POSIX) if (seteuid(ROOT_UID) < OK) { perror("seteuid"); exit(ERROR_EXIT); } - #else - if (setuid(ROOT_UID) < OK) { - perror("setuid"); - exit(ERROR_EXIT); - } - #endif } --- 167,176 ---- *************** *** 302,310 **** */ int get_char(file) ! FILE *file; { ! int ch; ch = getc(file); if (ch == '\n') --- 289,297 ---- */ int get_char(file) ! register FILE *file; { ! register int ch; ch = getc(file); if (ch == '\n') *************** *** 317,324 **** */ void unget_char(ch, file) ! int ch; ! FILE *file; { ungetc(ch, file); if (ch == '\n') --- 304,311 ---- */ void unget_char(ch, file) ! register int ch; ! register FILE *file; { ungetc(ch, file); if (ch == '\n') *************** *** 334,345 **** */ int get_string(string, size, file, terms) ! char *string; int size; FILE *file; char *terms; { ! int ch; while (EOF != (ch = get_char(file)) && !strchr(terms, ch)) { if (size > 1) { --- 321,332 ---- */ int get_string(string, size, file, terms) ! register char *string; int size; FILE *file; char *terms; { ! register int ch; while (EOF != (ch = get_char(file)) && !strchr(terms, ch)) { if (size > 1) { *************** *** 359,367 **** */ void skip_comments(file) ! FILE *file; { ! int ch; while (EOF != (ch = get_char(file))) { /* ch is now the first character of a line. --- 346,354 ---- */ void skip_comments(file) ! register FILE *file; { ! register int ch; while (EOF != (ch = get_char(file))) { /* ch is now the first character of a line. *************** *** 475,481 **** #if defined(LOG_FILE) /* we assume that MAX_TEMPSTR will hold the date, time, &punctuation. */ ! msg = malloc(strlen(username) + strlen(event) + strlen(detail) + MAX_TEMPSTR); --- 462,468 ---- #if defined(LOG_FILE) /* we assume that MAX_TEMPSTR will hold the date, time, &punctuation. */ ! msg = (char *)malloc(strlen(username) + strlen(event) + strlen(detail) + MAX_TEMPSTR); *************** *** 518,528 **** * our client may not be our own. therefore we want to * print the pid ourselves. */ - # ifdef LOG_DAEMON openlog(ProgramName, LOG_PID, LOG_CRON); - # else - openlog(ProgramName, LOG_PID); - # endif syslog_open = TRUE; /* assume openlog success */ } --- 505,511 ---- *************** *** 555,561 **** char * first_word(s, t) register char *s; /* string we want the first word of */ ! register char *t; /* terminators, implicitly including \0 */ { static char retbuf[2][MAX_TEMPSTR + 1]; /* sure wish C had GC */ static int retsel = 0; --- 538,544 ---- char * first_word(s, t) register char *s; /* string we want the first word of */ ! char *t; /* terminators, implicitly including \0 */ { static char retbuf[2][MAX_TEMPSTR + 1]; /* sure wish C had GC */ static int retsel = 0; *************** *** 617,626 **** */ char * mkprints(src, len) ! register unsigned char *src; ! register unsigned int len; { ! register char *dst = malloc(len*4 + 1); mkprint(dst, src, len); --- 600,609 ---- */ char * mkprints(src, len) ! unsigned char *src; ! unsigned int len; { ! register char *dst = (char *)malloc(len*4 + 1); mkprint(dst, src, len); *************** *** 653,664 **** } #endif /*MAIL_DATE*/ - - #ifdef HAVE_SAVED_SUIDS static int save_euid; ! int swap_uids() { save_euid = geteuid(); return seteuid(getuid()); } ! int swap_uids_back() { return seteuid(save_euid); } ! #else /*HAVE_SAVED_UIDS*/ ! int swap_uids() { return setreuid(geteuid(), getuid()); } ! int swap_uids_back() { return swap_uids(); } ! #endif /*HAVE_SAVED_UIDS*/ --- 636,649 ---- } #endif /*MAIL_DATE*/ static int save_euid; ! int swap_uids() ! { ! save_euid = geteuid(); ! return(seteuid(getuid())); ! } ! ! int swap_uids_back() ! { ! return(seteuid(save_euid)); ! } diff -c -r /tmp/cron/pathnames.h cron/pathnames.h *** /tmp/cron/pathnames.h Fri Jun 18 19:37:52 1999 --- cron/pathnames.h Fri Jun 18 20:56:50 1999 *************** *** 19,27 **** * $Id: pathnames.h,v 1.3 1994/01/15 20:43:43 vixie Exp $ */ ! #if (defined(BSD)) && (BSD >= 199103) || defined(__linux) || defined(AIX) ! # include ! #endif /*BSD*/ #ifndef CRONDIR /* CRONDIR is where crond(8) and crontab(1) both chdir --- 19,25 ---- * $Id: pathnames.h,v 1.3 1994/01/15 20:43:43 vixie Exp $ */ ! #include #ifndef CRONDIR /* CRONDIR is where crond(8) and crontab(1) both chdir *************** *** 49,55 **** */ #define ALLOW_FILE "allow" /*-*/ #define DENY_FILE "deny" /*-*/ ! #define LOG_FILE "log" /*-*/ /* where should the daemon stick its PID? */ --- 47,53 ---- */ #define ALLOW_FILE "allow" /*-*/ #define DENY_FILE "deny" /*-*/ ! #undef LOG_FILE /* "log" */ /* where should the daemon stick its PID? */ diff -c -r /tmp/cron/putman.sh cron/putman.sh *** /tmp/cron/putman.sh Fri Jun 18 19:37:52 1999 --- cron/putman.sh Tue Jun 15 21:04:25 1999 *************** *** 9,23 **** DIR=$2 SECT=`expr $PAGE : '[a-z]*.\([0-9]\)'` ! [ -d $DIR/man$SECT ] && { ! set -x ! cp $PAGE $DIR/man$SECT/$PAGE ! set +x ! } || { ! set -x ! nroff -man $PAGE >$DIR/cat$SECT/`basename $PAGE .$SECT`.0 ! set +x ! } exit 0 --- 9,26 ---- DIR=$2 SECT=`expr $PAGE : '[a-z]*.\([0-9]\)'` + MDIR="$DIR/cat$SECT" + DEST="$MDIR/`basename $PAGE .$SECT`.0" ! set -x ! if [ ! -d $MDIR ]; then ! rm -f $MDIR ! mkdir -p $MDIR ! chmod 755 $MDIR ! fi ! ! nroff -man $PAGE >$DEST ! chmod 444 $DEST ! set +x exit 0 diff -c -r /tmp/cron/user.c cron/user.c *** /tmp/cron/user.c Fri Jun 18 19:37:52 1999 --- cron/user.c Sat Jun 12 16:16:24 1999 *************** *** 30,36 **** free_user(u) user *u; { ! entry *e, *ne; free(u->name); for (e = u->crontab; e != NULL; e = ne) { --- 30,36 ---- free_user(u) user *u; { ! register entry *e, *ne; free(u->name); for (e = u->crontab; e != NULL; e = ne) { *************** *** 49,56 **** { char envstr[MAX_ENVSTR]; FILE *file; ! user *u; ! entry *e; int status; char **envp; --- 49,56 ---- { char envstr[MAX_ENVSTR]; FILE *file; ! register user *u; ! register entry *e; int status; char **envp;