diff options
| author | cgd <cgd@NetBSD.org> | 1993-05-28 08:33:52 +0000 |
|---|---|---|
| committer | cgd <cgd@NetBSD.org> | 1993-05-28 08:33:52 +0000 |
| commit | 9eccc35a441f05be99a9e66386296e87e0ee42e8 (patch) | |
| tree | 0c58cd51349767d244dbbb9864de9a9f8f6d6ba3 /libexec | |
| parent | 01eda6ff104c2e137a951d3978b6c03ec7e4abae (diff) | |
update for newest version of vixie's cron, as of May 27 1993
Diffstat (limited to 'libexec')
| -rw-r--r-- | libexec/crond/CHANGES.V2 | 36 | ||||
| -rw-r--r-- | libexec/crond/CONVERSION | 85 | ||||
| -rw-r--r-- | libexec/crond/FEATURES | 88 | ||||
| -rw-r--r-- | libexec/crond/INSTALL | 69 | ||||
| -rw-r--r-- | libexec/crond/MANIFEST | 30 | ||||
| -rw-r--r-- | libexec/crond/Makefile.vixie | 27 | ||||
| -rw-r--r-- | libexec/crond/README | 45 | ||||
| -rw-r--r-- | libexec/crond/arpadate.c | 27 | ||||
| -rw-r--r-- | libexec/crond/config.h | 58 | ||||
| -rw-r--r-- | libexec/crond/cron.h | 17 | ||||
| -rw-r--r-- | libexec/crond/crond.8 | 2 | ||||
| -rw-r--r-- | libexec/crond/crond.c | 8 | ||||
| -rw-r--r-- | libexec/crond/database.c | 24 | ||||
| -rw-r--r-- | libexec/crond/do_command.c | 77 | ||||
| -rw-r--r-- | libexec/crond/entry.c | 2 | ||||
| -rw-r--r-- | libexec/crond/env.c | 3 | ||||
| -rw-r--r-- | libexec/crond/job.c | 2 | ||||
| -rw-r--r-- | libexec/crond/misc.c | 74 | ||||
| -rw-r--r-- | libexec/crond/user.c | 4 |
19 files changed, 553 insertions, 125 deletions
diff --git a/libexec/crond/CHANGES.V2 b/libexec/crond/CHANGES.V2 new file mode 100644 index 00000000000..0dd239517d1 --- /dev/null +++ b/libexec/crond/CHANGES.V2 @@ -0,0 +1,36 @@ +Vixie Cron Changes from V1 to V2 +Paul Vixie +8-Feb-1988 + +Many changes were made in a rash of activity about six months ago, the exact +list of which is no longer clear in my memory. I know that V1 used a file +called POKECRON in /usr/spool/cron to tell it that it was time to re-read +all the crontab files; V2 uses the modtime the crontab directory as a flag to +check out the crontab files; those whose modtime has changed will be re-read, +and the others left alone. Note that the crontab(1) command will do a utimes +call to make sure the mtime of the dir changes, since the filename/inode will +often remain the same after a replacement and the mtime wouldn't change in +that case. + +8-Feb-88: made it possible to use much larger environment variable strings. + V1 allowed 100 characters; V2 allows 1000. This was needed for PATH + variables on some systems. Thanks to Toerless Eckert for this idea. + E-mail: UUCP: ...pyramid!fauern!faui10!eckert + +16-Feb-88: added allow/deny, moved /usr/spool/cron/crontabs to + /usr/lib/cron/tabs. allow and deny are /usr/lib/cron/{allow,deny}, + since the sysv naming for this depends on 'at' using the same + dir, which would be stupid (hint: use /usr/{lib,spool}/at). + +22-Feb-88: made it read the spool directory for crontabs and look each one + up using getpwnam() rather than reading all passwds with getpwent() + and trying to open each crontab. + +9-Dec-88: made it sync to :00 after the minute, makes cron predictable. + added logging to /var/cron/log. + +14-Apr-90: (actually, changes since December 1989) + fixed a number of bugs reported from the net and from John Gilmore. + added syslog per Keith Bostic. security features including not + being willing to run a command owned or writable by other than + the owner of the crontab 9not working well yet) diff --git a/libexec/crond/CONVERSION b/libexec/crond/CONVERSION new file mode 100644 index 00000000000..2c75542bd98 --- /dev/null +++ b/libexec/crond/CONVERSION @@ -0,0 +1,85 @@ +$Header: /cvsroot/src/libexec/crond/Attic/CONVERSION,v 1.1 1993/05/28 08:33:55 cgd Exp $ + +Conversion of BSD 4.[23] crontab files: + +Edit your current crontab (/usr/lib/crontab) into little pieces, with each +users' commands in a different file. This is different on 4.2 and 4.3, +but I'll get to that below. The biggest feature of this cron is that you +can move 'news' and 'uucp' cron commands into files owned and maintainable +by those two users. You also get to rip all the fancy 'su' footwork out +of the cron commands. On 4.3, there's no need for the 'su' stuff since the +user name appears on each command -- but I'd still rather have separate +crontabs with seperate environments and so on. + +Leave the original /usr/lib/crontab! This cron doesn't use it, so you may +as well keep it around for a while in case something goes wakko with this +fancy version. + +Most commands in most crontabs are run by root, have to run by root, and +should continue to be run by root. They still have to be in their own file; +I recommend /etc/crontab.src or /usr/adm/crontab.src. + +'uucp's commands need their own file; how about /usr/lib/uucp/crontab.src? +'news' also, perhaps in /usr/lib/news/crontab.src... + +I say `how about' and `perhaps' because it really doesn't matter to anyone +(except you) where you put the crontab source files. The `crontab' command +COPIES them into a protected directory (CRONDIR/SPOOL_DIR in cron.h), named +after the user whose crontab it is. If you want to examine, replace, or +delete a crontab, the `crontab' command does all of those things. The +various `crontab.src' (my suggested name for them) files are just source +files---they have to be copied to SPOOLDIR using `crontab' before they'll be +executed. + +On 4.2, your crontab might have a few lines like this: + + 5 * * * * su uucp < /usr/lib/uucp/uudemon.hr + 10 4 * * * su uucp < /usr/lib/uucp/uudemon.day + 15 5 * * 0 su uucp < /usr/lib/uucp/uudemon.wk + +...or like this: + + 5 * * * * echo /usr/lib/uucp/uudemon.hr | su uucp + 10 4 * * * echo /usr/lib/uucp/uudemon.day | su uucp + 15 5 * * 0 echo /usr/lib/uucp/uudemon.wk | su uucp + +On 4.3, they'd look a little bit better, but not much: + + 5 * * * * uucp /usr/lib/uucp/uudemon.hr + 10 4 * * * uucp /usr/lib/uucp/uudemon.day + 15 5 * * 0 uucp /usr/lib/uucp/uudemon.wk + +For this cron, you'd create /usr/lib/uucp/crontab.src (or wherever you want +to keep uucp's commands) which would look like this: + + # /usr/lib/uucp/crontab.src - uucp's crontab + # + PATH=/usr/lib/uucp:/bin:/usr/bin + SHELL=/bin/sh # otherwise it's uucico + HOME=/usr/lib/uucp # '' '' /usr/spool/uucppublic + # + 5 * * * * uudemon.hr + 10 4 * * * uudemon.day + 15 5 * * 0 uudemon.wk + +The application to the `news' cron commands (if any) is left for you to +figure out. Likewise if there are any other cruddy-looking 'su' commands in +your crontab commands, you don't need them anymore: just find a good place +to put the `crontab.src' (or whatever you want to call it) file for that +user, put the cron commands into it, and install it using the `crontab' +command (probably with "-u USERNAME", but see the man page). + +If you run a 4.2-derived cron, you could of course just install your current +crontab in toto as root's crontab. It would work exactly the way your +current one does, barring the extra steps in installing or changing it. +There would still be advantages to this cron, mostly that you get mail if +there is any output from your cron commands. + +One note about getting mail from cron: you will probably find, after you +install this version of cron, that your cron commands are generating a lot +of irritating output. The work-around for this is to redirect all EXPECTED +output to a per-execution log file, which you can examine if you want to +see the output from the "last time" a command was executed; if you get any +UNEXPECTED output, it will be mailed to you. This takes a while to get +right, but it's amazingly convenient. Trust me. + diff --git a/libexec/crond/FEATURES b/libexec/crond/FEATURES new file mode 100644 index 00000000000..7804a4811b0 --- /dev/null +++ b/libexec/crond/FEATURES @@ -0,0 +1,88 @@ +$Header: /cvsroot/src/libexec/crond/Attic/FEATURES,v 1.1 1993/05/28 08:33:57 cgd Exp $ + +Features of Vixie's cron relative to BSD 4.[23] and SysV crons: + +-- Environment variables can be set in each crontab. SHELL, USER, + and HOME are set from the user's passwd entry; all except USER + can be changed in the crontab. PATH is especially useful to + set there. TZ can be set, but cron ignores it other than passing + it on through to the commands it runs. Format is + + variable=value + + Blanks surrounding the '=' will be eaten; other blanks in value are + okay. Leading or trailing blanks can be preserved by quoting, single + or double quotes are okay, just so they match. + + PATH=.:/bin:/usr/bin + SHELL=/bin/sh + FOOBAR = this is a long blanky example + + Above, FOOBAR would get `this is a long blanky example' as its value. + + SHELL and HOME will be examined when it's time to run a command; if + you don't change them, they default to your /etc/passwd entry. + + *DANGER*, WILL ROBINSON! This means that all 'uucp' logins should set + SHELL=/bin/sh or cron will try to use /usr/lib/uucp/uucico as the + shell. This won't work. + + MAILTO, if set to the login name of a user on your system, will be the + person that cron mails the output of commands in that crontab. This is + useful if you decide on BINMAIL when configuring cron.h, since binmail + doesn't know anything about aliasing. + + Setting SHELL=/bin/sh will in general speed up your commands since it + is a much smaller shell than the one you probably use normally (csh + or ksh) and has enough features to work non-interactively. + +-- Weekdays can be specified by name. Case is not significant, but only + the first three letters should be specified. + +-- Months can likewise be specified by name. Three letters only. + +-- Ranges and lists can be mixed. Standard crons won't allow '1,3-5'. + +-- Ranges can specify 'step' values. '10-16/2' is like '10,12,14,16'. + +-- Sunday is both day 0 and day 7 -- apparently BSD and ATT disagree + about this. + +-- Each user gets their own crontab file. This is a win over BSD 4.2, + where only root has one, and over BSD 4.3, where they made the crontab + format incompatible and although the commands can be run by non-root + uid's, root is still the only one who can edit the crontab file. This + feature mimics the SysV cron. + +-- The 'crontab' command is loosely compatible with SysV, but has more + options which just generally make more sense. Running crontab with + no arguments will print a cute little summary of the command syntax. + +-- Comments and blank lines are allowed in the crontab file. Comments + must be on a line by themselves; leading whitespace is ignored, and + a '#' introduces the comment. + +-- (big win) If the `crontab' command changes anything in any crontab, it + tells the 'cron' daemon, who reloads all the tables before running the + next iteration. In some crons, you have to kill and restart the + daemon whenever you change a crontab. In other crons, the crontab + file is reread and reparsed every minute even if it didn't change. + +-- In order to support the automatic reload, the crontab files are not + readable or writable except by 'crontab' or 'cron'. This is not a + problem, since 'crontab' will let you do pretty much whatever you + want to your own crontab, or if you are root, to anybody's crontab. + +-- If any output is generated by a command (on stdout OR stderr), it will + be mailed to the owner of the crontab that contained the command (or + MAILTO, see discussion of environment variables, above). The headers + of the mail message will include the command that was run, and a + complete list of the environment that was passed to it, which will + contain (at least) the USER (LOGNAME on SysV), HOME, and SHELL. + +-- the dom/dow situation is odd. '* * 1,15 * Sun' will run on the + first and fifteenth AND every Sunday; '* * * * Sun' will run *only* + on Sundays; '* * 1,15 * *' will run *only* the 1st and 15th. this + is why we keep 'e->dow_star' and 'e->dom_star'. I didn't think up + this behaviour; it's how cron has always worked but the documentation + hasn't been very clear. diff --git a/libexec/crond/INSTALL b/libexec/crond/INSTALL new file mode 100644 index 00000000000..71a80054e31 --- /dev/null +++ b/libexec/crond/INSTALL @@ -0,0 +1,69 @@ +$Header: /cvsroot/src/libexec/crond/Attic/INSTALL,v 1.1 1993/05/28 08:33:59 cgd Exp $ + +*** This does not work on ATT SysV yet, and given the feature overlap, + it may never do so. + +Read the comments at the top of the Makefile, then edit the area marked +'configurable stuff'. + +Edit config.h. The stuff I expect you to change is down a bit from the +top of the file, but it's clearly marked. + +You don't have to create the /var/cron or /var/cron/tabs directories, since +both the daemon and the `crontab' program will do this the first time they +run if they don't exist. You do need to have a /var, though -- just "mkdir +/var" if you don't have one, or you can "mkdir /usr/var; ln -s /usr/var /var" +if you expect your /var to have a lot of stuff in it. + +You will also need /usr/local/etc and /usr/local/bin directories unless you +change the Makefile. These will have to be created by hand, but if you are +a long-time Usenet user you probably have them already. /usr/local/man is +where I keep my man pages, but I have the source for `man' and you probably +do not. Therefore you may have to put the man pages into /usr/man/manl, +which will be hard since there will be name collisions. (Note that the man +command was originally written by Bill Joy before he left Berkeley, and it +contains no AT&T code, so it is in UUNET's archive of freely-distributable +BSD code.) + +say: + make all + +su and say: + make install + +Note that if I can get you to "su and say" something just by asking, you have +a very serious security problem on your system and you should look into it. + +Edit your /usr/lib/crontab file into little pieces -- see the CONVERSION file +for help on this. + +Use the `crontab' command to install all the little pieces you just created. +Some examples (see below before trying any of these!) + + crontab -u uucp -r /usr/lib/uucp/crontab.src + crontab -u news -r /usr/lib/news/crontab.src + crontab -u root -r /usr/adm/crontab.src + +Notes on above examples: (1) the .src files are copied at the time the +command is issued; changing the source files later will have no effect until +they are reinstalled with another `crontab -r' command. (2) The crontab +command will affect the crontab of the person using the command unless `-u +USER' is given; `-u' only works for root. When using most `su' commands +under most BSD's, `crontab' will still think of you as yourself even though +you may think of yourself as root -- so use `-u' liberally. (3) the `-r' +option stands for `replace'; check the man page for crontab(1) for other +possibilities. + +Kill your existing cron daemon -- do `ps aux' and look for /etc/cron. + +Edit your /etc/rc or /etc/rc.local, looking for the line that starts up +/etc/cron. Comment it out and add a line to start the new cron daemon +-- usually /usr/local/etc/crond, unless you changed it in the Makefile. + +Start up this cron daemon yourself as root. Just type /usr/local/etc/crond +(or whatever); no '&' is needed since the cron daemon forks itself and the +process you executed returns immediately. + +ATT notes: for those people unfortunate enough to be stuck on a AT&T UNIX, +you will need the public-domain "libndir", found in the B News source and in +any comp.sources.unix archive. You will also need to hack the code some. diff --git a/libexec/crond/MANIFEST b/libexec/crond/MANIFEST new file mode 100644 index 00000000000..8b1d83388a1 --- /dev/null +++ b/libexec/crond/MANIFEST @@ -0,0 +1,30 @@ +(this now split up between /usr/src/libexec/crond and /usr/src/usr.bin/crontab + -cgd) + + File Name Archive # Description +----------------------------------------------------------- + CHANGES.V2 1 + CONVERSION 1 + FEATURES 1 + INSTALL 1 + MANIFEST 1 This shipping list + Makefile 1 + README 1 + THANKS 1 + arpadate.c 1 + bitstring.3 1 + bitstring.h 1 + config.h 2 + cron.h 2 + crond.8 1 + crond.c 2 + crontab.1 1 + crontab.5 2 + crontab.c 2 + database.c 2 + do_command.c 3 + entry.c 3 + env.c 1 + job.c 1 + misc.c 3 + user.c 1 diff --git a/libexec/crond/Makefile.vixie b/libexec/crond/Makefile.vixie index 3b436d62926..fd67d95843f 100644 --- a/libexec/crond/Makefile.vixie +++ b/libexec/crond/Makefile.vixie @@ -1,13 +1,13 @@ # Makefile for vixie's cron # -# $Header: /cvsroot/src/libexec/crond/Attic/Makefile.vixie,v 1.1.1.1 1993/03/21 09:45:37 cgd Exp $ +# $Header: /cvsroot/src/libexec/crond/Attic/Makefile.vixie,v 1.2 1993/05/28 08:34:03 cgd Exp $ # # vix 03mar88 [moved to RCS, rest of log is in there] # vix 30mar87 [goodbye, time.c; hello, getopt] # vix 12feb87 [cleanup for distribution] # vix 30dec86 [written] -#/* Copyright 1988,1990 by Paul Vixie +#/* Copyright 1988,1990,1993 by Paul Vixie # * All rights reserved # * # * Distribute freely, except: don't remove my name from the source or @@ -21,8 +21,7 @@ # * # * Send bug reports, bug fixes, enhancements, requests, flames, etc., and # * I'll try to keep a version up to date. I can be reached as follows: -# * Paul Vixie, 329 Noe Street, San Francisco, CA, 94114, (415) 864-7013, -# * paul@vixie.sf.ca.us || {hoptoad,pacbell,decwrl,crash}!vixie!paul +# * paul@vix.com || {hoptoad,pacbell,decwrl}!vixie!paul # */ # NOTES: @@ -36,9 +35,7 @@ # SHELL is for the 'augumented make' systems where 'make' imports # SHELL from the environment and then uses it to run its commands. # if your environment SHELL variable is /bin/csh, make goes real -# slow and sometimes does the wrong thing. BINDIR is where the -# 'crontab' command goes, and should be a common place like /usr/bin. -# LIBDIR is where the cron daemon lives; /usr/etc is common. +# slow and sometimes does the wrong thing. # # this package needs the 'bitstring macros' library, which is # available from me or from the comp.sources.unix archive. if you @@ -50,7 +47,7 @@ #################################### begin configurable stuff #<<DESTROOT is assumed to have ./etc, ./bin, and ./man subdirectories>> -DESTROOT = /usr/ +DESTROOT = $(DESTDIR)/usr/local #<<CRONDIR will be created by crond or crontab if nec'y>> CRONDIR = /var/cron #<<need bitstring.h>> @@ -60,8 +57,8 @@ INCLUDE = -I. #LIBS = /usr/local/lib/getopt.o LIBS = #<<optimize or debug?>> -OPTIM = -O -fstrength-reduce -#OPTIM = -g +#OPTIM = -O +OPTIM = -g #<<want -x flag for debugging?>> DEBUGGING = -DDEBUGGING=1 #DEBUGGING = -DDEBUGGING=0 @@ -84,10 +81,10 @@ INFOS = README CHANGES.V2 FEATURES INSTALL CONVERSION THANKS MANPAGES = bitstring.3 crontab.5 crontab.1 crond.8 HEADERS = bitstring.h cron.h config.h SOURCES = crond.c crontab.c database.c do_command.c \ - entry.c env.c job.c misc.c user.c + entry.c env.c job.c misc.c user.c arpadate.c SHAR_SOURCE = $(INFOS) $(MANPAGES) Makefile $(HEADERS) $(SOURCES) LINT_CROND = crond.c database.c user.c entry.c \ - misc.c job.c do_command.c env.c + misc.c job.c do_command.c env.c arpadate.c LINT_CRONTAB = crontab.c misc.c entry.c env.c CRON_OBJ = crond.o database.o user.o entry.o \ misc.o job.o do_command.o env.o @@ -108,10 +105,10 @@ crontab : $(CRONTAB_OBJ) $(CC) -o crontab $(CRONTAB_OBJ) $(LIBS) install : all - install -c -m 111 -o root -s crond $(DESTROOT)/libexec/ + install -c -m 111 -o root -s crond $(DESTROOT)/etc/ install -c -m 4111 -o root -s crontab $(DESTROOT)/bin/ - #install -c crontab.1 $(DESTROOT)/man/man1/crontab.1 - #install -c crond.8 $(DESTROOT)/man/man8/crond.8 + install -c crontab.1 $(DESTROOT)/man/man1/crontab.1 + install -c crond.8 $(DESTROOT)/man/man8/crond.8 install -c crontab.5 $(DESTROOT)/man/man5/crontab.5 clean :; rm -f *.o crond crontab a.out core tags *~ #* diff --git a/libexec/crond/README b/libexec/crond/README index a1a3007a7f4..ca7915bc312 100644 --- a/libexec/crond/README +++ b/libexec/crond/README @@ -1,25 +1,27 @@ -Vixie's Cron V2.1 -May 29, 1991 +Vixie's Cron V3.0 +May 29, 1993 +[V2.1 was May 29, 1991] [V2.0 was July 5, 1990] [V2.0-beta was December 9, 1988] [V1.0 was May 6, 1987] Paul Vixie -This is a version of 'cron' that is known to run on BSD 4.[23] systems. It -is functionally based on the SysV cron, which means that each user can have +This is a version of 'cron' that is known to run on BSD 4.x systems. It is +functionally based on the SysV cron, which means that each user can have their own crontab file (all crontab files are stored in a read-protected -directory, usually /var/cron/tabs). No direct support is provided for -'at'; you can continue to run 'atrun' from the crontab as you have been -doing. If you don't have atrun (i.e., System V) you are in trouble. +directory, usually /var/cron/tabs). No direct support is provided for 'at'; +you can continue to run 'atrun' from the crontab as you have been doing. If +you don't have atrun (i.e., System V) you might be in trouble. (I don't use +'at' myself so I don't care.) -A messages is logged each time a command is executed; also, the files -"allow" and "deny" in /var/cron can be used to control access to the -"crontab" command (which installs crontabs). It hasn't been tested on -SysV, although some effort has gone into making the port an easy one. +A message is logged each time a command is executed; also, the files "allow" +and "deny" in /var/cron can be used to control access to the "crontab" +command (which installs crontabs). It hasn't been tested on SysV, although +some effort has gone into making the port an easy one. The code was all written by me, and is (quoted from Makefile): -#/* Copyright 1988,1990 by Paul Vixie +#/* Copyright 1988,1990,1991,1993 by Paul Vixie # * All rights reserved # * # * Distribute freely, except: don't remove my name from the source or @@ -33,23 +35,24 @@ The code was all written by me, and is (quoted from Makefile): # * # * Send bug reports, bug fixes, enhancements, requests, flames, etc., and # * I'll try to keep a version up to date. I can be reached as follows: -# * Paul Vixie, 329 Noe Street, San Francisco, CA, 94114, (415) 864-7013, -# * paul@vixie.sf.ca.us || {hoptoad,pacbell,decwrl,crash}!vixie!paul +# * paul@vix.com || {hoptoad,pacbell,decwrl}!vixie!paul # */ This is more or less the copyright that USENET contributed software usually has. Since ATT couldn't use this version if they had to freely distribute -source, and since I'd love to see them use it, I'll offer some rediculously +source, and since I'd love to see them use it, I'll offer some ridiculously low license fee just to have them take it. In the unlikely event that they do this, I will continue to support and distribute the pseudo-PD version, so please, don't flame me for wanting my work to see a wider distribution. +This version of cron has appeared in BSD 4.4, BSD/386, 386BSD, and Linux. + To use this: Sorry, folks, there is no cutesy 'Configure' script. You'll have to go edit a couple of files... So, here's the checklist: Read all the FEATURES, INSTALL, and CONVERSION files - Edit config.h Edit Makefile + Edit config.h (both of these files have instructions inside; note that some things in config.h are definable in Makefile and are therefore surrounded by #ifndef...#endif) @@ -70,14 +73,14 @@ have to go edit a couple of files... So, here's the checklist: if you like it, change your /etc/{rc,rc.local} to use it instead of the old one. -$Header: /cvsroot/src/libexec/crond/Attic/README,v 1.1.1.1 1993/03/21 09:45:37 cgd Exp $ +$Header: /cvsroot/src/libexec/crond/Attic/README,v 1.2 1993/05/28 08:34:05 cgd Exp $ $Source: /cvsroot/src/libexec/crond/Attic/README,v $ -$Revision: 1.1.1.1 $ +$Revision: 1.2 $ $Log: README,v $ -Revision 1.1.1.1 1993/03/21 09:45:37 cgd -initial import of 386bsd-0.1 sources +Revision 1.2 1993/05/28 08:34:05 cgd +update for newest version of vixie's cron, as of May 27 1993 -Revision 2.2 91/05/29 11:37:38 vixie +Revision 2.2 1991/05/29 11:37:38 vixie vixie Revision 2.1 90/07/18 00:23:54 vixie diff --git a/libexec/crond/arpadate.c b/libexec/crond/arpadate.c new file mode 100644 index 00000000000..9b247010ed2 --- /dev/null +++ b/libexec/crond/arpadate.c @@ -0,0 +1,27 @@ +#include <time.h> + +#include "cron.h" + +/* Sat, 27 Feb 93 11:44:51 CST + * 123456789012345678901234567 + */ + +char * +arpadate( + time_t *clock +) { + time_t t = clock ?*clock :time(); + struct tm *tm = localtime(&t); + static char ret[30]; /* zone name might be >3 chars */ + + (void) sprintf(ret, "%s, %2d %s %2d %02d:%02d:%02d %s", + DowNames[tm->tm_wday], + tm->tm_mday, + MonthNames[tm->tm_mon], + tm->tm_year, + tm->tm_hour, + tm->tm_min, + tm->tm_sec, + tm->tm_zone); + return ret; +} diff --git a/libexec/crond/config.h b/libexec/crond/config.h index 227e456044b..9cc2daf915e 100644 --- a/libexec/crond/config.h +++ b/libexec/crond/config.h @@ -1,9 +1,9 @@ /* config.h - configurables for Vixie Cron * - * $Header: /cvsroot/src/libexec/crond/Attic/config.h,v 1.2 1993/05/11 08:16:02 glass Exp $ + * $Header: /cvsroot/src/libexec/crond/Attic/config.h,v 1.3 1993/05/28 08:34:09 cgd Exp $ */ -/* Copyright 1988,1990 by Paul Vixie +/* Copyright 1988,1990,1993 by Paul Vixie * All rights reserved * * Distribute freely, except: don't remove my name from the source or @@ -24,6 +24,24 @@ #ifndef _CONFIG_FLAG #define _CONFIG_FLAG +#if defined(BSD) +# define OLDBSD BSD +# undef BSD +# include <sys/param.h> +# if !defined(BSD) +# define BSD OLDBSD +# endif /*BSD*/ +# undef OLDBSD +#endif /*BSD*/ + +#if (defined(BSD)) && (BSD >= 199103) +# include <paths.h> +#endif /*BSD*/ + +#if !defined(_PATH_SENDMAIL) +# define _PATH_SENDMAIL "/usr/lib/sendmail" +#endif /*SENDMAIL*/ + /* * these are site-dependent */ @@ -36,17 +54,27 @@ * (hint: MAILTO= was added for this reason). */ -# define MAILCMD "/usr/sbin/sendmail -F\"Cron Daemon\" -odi -oem -or0s %s" /*-*/ +#define MAILCMD _PATH_SENDMAIL /*-*/ +#define MAILARGS "%s -F\"Cron Daemon\" -odi -oem -or0s -t" /*-*/ /* -Fx = set full-name of sender * -odi = Option Deliverymode Interactive * -oem = Option Errors Mailedtosender * -or0s = Option Readtimeout -- don't time out + * -t = recipients are in To: headers */ -/* # define MAILCMD "/bin/mail -d %s" /*-*/ +/* #define MAILCMD "/bin/mail" /*-*/ +/* #define MAILARGS "%s -d \"%s\"" /*-*/ /* -d = undocumented but common flag: deliver locally? */ +/* #define MAIL_DATE /*-*/ + /* should we include an ersatz Date: header in + * generated mail? if you are using sendmail + * for MAILCMD, it is better to let sendmail + * generate the Date: header. + */ + #ifndef CRONDIR /* CRONDIR is where crond(8) and crontab(1) both chdir * to; SPOOL_DIR, ALLOW_FILE, DENY_FILE, and LOG_FILE @@ -75,7 +103,7 @@ */ #define ALLOW_FILE "allow" /*-*/ #define DENY_FILE "deny" /*-*/ -#define LOG_FILE "log" /*-*/ +/*#define LOG_FILE "log" /*-*/ /* if ALLOW_FILE and DENY_FILE are not defined or are * defined but neither exists, should crontab(1) be @@ -110,6 +138,24 @@ /* where should the daemon stick its PID? */ -#define PIDFILE "/var/run/crond.pid" +#ifdef _PATH_VARRUN +# define PIDDIR _PATH_VARRUN +#else +# define PIDDIR "/etc/" +#endif +#if defined(BSD) && (BSD >= 199103) +# define PIDFILE "%scron.pid" +#else +# define PIDFILE "%scrond.pid" +#endif + + /* what editor to use if no EDITOR or VISUAL + * environment variable specified. + */ +#if defined(_PATH_VI) +# define EDITOR _PATH_VI +#else +# define EDITOR "/usr/ucb/vi" +#endif #endif /*CONFIG_FLAG*/ diff --git a/libexec/crond/cron.h b/libexec/crond/cron.h index d8e027b3b02..009df4201a9 100644 --- a/libexec/crond/cron.h +++ b/libexec/crond/cron.h @@ -1,11 +1,14 @@ /* cron.h - header for vixie's cron * - * $Header: /cvsroot/src/libexec/crond/Attic/cron.h,v 1.1.1.1 1993/03/21 09:45:37 cgd Exp $ + * $Header: /cvsroot/src/libexec/crond/Attic/cron.h,v 1.2 1993/05/28 08:34:11 cgd Exp $ * $Source: /cvsroot/src/libexec/crond/Attic/cron.h,v $ - * $Revision: 1.1.1.1 $ + * $Revision: 1.2 $ * $Log: cron.h,v $ - * Revision 1.1.1.1 1993/03/21 09:45:37 cgd - * initial import of 386bsd-0.1 sources + * Revision 1.2 1993/05/28 08:34:11 cgd + * update for newest version of vixie's cron, as of May 27 1993 + * + * Revision 2.2 1992/12/18 18:47:42 vixie + * vix/ckp * * Revision 2.1 90/07/18 00:23:47 vixie * Baseline for 4.4BSD release @@ -26,7 +29,7 @@ * vix 30dec86 [written] */ -/* Copyright 1988,1990 by Paul Vixie +/* Copyright 1988,1990,1993 by Paul Vixie * All rights reserved * * Distribute freely, except: don't remove my name from the source or @@ -199,8 +202,8 @@ typedef struct _entry typedef struct _user { struct _user *next, *prev; /* links */ - int uid; /* uid from passwd file */ - int gid; /* gid from passwd file */ + uid_t uid; /* uid from passwd file */ + gid_t gid; /* gid from passwd file */ char **envp; /* environ for commands */ time_t mtime; /* last modtime of crontab */ entry *crontab; /* this person's crontab */ diff --git a/libexec/crond/crond.8 b/libexec/crond/crond.8 index dff1c0f9498..216798ab2fd 100644 --- a/libexec/crond/crond.8 +++ b/libexec/crond/crond.8 @@ -1,4 +1,4 @@ -.\" $Header: /cvsroot/src/libexec/crond/Attic/crond.8,v 1.1.1.1 1993/03/21 09:45:37 cgd Exp $ +.\" $Header: /cvsroot/src/libexec/crond/Attic/crond.8,v 1.2 1993/05/28 08:34:12 cgd Exp $ .\" .\"/* Copyright 1988,1990 by Paul Vixie .\" * All rights reserved diff --git a/libexec/crond/crond.c b/libexec/crond/crond.c index d31c637fcac..5b71b669bff 100644 --- a/libexec/crond/crond.c +++ b/libexec/crond/crond.c @@ -1,5 +1,5 @@ #if !defined(lint) && !defined(LINT) -static char rcsid[] = "$Header: /cvsroot/src/libexec/crond/Attic/crond.c,v 1.2 1993/03/28 17:24:43 glass Exp $"; +static char rcsid[] = "$Header: /cvsroot/src/libexec/crond/Attic/crond.c,v 1.3 1993/05/28 08:34:14 cgd Exp $"; #endif /* Copyright 1988,1990 by Paul Vixie @@ -33,10 +33,10 @@ static char rcsid[] = "$Header: /cvsroot/src/libexec/crond/Attic/crond.c,v 1.2 1 # include <sys/resource.h> #endif /*BSD*/ -extern int fork(), unlink(); +/*extern int fprintf(), fork(), unlink(); extern time_t time(); extern void exit(); -extern unsigned sleep(); +extern unsigned sleep();*/ void usage() @@ -262,7 +262,7 @@ sigchld_handler() for (;;) { - pid = wait3((int *) &waiter, WNOHANG, (struct rusage *)0); + pid = wait3(&waiter, WNOHANG, (struct rusage *)0); switch (pid) { case -1: diff --git a/libexec/crond/database.c b/libexec/crond/database.c index 6d0b61b971e..a2d55d78d0d 100644 --- a/libexec/crond/database.c +++ b/libexec/crond/database.c @@ -1,5 +1,5 @@ #if !defined(lint) && !defined(LINT) -static char rcsid[] = "$Header: /cvsroot/src/libexec/crond/Attic/database.c,v 1.1.1.1 1993/03/21 09:45:37 cgd Exp $"; +static char rcsid[] = "$Header: /cvsroot/src/libexec/crond/Attic/database.c,v 1.2 1993/05/28 08:34:16 cgd Exp $"; #endif /* vix 26jan87 [RCS has the log] @@ -48,8 +48,7 @@ load_database(old_db) extern user *load_user(), *find_user(); extern char *env_get(); - static DIR *dir = NULL; - + DIR *dir; struct stat statbuf; struct direct *dp; cron_db new_db; @@ -83,18 +82,15 @@ load_database(old_db) return; } - /* make sure the dir is open. only happens the first time, since - * the DIR is static and we don't close it. Rewind the dir. + /* we used to keep this dir open all the time, for the sake of + * efficiency. however, we need to close it in every fork, and + * we fork a lot more often than the mtime of the dir changes. */ - if (dir == NULL) + if (!(dir = opendir(SPOOL_DIR))) { - if (!(dir = opendir(SPOOL_DIR))) - { - log_it("CROND", getpid(), "OPENDIR FAILED", SPOOL_DIR); - (void) exit(ERROR_EXIT); - } + log_it("CROND", getpid(), "OPENDIR FAILED", SPOOL_DIR); + (void) exit(ERROR_EXIT); } - (void) rewinddir(dir); /* something's different. make a new database, moving unchanged * elements from the old database, reloading elements that have @@ -108,7 +104,7 @@ load_database(old_db) { extern struct passwd *getpwnam(); struct passwd *pw; - int crontab_fd; + int crontab_fd = -1; char fname[MAXNAMLEN+1], tabname[MAXNAMLEN+1]; @@ -193,6 +189,8 @@ next_crontab: close(crontab_fd); } } + closedir(dir); + /* if we don't do this, then when our children eventually call * getpwnam() in do_command.c's child_process to verify MAILTO=, * they will screw us up (and v-v). diff --git a/libexec/crond/do_command.c b/libexec/crond/do_command.c index 3b40c81823a..ee90a4aaa40 100644 --- a/libexec/crond/do_command.c +++ b/libexec/crond/do_command.c @@ -1,19 +1,16 @@ #if !defined(lint) && !defined(LINT) -static char rcsid[] = "$Header: /cvsroot/src/libexec/crond/Attic/do_command.c,v 1.3 1993/05/26 18:45:07 guido Exp $"; +static char rcsid[] = "$Header: /cvsroot/src/libexec/crond/Attic/do_command.c,v 1.4 1993/05/28 08:34:17 cgd Exp $"; #endif /* $Source: /cvsroot/src/libexec/crond/Attic/do_command.c,v $ - * $Revision: 1.3 $ + * $Revision: 1.4 $ * $Log: do_command.c,v $ - * Revision 1.3 1993/05/26 18:45:07 guido - * Weird security hole removed. Thanks to cor@hacktic.nl + * Revision 1.4 1993/05/28 08:34:17 cgd + * update for newest version of vixie's cron, as of May 27 1993 * - * Revision 1.2 1993/03/28 17:24:44 glass - * cleanup so that crond compiles quietly + * Revision 2.2 1992/12/18 18:46:57 vixie + * vix/ckp * - * Revision 1.1.1.1 93/03/21 09:52:52 cgd - * initial import of 386bsd-0.1 sources - * * Revision 2.1 90/07/18 00:23:38 vixie * Baseline for 4.4BSD release * @@ -78,7 +75,7 @@ do_command(cmd, u) { extern int fork(), _exit(); extern void child_process(), log_it(); - extern char *env_get(); + extern char *env_get(), arpadate(); Debug(DPROC, ("[%d] do_command(%s, (%s,%d,%d))\n", getpid(), cmd, env_get(USERENV, u->envp), u->uid, u->gid)) @@ -106,7 +103,7 @@ do_command(cmd, u) } -void +static void child_process(cmd, u) char *cmd; user *u; @@ -181,6 +178,16 @@ child_process(cmd, u) *input_data++ = '\0'; } + /* set our directory, uid and gid. Set gid first, since once + * we set uid, we've lost root privledges. (oops!) + */ + setgid(u->gid); +# if defined(BSD) + initgroups(env_get(USERENV, u->envp), u->gid); +# endif + setuid(u->uid); /* you aren't root after this... */ + chdir(env_get("HOME", u->envp)); + /* fork again, this time so we can exec the user's command. Vfork() * is okay this time, since we are going to exec() pretty quickly. * I'm assuming that closing pipe ends &whatnot will not affect our @@ -239,16 +246,6 @@ child_process(cmd, u) do_univ(u); # endif - /* set our directory, uid and gid. Set gid first, since once - * we set uid, we've lost root privledges. (oops!) - */ - setgid(u->gid); -# if defined(BSD) - initgroups(env_get(USERENV, u->envp), u->gid); -# endif - setuid(u->uid); /* you aren't root after this... */ - chdir(env_get("HOME", u->envp)); - /* exec the command. */ { @@ -271,10 +268,10 @@ child_process(cmd, u) getpid(), shell, shell, cmd)) */ -# ifdef bad_idea - /* files writable by non-owner are a no-no + /* files writable by non-owner are a no-no, if we are + * running with privileges. */ - { + if (u->uid == ROOT_UID) { struct stat sb; if (0 != stat(cmd, &sb)) { @@ -286,14 +283,13 @@ child_process(cmd, u) "crond: %s writable by nonowner\n", cmd); _exit(ERROR_EXIT); - } else if (sb.st_uid & 022) { + } else if (sb.st_uid != u->uid) { fprintf(stderr, "crond: %s owned by uid %d\n", cmd, sb.st_uid); _exit(ERROR_EXIT); } } -# endif /*bad_idea*/ execle(shell, shell, "-c", cmd, (char *)0, u->envp); fprintf(stderr, "execl: couldn't exec `%s'\n", shell); @@ -433,18 +429,14 @@ child_process(cmd, u) if (mailto) { extern FILE *popen(); - extern char *print_cmd(); + extern char *sprintf(), *print_cmd(); register char **env; auto char mailcmd[MAX_COMMAND]; auto char hostname[MAXHOSTNAMELEN]; (void) gethostname(hostname, MAXHOSTNAMELEN); - (void) sprintf(mailcmd, MAILCMD, mailto); - setgid(u->gid); -# if defined(BSD) - initgroups(env_get(USERENV, u->envp), u->gid); -# endif - setuid(u->uid); /* you aren't root after this... */ + (void) sprintf(mailcmd, MAILARGS, + MAILCMD, mailto); if (!(mail = popen(mailcmd, "w"))) { perror(MAILCMD); @@ -456,7 +448,10 @@ child_process(cmd, u) "Subject: cron for %s@%s said this\n", usernm, first_word(hostname, ".") ); - fprintf(mail, "Date: %s", ctime(&TargetTime)); +# if defined(MAIL_DATE) + fprintf(mail, "Date: %s", + arpadate(&TargetTime)); +# endif /* MAIL_DATE */ fprintf(mail, "X-Cron-Cmd: <%s>\n", cmd); for (env = u->envp; *env; env++) fprintf(mail, "X-Cron-Env: <%s>\n", @@ -480,6 +475,18 @@ child_process(cmd, u) putc(ch, mail); } + /* if the cron job output ended on something other + * than a newline, add a newline here. this helps + * keep mailboxes from being corrupted; apparently + * /bin/mail versions that use \n\nFrom as a marker + * do not guarantee that messages end on newlines, + * which causes follow-on messages to glue together. + */ + if (mailto && (ch != '\n')) { + bytes++; + putc(ch, mail); + } + /* only close pipe if we opened it -- i.e., we're * mailing... */ @@ -527,7 +534,7 @@ child_process(cmd, u) Debug(DPROC, ("[%d] waiting for grandchild #%d to finish\n", getpid(), children)) - pid = wait((int *) &waiter); + pid = wait(&waiter); if (pid < OK) { Debug(DPROC, ("[%d] no more grandchildren--mail written?\n", getpid())) diff --git a/libexec/crond/entry.c b/libexec/crond/entry.c index 5d18299599e..52a7571fbd7 100644 --- a/libexec/crond/entry.c +++ b/libexec/crond/entry.c @@ -1,5 +1,5 @@ #if !defined(lint) && !defined(LINT) -static char rcsid[] = "$Header: /cvsroot/src/libexec/crond/Attic/entry.c,v 1.1.1.1 1993/03/21 09:45:37 cgd Exp $"; +static char rcsid[] = "$Header: /cvsroot/src/libexec/crond/Attic/entry.c,v 1.2 1993/05/28 08:34:19 cgd Exp $"; #endif /* vix 26jan87 [RCS'd; rest of log is in RCS file] diff --git a/libexec/crond/env.c b/libexec/crond/env.c index b1131971b82..b95c8cf1838 100644 --- a/libexec/crond/env.c +++ b/libexec/crond/env.c @@ -1,5 +1,5 @@ #if !defined(lint) && !defined(LINT) -static char rcsid[] = "$Header: /cvsroot/src/libexec/crond/Attic/env.c,v 1.2 1993/03/28 17:24:46 glass Exp $"; +static char rcsid[] = "$Header: /cvsroot/src/libexec/crond/Attic/env.c,v 1.3 1993/05/28 08:34:20 cgd Exp $"; #endif /* Copyright 1988,1990 by Paul Vixie @@ -92,6 +92,7 @@ load_env(envstr, f) * FALSE = not an env setting (file was repositioned) * TRUE = was an env setting */ + char *strcpy(), *sprintf(); long filepos; int fileline; char name[MAX_TEMPSTR], val[MAX_ENVSTR]; diff --git a/libexec/crond/job.c b/libexec/crond/job.c index f1b3eea8925..08508dea2b2 100644 --- a/libexec/crond/job.c +++ b/libexec/crond/job.c @@ -1,5 +1,5 @@ #if !defined(lint) && !defined(LINT) -static char rcsid[] = "$Header: /cvsroot/src/libexec/crond/Attic/job.c,v 1.1.1.1 1993/03/21 09:45:37 cgd Exp $"; +static char rcsid[] = "$Header: /cvsroot/src/libexec/crond/Attic/job.c,v 1.2 1993/05/28 08:34:21 cgd Exp $"; #endif /* Copyright 1988,1990 by Paul Vixie diff --git a/libexec/crond/misc.c b/libexec/crond/misc.c index 3e877f4b22d..5d940eebe4e 100644 --- a/libexec/crond/misc.c +++ b/libexec/crond/misc.c @@ -1,5 +1,5 @@ #if !defined(lint) && !defined(LINT) -static char rcsid[] = "$Header: /cvsroot/src/libexec/crond/Attic/misc.c,v 1.4 1993/05/11 08:16:03 glass Exp $"; +static char rcsid[] = "$Header: /cvsroot/src/libexec/crond/Attic/misc.c,v 1.5 1993/05/28 08:34:22 cgd Exp $"; #endif /* vix 26jan87 [RCS has the rest of the log] @@ -7,7 +7,7 @@ static char rcsid[] = "$Header: /cvsroot/src/libexec/crond/Attic/misc.c,v 1.4 19 * vix 30dec86 [written] */ -/* Copyright 1988,1990 by Paul Vixie +/* Copyright 1988,1990,1993 by Paul Vixie * All rights reserved * * Distribute freely, except: don't remove my name from the source or @@ -21,8 +21,8 @@ static char rcsid[] = "$Header: /cvsroot/src/libexec/crond/Attic/misc.c,v 1.4 19 * * Send bug reports, bug fixes, enhancements, requests, flames, etc., and * I'll try to keep a version up to date. I can be reached as follows: - * Paul Vixie, 329 Noe Street, San Francisco, CA, 94114, (415) 864-7013, - * paul@vixie.sf.ca.us || {hoptoad,pacbell,decwrl,crash}!vixie!paul + * Paul Vixie, 3477 South Court, Palo Alto, CA, 94306, USA, +1 415 858 2736 + * paul@vix.com || paul@vixie.sf.ca.us || {hoptoad,pacbell,decwrl}!vixie!paul */ @@ -32,16 +32,14 @@ static char rcsid[] = "$Header: /cvsroot/src/libexec/crond/Attic/misc.c,v 1.4 19 #include <sys/ioctl.h> #include <sys/file.h> #include <errno.h> -#include <string.h> -#include <stdlib.h> -#include <time.h> #if defined(ATT) # include <fcntl.h> #endif -#ifdef SYSLOG -#include <syslog.h> +#if defined(SYSLOG) +# include <syslog.h> #endif + void log_it(), be_different(), acquire_daemonlock(); @@ -49,6 +47,8 @@ char * savestr(str) char *str; { + extern int strlen(); + extern char *malloc(), *strcpy(); /**/ char *temp; temp = malloc((unsigned) (strlen(str) + 1)); @@ -289,6 +289,7 @@ be_different() * do an IOCTL to void tty association */ + extern int getpid(), setpgrp(), open(), ioctl(), close(); auto int fd; (void) setpgrp(0, getpid()); @@ -328,13 +329,17 @@ be_different() void acquire_daemonlock() { - int fd = open(PIDFILE, O_RDWR|O_CREAT, 0644); - FILE *fp = fdopen(fd, "r+"); - int pid = getpid(), otherpid; + char pidfile[MAX_FNAME]; + FILE *fp; + int fd, pid = getpid(), otherpid; char buf[MAX_TEMPSTR]; - if (fd < 0 || fp == NULL) { - sprintf(buf, "can't open or create %s, errno %d", PIDFILE, errno); + (void) sprintf(pidfile, PIDFILE, PIDDIR); + if ((-1 == (fd = open(pidfile, O_RDWR|O_CREAT, 0644))) + || (NULL == (fp = fdopen(fd, "r+"))) + ) { + sprintf(buf, "can't open or create %s: %s", + pidfile, strerror(errno)); log_it("CROND", pid, "DEATH", buf); exit(ERROR_EXIT); } @@ -343,8 +348,8 @@ acquire_daemonlock() int save_errno = errno; fscanf(fp, "%d", &otherpid); - sprintf(buf, "can't lock %s, otherpid may be %d, errno %d", - PIDFILE, otherpid, save_errno); + sprintf(buf, "can't lock %s, otherpid may be %d: %s", + pidfile, otherpid, strerror(save_errno)); log_it("CROND", pid, "DEATH", buf); exit(ERROR_EXIT); } @@ -352,7 +357,8 @@ acquire_daemonlock() rewind(fp); fprintf(fp, "%d\n", pid); fflush(fp); - ftruncate(fd, ftell(fp)); + (void) ftruncate(fd, ftell(fp)); + (void) fcntl(fd, F_SETFD, 1); /* abandon fd and fp even though the file is open. we need to * keep it open and locked, but we don't need the handles elsewhere. @@ -535,6 +541,9 @@ log_it(username, pid, event, detail) char *detail; { #if defined(LOG_FILE) + extern struct tm *localtime(); + extern long time(); + extern char *malloc(); auto char *msg; auto long now = time((long *) 0); register struct tm *t = localtime(&now); @@ -557,8 +566,11 @@ log_it(username, pid, event, detail) if (log_fd < OK) { log_fd = open(LOG_FILE, O_WRONLY|O_APPEND|O_CREAT, 0600); if (log_fd < OK) { - fprintf(stderr, "%s: can't open log file\n", ProgramName); + fprintf(stderr, "%s: can't open log file\n", + ProgramName); perror(LOG_FILE); + } else { + (void) fcntl(log_fd, F_SETFD, 1); } } @@ -691,9 +703,35 @@ mkprints(src, len) register unsigned char *src; register unsigned int len; { + extern char *malloc(); register char *dst = malloc(len*4 + 1); mkprint(dst, src, len); return dst; } + + +/* Sat, 27 Feb 93 11:44:51 CST + * 123456789012345678901234567 + */ + +char * +arpadate( + time_t *clock +) { + time_t t = clock ?*clock :time(NULL); + struct tm *tm = localtime(&t); + static char ret[30]; /* zone name might be >3 chars */ + + (void) sprintf(ret, "%s, %2d %s %2d %02d:%02d:%02d %s", + DowNames[tm->tm_wday], + tm->tm_mday, + MonthNames[tm->tm_mon], + tm->tm_year, + tm->tm_hour, + tm->tm_min, + tm->tm_sec, + tm->tm_zone); + return ret; +} diff --git a/libexec/crond/user.c b/libexec/crond/user.c index 0d10d92d4e9..f6f8215b659 100644 --- a/libexec/crond/user.c +++ b/libexec/crond/user.c @@ -1,5 +1,5 @@ #if !defined(lint) && !defined(LINT) -static char rcsid[] = "$Header: /cvsroot/src/libexec/crond/Attic/user.c,v 1.2 1993/03/28 17:24:49 glass Exp $"; +static char rcsid[] = "$Header: /cvsroot/src/libexec/crond/Attic/user.c,v 1.3 1993/05/28 08:34:23 cgd Exp $"; #endif /* vix 26jan87 [log is in RCS file] @@ -54,7 +54,7 @@ load_user(crontab_fd, name, uid, gid, dir, shell) char *dir; char *shell; { - char **env_init(), **env_set(); + char *malloc(), *sprintf(), **env_init(), **env_set(); int load_env(); entry *load_entry(); |
