Return to BSD News archive
Newsgroups: comp.bugs.2bsd
Path: euryale.cc.adfa.oz.au!newshost.anu.edu.au!harbinger.cc.monash.edu.au!nntp.coast.net!news.kei.com!newsfeed.internetmci.com!in2.uu.net!news.iag.net!rutgers!news.new-york.net!wlbr!moe!sms
From: sms@moe.2bsd.com (Steven M. Schultz)
Subject: date(1) vs. AD2000, cpp, {get,set}hostid(2), more... (#327)
Organization: 2BSD, Simi Valley CA USA
Message-ID: <DuGupE.9zx@moe.2bsd.com>
Date: Sat, 13 Jul 1996 05:17:38 GMT
Lines: 1765
Subject: date(1) vs. AD2000, cpp, {get,set}hostid(2), more... (#327)
Index: bin/date.c,many_others 2.11BSD
Description:
1. date(1) does not do the right thing when given a year past 1999.
2. gethostid(2) is declared differently in two system include files.
3. sethostid(2) is misdeclared as a 'void' function in both unistd.h
and the lint library.
4. time(2) does not have a declaration in time.h.
5. cpp still thinks the system is 2.10BSD.
6. ctimed and the matching stub module do not belong in the sendmail
source directory.
Repeat-By:
1. Currently, any digits in the "year" field to the date command below
"70" are translated into "1970".
Fix:
1. The simplest fix (contributed by shoppa@triumf.ca) was to interpret
years between "00" and "38" as 2000 to 2038. Thus midnight
Jan 1, 2000 would be entered as "date 0001010000".
2. This problem was spotted by Victor.Langeveld@mbfys.kun.nl. In
netdb.h gethostid() was declared as returning a "unsigned long"
but in unistd.h the same function was declared as "long". It's
not good to have multiple declarations present but it's bad news
to have conflicting declarations.
The fix was to remove the declaration from netdb.h. Programs which
use 'gethostid()' (and there are only two in the entire system:
hostid(1) and hunt(6)) should include unistd.h.
3. When unistd.h was ported from 4.4-Lite the declaration of
sethostid(2) was not fixed. A sucess/fail status is returned
from the kernel, thus it was a mistake to declare sethostid()
as 'void'.
4. time(2) had no declaration in the system include files. Individual
programs would locally declare time() as returning 'long'. This is
bad because it makes changing the type of time(2) much more
difficult.
time(2) is now declared (in time.h) to return a 'time_t'. For now
'time_t' is a 'long'. In the future this may change to be an
'unsigned long' in order to handle dates up to the year 2099. The
current 'long' type is sufficient to handle up to 2035 or so. Ask
me in 30 years if I feel like changing 'time_t' ;-).
5. The C preprocessor (/lib/cpp) still thought the system was a 2.10BSD
system. This made it very hard to #ifdef code based on whether
'BSD2_11' instead of 'BSD2_10' was defined (BSD2_10 was always
defined, even on a 2.11 system).
6. 'ctimed' is a program used to move ctime(3) external to a process.
A large program (sendmail for example) links with a set of "stub"
routines which replace ctime() (and other functions).
Sendmail(8) was the first program for which 'ctimed' and "stubs"
were written so the sources to 'ctimed' were incorrectly placed
in the sendmail source directory. This made it appear
that only sendmail could use 'ctimed' which is definitely not
the case. Kermit uses 'ctimed' for example. The changes to
kermit (makefile, etc) will be published later, for now kermit
will continue to use.
'ctimed' should have been entered into a separate directory.
For this purpose '/usr/libexec' is being introduced into the
system. Eventually the lead of 4.4 will be followed and
other system executables (telnetd, rlogind, rshd, fingerd, etc)
will be relocated into /usr/libexec.
The "stubs" module has been made into a library residing in
/usr/lib. Programs which want to use 'ctimed' now simply
include "-lstubs" at the end (but before '-lc') of their
list of libraries being linked with.
The shar archive below contains the following files:
1) A patch file (/tmp/327.patch) which is fed to 'patch'
and updates the following files:
/usr/include/netdb.h
/usr/include/paths.h
/usr/include/time.h
/usr/include/unistd.h
/usr/lib/lint/llib-lc
/usr/src/Makefile
/usr/src/bin/date.c
/usr/src/bin/hostid.c
/usr/src/games/hunt/answer.c
/usr/src/lib/cpp/Makefile
/usr/src/lib/cpp/cpp.c
/usr/src/usr.lib/Makefile
/usr/src/usr.lib/sendmail/src/Makefile.m4
/VERSION
2) A shell script (/tmp/327.sh) which renames the following
files to .old files:
/usr/src/usr.lib/sendmail/src/ctime.c
/usr/src/usr.lib/sendmail/src/ctimed.c
/usr/src/usr.lib/sendmail/src/Makefile.ns
(these files could be removed - they are no longer needed)
3) A shar archive (/tmp/327.shar) which adds the following
new files to the system:
/usr/libexec:
total 0
/usr/src/libexec:
total 2
-rw-r--r-- 1 root 521 Jun 25 20:11 Makefile
drwxr-xr-x 2 root 512 Jun 25 20:34 ctimed
/usr/src/libexec/ctimed:
total 7
-rw-r--r-- 1 root 450 Jun 25 20:34 Makefile
-rw-r--r-- 1 root 5289 Jun 25 20:16 ctimed.c
/usr/src/usr.lib/libstubs:
total 8
-rw-r--r-- 1 root 558 Jun 25 20:24 Makefile
-rw-r--r-- 1 root 4323 Jun 25 20:31 stubs.c
-rw-r--r-- 1 root 1600 Jun 25 20:09 stubtest.c
To install this update cut where indicated and save to a tmp file
(/tmp/327). Then:
cd /tmp
sh 327
sh 327.sh
sh 327.shar
patch -p0 < 327.patch
Next the C preprocessor (cpp) is rebuilt:
cd /usr/src/lib/cpp
make
make install
make clean
The lint libraries are next:
cd /usr/src/usr.bin/lint
./libs
Now do the 'stubs' library:
cd /usr/src/usr.lib/libstubs
make
make install
make clean
and the new 'ctimed' program:
cd /usr/src/libexec/ctimed
make
make install
make clean
Now that the infrastructure is in place 'sendmail' is rebuilt:
cd /usr/src/usr.lib/sendmail/src
m4 < Makefile.m4 > Makefile
make
make install
/usr/lib/sendmail -bz
make clean
At this point the currently running 'sendmail' process should be
killed and restarted (if you are running sendmail from inetd this
is not necessary).
The one other program in the system (excluding locally written
works of art) which uses 'gethostid' is then built:
cd /usr/src/games/hunt
make
make install
make clean
Last of all, the 'hostid' and 'date' programs are rebuilt:
cd /usr/src/bin
make hostid date
install -m 755 -s hostid date /bin
All done. You may want to clean up /tmp by removing the various
327.* files at this point.
This and previous updates are available via anonymous FTP to either
FTP.2BSD.COM or FTP.IIPO.GTEGSC.COM in the directory /pub/2.11BSD.
-----------------------------cut here------------------------
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create:
# /tmp/327.patch
# /tmp/327.sh
# /tmp/327.shar
# This archive created: Fri Jul 12 21:16:39 1996
export PATH; PATH=/bin:/usr/bin:$PATH
if test -f '/tmp/327.patch'
then
echo shar: "will not over-write existing file '/tmp/327.patch'"
else
sed 's/^Z//' << \SHAR_EOF > '/tmp/327.patch'
Z*** /usr/include/netdb.h.old Mon Jan 10 21:25:47 1994
Z--- /usr/include/netdb.h Wed Jul 10 20:01:54 1996
Z***************
Z*** 9,15 ****
Z * software without specific prior written permission. This software
Z * is provided ``as is'' without express or implied warranty.
Z *
Z! * @(#)netdb.h 5.9.1 (2.11BSD GTE) 12/31/93
Z */
Z
Z /*
Z--- 9,15 ----
Z * software without specific prior written permission. This software
Z * is provided ``as is'' without express or implied warranty.
Z *
Z! * @(#)netdb.h 5.9.2 (2.11BSD GTE) 96/7/10
Z */
Z
Z /*
Z***************
Z*** 67,71 ****
Z #define NO_RECOVERY 3 /* Non recoverable errors, FORMERR, REFUSED, NOTIMP */
Z #define NO_DATA 4 /* Valid name, no data record of requested type */
Z #define NO_ADDRESS NO_DATA /* no address, look for MX record */
Z-
Z- unsigned long gethostid();
Z--- 67,69 ----
Z*** /usr/include/paths.h.old Mon Apr 10 22:10:57 1995
Z--- /usr/include/paths.h Tue Jun 25 20:30:50 1996
Z***************
Z*** 14,20 ****
Z * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
Z * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
Z *
Z! * @(#)pathnames.h 5.3.4 (2.11BSD) 1995/04/10
Z */
Z
Z #define _PATH_BSHELL "/bin/sh"
Z--- 14,20 ----
Z * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
Z * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
Z *
Z! * @(#)pathnames.h 5.3.5 (2.11BSD) 1996/6/25
Z */
Z
Z #define _PATH_BSHELL "/bin/sh"
Z***************
Z*** 32,34 ****
Z--- 32,35 ----
Z #define _PATH_SENDMAIL "/usr/lib/sendmail"
Z #define _PATH_DEVDB "/var/run/dev"
Z #define _PATH_VARRUN "/var/run/"
Z+ #define _PATH_CTIMED "/usr/libexec/ctimed"
Z*** /usr/include/time.h.old Mon Mar 30 17:57:18 1987
Z--- /usr/include/time.h Wed Jul 10 19:56:06 1996
Z***************
Z*** 3,11 ****
Z * All rights reserved. The Berkeley software License Agreement
Z * specifies the terms and conditions for redistribution.
Z *
Z! * @(#)time.h 1.2 (Berkeley) 3/4/87
Z */
Z
Z /*
Z * Structure returned by gmtime and localtime calls (see ctime(3)).
Z */
Z--- 3,13 ----
Z * All rights reserved. The Berkeley software License Agreement
Z * specifies the terms and conditions for redistribution.
Z *
Z! * @(#)time.h 1.3 (2.11BSD) 96/7/10
Z */
Z
Z+ #include <sys/types.h> /* for time_t */
Z+
Z /*
Z * Structure returned by gmtime and localtime calls (see ctime(3)).
Z */
Z***************
Z*** 25,27 ****
Z--- 27,30 ----
Z
Z extern struct tm *gmtime(), *localtime();
Z extern char *asctime(), *ctime();
Z+ extern time_t time();
Z*** /usr/include/unistd.h.old Fri Jan 12 22:02:40 1996
Z--- /usr/include/unistd.h Thu Jul 11 19:34:32 1996
Z***************
Z*** 30,36 ****
Z * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
Z * SUCH DAMAGE.
Z *
Z! * @(#)unistd.h 8.10.1 (2.11BSD) 1996/1/12
Z */
Z
Z /*
Z--- 30,36 ----
Z * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
Z * SUCH DAMAGE.
Z *
Z! * @(#)unistd.h 8.10.2 (2.11BSD) 1996/7/11
Z */
Z
Z /*
Z***************
Z*** 83,89 ****
Z extern char *sys_siglist[];
Z char *re_comp();
Z char *sbrk();
Z! void sethostid();
Z void setusershell();
Z void sync();
Z unsigned int ualarm();
Z--- 83,89 ----
Z extern char *sys_siglist[];
Z char *re_comp();
Z char *sbrk();
Z! int sethostid();
Z void setusershell();
Z void sync();
Z unsigned int ualarm();
Z*** /usr/lib/lint/llib-lc.old Tue Mar 26 23:32:27 1996
Z--- /usr/lib/lint/llib-lc Thu Jul 11 19:32:55 1996
Z***************
Z*** 1,4 ****
Z! /* @(#)llib-lc 1.43 (2.11BSD GTE) 1996/3/26 */
Z
Z /* LINTLIBRARY */
Z
Z--- 1,4 ----
Z! /* @(#)llib-lc 1.44 (2.11BSD GTE) 1996/7/10 */
Z
Z /* LINTLIBRARY */
Z
Z***************
Z*** 74,80 ****
Z uid_t geteuid() { return((uid_t)1); }
Z gid_t getgid() { return((gid_t)1); }
Z int getgroups( n, g ) int n, *g; { return 0; }
Z! u_long gethostid() { return 1L; }
Z int gethostname( n, l ) char *n; int l; { return 0 ;}
Z int getitimer( w, v ) struct itimerval *v; { return 0; }
Z int getloadavg( d, n) double d[]; int n; { return 0; }
Z--- 74,80 ----
Z uid_t geteuid() { return((uid_t)1); }
Z gid_t getgid() { return((gid_t)1); }
Z int getgroups( n, g ) int n, *g; { return 0; }
Z! long gethostid() { return 1L; }
Z int gethostname( n, l ) char *n; int l; { return 0 ;}
Z int getitimer( w, v ) struct itimerval *v; { return 0; }
Z int getloadavg( d, n) double d[]; int n; { return 0; }
Z***************
Z*** 131,137 ****
Z int recvmsg( s, m, f ) struct msghdr m[]; { return 1; }
Z int rename( f, t ) char *f, *t; { return 0;}
Z int rmdir( p ) char *p; { return 0;}
Z- int rtp(f) { return(0); }
Z char *sbrk(i) { return((char *)0); }
Z int select( n, r, w, e, t ) fd_set *r, *w, *e; struct timeval *t; { return n; }
Z int send( s, m, l, f ) char *m; { return l; }
Z--- 131,136 ----
Z***************
Z*** 138,144 ****
Z int sendto( s, m, l, f, t, tl ) char *m; struct sockaddr *t; { return l; }
Z int sendmsg( s, m, l) struct msghdr m[]; { return l; }
Z int setgroups( n, g) int *g; { return 0; }
Z! int sethostid( h ) long h; { return 0;}
Z int sethostname( n, l ) char *n; int l; { return 0 ;}
Z int setitimer( w, v, ov ) struct itimerval *v, *ov; { return 0; }
Z int setpgrp( g, pg) { return 0; }
Z--- 137,143 ----
Z int sendto( s, m, l, f, t, tl ) char *m; struct sockaddr *t; { return l; }
Z int sendmsg( s, m, l) struct msghdr m[]; { return l; }
Z int setgroups( n, g) int *g; { return 0; }
Z! int sethostid( h ) long h; { return 0; }
Z int sethostname( n, l ) char *n; int l; { return 0 ;}
Z int setitimer( w, v, ov ) struct itimerval *v, *ov; { return 0; }
Z int setpgrp( g, pg) { return 0; }
Z***************
Z*** 407,413 ****
Z int system(s) char *s; { return(0); }
Z long tell(f) { return((long)0); }
Z long telldir( p ) DIR *p; { return 1L; }
Z! long time(t) long *t; { return( 0L );}
Z int times(tmsp) struct tms *tmsp; { return 0; }
Z char * timezone( z, d ){ return (char *)0; }
Z char * tmpnam(s) char *s; { return s; }
Z--- 406,412 ----
Z int system(s) char *s; { return(0); }
Z long tell(f) { return((long)0); }
Z long telldir( p ) DIR *p; { return 1L; }
Z! time_t time(t) time_t *t; { return( (time_t)0 );}
Z int times(tmsp) struct tms *tmsp; { return 0; }
Z char * timezone( z, d ){ return (char *)0; }
Z char * tmpnam(s) char *s; { return s; }
Z*** /usr/src/Makefile.old Sat Jan 23 15:59:57 1993
Z--- /usr/src/Makefile Tue Jun 25 20:05:01 1996
Z***************
Z*** 3,9 ****
Z # All rights reserved. The Berkeley software License Agreement
Z # specifies the terms and conditions for redistribution.
Z #
Z! # @(#)Makefile 4.13 (Berkeley) 5/15/86
Z #
Z # This makefile is designed to be run as:
Z # make build
Z--- 3,9 ----
Z # All rights reserved. The Berkeley software License Agreement
Z # specifies the terms and conditions for redistribution.
Z #
Z! # @(#)Makefile 4.14 (2.11BSD) 96/6/25
Z #
Z # This makefile is designed to be run as:
Z # make build
Z***************
Z*** 43,49 ****
Z # Programs that live in subdirectories, and have makefiles of their own.
Z #
Z LIBDIR= lib usr.lib
Z! SRCDIR= bin etc games local new ucb usr.bin man
Z
Z all: ${LIBDIR} ${SRCDIR}
Z
Z--- 43,49 ----
Z # Programs that live in subdirectories, and have makefiles of their own.
Z #
Z LIBDIR= lib usr.lib
Z! SRCDIR= bin etc games libexec local new ucb usr.bin man
Z
Z all: ${LIBDIR} ${SRCDIR}
Z
Z*** /usr/src/bin/date.c.old Sun Jul 3 16:05:03 1988
Z--- /usr/src/bin/date.c Wed Jul 10 20:00:34 1996
Z***************
Z*** 4,18 ****
Z * specifies the terms and conditions for redistribution.
Z */
Z
Z! #ifndef lint
Z char copyright[] =
Z "@(#) Copyright (c) 1985 Regents of the University of California.\n\
Z All rights reserved.\n";
Z- #endif not lint
Z
Z! #ifndef lint
Z! static char sccsid[] = "@(#)date.c 4.20 (Berkeley) 3/24/87";
Z! #endif not lint
Z
Z /*
Z * Date - print and set date
Z--- 4,16 ----
Z * specifies the terms and conditions for redistribution.
Z */
Z
Z! #if !defined(LINT) && defined(DOSCCS)
Z char copyright[] =
Z "@(#) Copyright (c) 1985 Regents of the University of California.\n\
Z All rights reserved.\n";
Z
Z! static char sccsid[] = "@(#)date.c 4.20.1 (2.11BSD) 96/7/10";
Z! #endif
Z
Z /*
Z * Date - print and set date
Z***************
Z*** 28,33 ****
Z--- 26,33 ----
Z #include <stdio.h>
Z #include <ctype.h>
Z #include <strings.h>
Z+ #include <stdlib.h>
Z+ #include <unistd.h>
Z
Z #define WTMP "/usr/adm/wtmp"
Z #define ATOI2(ar) (ar[0] - '0') * 10 + (ar[1] - '0'); ar += 2;
Z***************
Z*** 47,54 ****
Z int argc;
Z char **argv;
Z {
Z- extern int optind;
Z- extern char *optarg;
Z static char usage[] = "usage: date [-nu] [-d dst] [-t timezone] [yymmddhhmm[.ss]]\n";
Z struct timezone tz;
Z char *ap, /* time string */
Z--- 47,52 ----
Z***************
Z*** 57,65 ****
Z uflag, /* do it in GMT */
Z nflag, /* only set time locally */
Z wf; /* wtmp file descriptor */
Z! long time();
Z! uid_t getuid();
Z! char *username, *getlogin();
Z
Z nflag = uflag = 0;
Z tz.tz_dsttime = tz.tz_minuteswest = 0;
Z--- 55,61 ----
Z uflag, /* do it in GMT */
Z nflag, /* only set time locally */
Z wf; /* wtmp file descriptor */
Z! char *username;
Z
Z nflag = uflag = 0;
Z tz.tz_dsttime = tz.tz_minuteswest = 0;
Z***************
Z*** 215,220 ****
Z--- 211,220 ----
Z
Z tv.tv_sec = 0;
Z year += TM_YEAR_BASE;
Z+ /* If year < EPOCH_YEAR, assume it's in the next century and
Z+ the system has not yet been patched to move TM_YEAR_BASE up yet */
Z+ if (year < EPOCH_YEAR)
Z+ year += 100;
Z if (isleap(year) && month > 2)
Z ++tv.tv_sec;
Z for (--year;year >= EPOCH_YEAR;--year)
Z***************
Z*** 237,243 ****
Z #define WAITACK 2 /* seconds */
Z #define WAITDATEACK 5 /* seconds */
Z
Z- extern int errno;
Z /*
Z * Set the date in the machines controlled by timedaemons
Z * by communicating the new date to the local timedaemon.
Z--- 237,242 ----
Z*** /usr/src/bin/hostid.c.old Sun Jan 2 14:26:39 1994
Z--- /usr/src/bin/hostid.c Thu Jul 11 19:45:31 1996
Z***************
Z*** 8,14 ****
Z char copyright[] =
Z "@(#) Copyright (c) 1983 Regents of the University of California.\n\
Z All rights reserved.\n";
Z! static char sccsid[] = "@(#)hostid.c 1.2 (2.11BSD GTE) 1/1/94";
Z #endif
Z
Z #include <sys/types.h>
Z--- 8,14 ----
Z char copyright[] =
Z "@(#) Copyright (c) 1983 Regents of the University of California.\n\
Z All rights reserved.\n";
Z! static char sccsid[] = "@(#)hostid.c 1.3 (2.11BSD GTE) 96/7/10";
Z #endif
Z
Z #include <sys/types.h>
Z***************
Z*** 15,24 ****
Z #include <stdio.h>
Z #include <ctype.h>
Z #include <netdb.h>
Z
Z- extern char *index();
Z- extern unsigned long inet_addr();
Z-
Z main(argc, argv)
Z int argc;
Z char **argv;
Z--- 15,24 ----
Z #include <stdio.h>
Z #include <ctype.h>
Z #include <netdb.h>
Z+ #include <string.h>
Z+ #include <unistd.h>
Z+ #include <arpa/inet.h>
Z
Z main(argc, argv)
Z int argc;
Z char **argv;
Z***************
Z*** 29,45 ****
Z struct hostent *hp;
Z
Z if (argc < 2) {
Z! #ifdef pdp11
Z! {
Z! long val;
Z! if (val = gethostid())
Z! printf("0x%lx\n",val);
Z! else
Z! puts("0");
Z! }
Z! #else
Z! printf("%#lx\n", gethostid());
Z! #endif
Z exit(0);
Z }
Z
Z--- 29,35 ----
Z struct hostent *hp;
Z
Z if (argc < 2) {
Z! printf("0x%lx\n", gethostid());
Z exit(0);
Z }
Z
Z***************
Z*** 48,71 ****
Z bcopy(hp->h_addr, &addr, sizeof(addr));
Z hostid = addr;
Z } else if (index(id, '.')) {
Z! if ((hostid = inet_addr(id)) == -1)
Z! goto usage;
Z } else {
Z if (id[0] == '0' && (id[1] == 'x' || id[1] == 'X'))
Z id += 2;
Z! if (sscanf(id, "%lx", &hostid) != 1) {
Z! usage:
Z! fprintf(stderr,
Z! "usage: %s [hexnum or internet address]\n",
Z! argv[0]);
Z! exit(1);
Z! }
Z }
Z
Z! if (sethostid(hostid) < 0) {
Z! perror("sethostid");
Z! exit(1);
Z! }
Z!
Z exit(0);
Z }
Z--- 38,59 ----
Z bcopy(hp->h_addr, &addr, sizeof(addr));
Z hostid = addr;
Z } else if (index(id, '.')) {
Z! if ((hostid = inet_addr(id)) == -1L)
Z! usage();
Z } else {
Z if (id[0] == '0' && (id[1] == 'x' || id[1] == 'X'))
Z id += 2;
Z! if (sscanf(id, "%lx", &hostid) != 1)
Z! usage();
Z }
Z
Z! if (sethostid(hostid) < 0)
Z! err(1, "sethostid");
Z exit(0);
Z }
Z+
Z+ usage()
Z+ {
Z+ errx(1,"usage: [hexnum or internet name/address]");
Z+ /* NOTREACHED */
Z+ }
Z*** /usr/src/games/hunt/answer.c.old Mon Aug 26 20:28:20 1985
Z--- /usr/src/games/hunt/answer.c Wed Jul 10 20:19:11 1996
Z***************
Z*** 6,15 ****
Z--- 6,18 ----
Z * Copyright (c) 1985 Regents of the University of California.
Z * All rights reserved. The Berkeley software License Agreement
Z * specifies the terms and conditions for redistribution.
Z+ *
Z+ * @(#) answer.c 1.1 (2.11BSD) 96/7/10
Z */
Z
Z # include "hunt.h"
Z # include <errno.h>
Z+ # include <unistd.h> /* for gethostid() */
Z
Z # define MAXPERMACH 3 /* Max player/monitor per machine */
Z
Z*** /usr/src/lib/cpp/Makefile.old Sun Jan 2 23:10:43 1994
Z--- /usr/src/lib/cpp/Makefile Thu Jul 11 19:55:10 1996
Z***************
Z*** 1,4 ****
Z! # Makefile 1.2 83/07/02
Z #
Z
Z # Defined SHARED_DATA to be whatever will make your compiler make initialized
Z--- 1,4 ----
Z! # Makefile 1.3 (2.11BSD) 96/7/11
Z #
Z
Z # Defined SHARED_DATA to be whatever will make your compiler make initialized
Z***************
Z*** 12,18 ****
Z # If you don't have split I/D, you'll have to edit the constant
Z # SBSIZE in cpp.c to reflect this.
Z
Z! CFLAGS=-O -Dpdp11=1 -DFLEXNAMES
Z SEPFLAG=-i
Z
Z cpp : cpp.o cpy.o rodata.o
Z--- 12,18 ----
Z # If you don't have split I/D, you'll have to edit the constant
Z # SBSIZE in cpp.c to reflect this.
Z
Z! CFLAGS=-O -Dpdp11=1 -DFLEXNAMES -DBSD2_11 -UBSD2_10
Z SEPFLAG=-i
Z
Z cpp : cpp.o cpy.o rodata.o
Z***************
Z*** 21,28 ****
Z cpy.c : cpy.y
Z yacc cpy.y
Z ../pcc/:yyfix yyexca yyact yypact yypgo yyr1 yyr2 yychk yydef
Z! fgrep -v "static char yaccpar_sccsid" y.tab.c >cpy.c
Z! rm -f y.tab.c
Z
Z cpy.o : cpy.c yylex.c
Z
Z--- 21,27 ----
Z cpy.c : cpy.y
Z yacc cpy.y
Z ../pcc/:yyfix yyexca yyact yypact yypgo yyr1 yyr2 yychk yydef
Z! mv y.tab.c cpy.c
Z
Z cpy.o : cpy.c yylex.c
Z
Z***************
Z*** 30,36 ****
Z $(CC) $(CFLAGS) ${SHARED_DATA} -c rodata.c
Z
Z clean :
Z! rm -f *.s *.o cpy.c rodata.c
Z
Z install : cpp
Z install -s cpp $(DESTDIR)/lib
Z--- 29,35 ----
Z $(CC) $(CFLAGS) ${SHARED_DATA} -c rodata.c
Z
Z clean :
Z! rm -f *.s *.o cpy.c rodata.c cpp
Z
Z install : cpp
Z install -s cpp $(DESTDIR)/lib
Z*** /usr/src/lib/cpp/cpp.c.old Wed Jun 12 19:41:13 1996
Z--- /usr/src/lib/cpp/cpp.c Thu Jul 11 16:46:18 1996
Z***************
Z*** 1,4 ****
Z! /* static char sccsid[] = "@(#)cpp.c 1.8.1 1996/6/12"; */
Z
Z #ifdef FLEXNAMES
Z #define NCPS 128
Z--- 1,4 ----
Z! /* static char sccsid[] = "@(#)cpp.c 1.8.2 1996/7/11"; */
Z
Z #ifdef FLEXNAMES
Z #define NCPS 128
Z***************
Z*** 1215,1220 ****
Z--- 1215,1223 ----
Z # endif
Z # if sun
Z varloc=stsym("sun");
Z+ # endif
Z+ # if BSD2_11
Z+ varloc=stsym("BSD2_11");
Z # endif
Z # if BSD2_10
Z varloc=stsym("BSD2_10");
Z*** /usr/src/usr.lib/Makefile.old Wed Mar 20 20:30:53 1996
Z--- /usr/src/usr.lib/Makefile Thu Jul 11 20:16:36 1996
Z***************
Z*** 3,9 ****
Z # All rights reserved. The Berkeley software License Agreement
Z # specifies the terms and conditions for redistribution.
Z #
Z! # @(#)Makefile 5.12 (2.11BSD GTE) 1996/3/20
Z #
Z DESTDIR=
Z CFLAGS= -O
Z--- 3,9 ----
Z # All rights reserved. The Berkeley software License Agreement
Z # specifies the terms and conditions for redistribution.
Z #
Z! # @(#)Makefile 5.12.1 (2.11BSD GTE) 1996/7/11
Z #
Z DESTDIR=
Z CFLAGS= -O
Z***************
Z*** 24,30 ****
Z #
Z SUBDIR= learn lib2648 libF77 libI77 libU77 libcurses libdbm libln \
Z libom libmp libplot libtermlib liby lpr me sendmail libutil libvmf \
Z! liberrlst
Z
Z # Shell scripts that need only be installed and are never removed.
Z #
Z--- 24,30 ----
Z #
Z SUBDIR= learn lib2648 libF77 libI77 libU77 libcurses libdbm libln \
Z libom libmp libplot libtermlib liby lpr me sendmail libutil libvmf \
Z! liberrlst libstubs
Z
Z # Shell scripts that need only be installed and are never removed.
Z #
Z*** /usr/src/usr.lib/sendmail/src/Makefile.m4.old Fri Mar 22 22:38:47 1996
Z--- /usr/src/usr.lib/sendmail/src/Makefile.m4 Tue Jun 25 21:00:41 1996
Z***************
Z*** 7,13 ****
Z # All rights reserved. The Berkeley software License Agreement
Z # specifies the terms and conditions for redistribution.
Z #
Z! # @(#)Makefile.m4 5.10.4 (2.11BSD GTE) 1996/3/22
Z #
Z #
Z # SENDMAIL Makefile.
Z--- 7,13 ----
Z # All rights reserved. The Berkeley software License Agreement
Z # specifies the terms and conditions for redistribution.
Z #
Z! # @(#)Makefile.m4 5.10.5 (2.11BSD GTE) 1996/6/25
Z #
Z #
Z # SENDMAIL Makefile.
Z***************
Z*** 27,33 ****
Z savemail.o err.o readcf.o stab.o headers.o recipient.o \
Z stats.o daemon.o usersmtp.o srvrsmtp.o queue.o \
Z macro.o util.o clock.o trace.o envelope.o
Z! OBJS2= sysexits.o arpadate.o convtime.o ctime.o
Z OBJS= $(OBJS1) $(OBJS2) $(EXTRACT) Version.o str.o
Z
Z SBASE= conf.o parseaddr.o alias.o deliver.o headers.o \
Z--- 27,33 ----
Z savemail.o err.o readcf.o stab.o headers.o recipient.o \
Z stats.o daemon.o usersmtp.o srvrsmtp.o queue.o \
Z macro.o util.o clock.o trace.o envelope.o
Z! OBJS2= sysexits.o arpadate.o convtime.o
Z OBJS= $(OBJS1) $(OBJS2) $(EXTRACT) Version.o str.o
Z
Z SBASE= conf.o parseaddr.o alias.o deliver.o headers.o \
Z***************
Z*** 34,40 ****
Z recipient.o srvrsmtp.o queue.o util.o \
Z envelope.o sysexits.o convtime.o Version.o \
Z $(EXTRACT) str.o
Z! SOV1= main.o readcf.o macro.o ctime.o
Z SOV2= daemon.o savemail.o usersmtp.o err.o clock.o stats.o trace.o stab.o \
Z arpadate.o
Z SOV3= collect.o
Z--- 34,40 ----
Z recipient.o srvrsmtp.o queue.o util.o \
Z envelope.o sysexits.o convtime.o Version.o \
Z $(EXTRACT) str.o
Z! SOV1= main.o readcf.o macro.o
Z SOV2= daemon.o savemail.o usersmtp.o err.o clock.o stats.o trace.o stab.o \
Z arpadate.o
Z SOV3= collect.o
Z***************
Z*** 44,52 ****
Z sysexits.c util.c arpadate.c collect.c \
Z macro.c headers.c readcf.c stab.c recipient.c stats.c daemon.c \
Z usersmtp.c srvrsmtp.c queue.c clock.c trace.c envelope.c \
Z! convtime.c ctime.c Version.c
Z
Z! ALL= sendmail ctimed
Z
Z O= -O
Z COPTS=
Z--- 44,52 ----
Z sysexits.c util.c arpadate.c collect.c \
Z macro.c headers.c readcf.c stab.c recipient.c stats.c daemon.c \
Z usersmtp.c srvrsmtp.c queue.c clock.c trace.c envelope.c \
Z! convtime.c Version.c
Z
Z! ALL= sendmail
Z
Z O= -O
Z COPTS=
Z***************
Z*** 67,79 ****
Z
Z sendmail: $(OBJS)
Z ld $(SEPFLAG) $(COPTS) /lib/crt0.o -o sendmail \
Z! -Z $(SOV1) -Z $(SOV2) -Z $(SOV3) -Y $(SBASE) $(LIBS) -lc
Z chmod $(OBJMODE) sendmail
Z size sendmail; ls -l sendmail
Z
Z- ctimed:
Z- cc $(SEPFLAG) $(CFLAGS) ctimed.c -o ctimed
Z-
Z install: all
Z $(INSTALL) -m 4755 -o root sendmail $(DESTDIR)/usr/lib
Z cp /dev/null $(DESTDIR)/usr/lib/sendmail.fc
Z--- 67,76 ----
Z
Z sendmail: $(OBJS)
Z ld $(SEPFLAG) $(COPTS) /lib/crt0.o -o sendmail \
Z! -Z $(SOV1) -Z $(SOV2) -Z $(SOV3) -Y $(SBASE) $(LIBS) -lstubs -lc
Z chmod $(OBJMODE) sendmail
Z size sendmail; ls -l sendmail
Z
Z install: all
Z $(INSTALL) -m 4755 -o root sendmail $(DESTDIR)/usr/lib
Z cp /dev/null $(DESTDIR)/usr/lib/sendmail.fc
Z***************
Z*** 81,87 ****
Z install -c -o bin -m 644 sendmail.sr \
Z $(DESTDIR)/usr/lib/sendmail.sr; \
Z fi
Z- install -c -s -o bin -m 0755 ctimed $(DESTDIR)/usr/lib/ctimed
Z
Z tags: FRC
Z ctags -a -t ${SRCS}
Z--- 78,83 ----
Z***************
Z*** 100,106 ****
Z
Z clean:
Z rm -f sendmail a.out XREF sendmail.cf
Z! rm -f sendmail.sr *.o ctimed strings version.c xs.c
Z
Z print: $(SRCS)
Z @ls -l | pr -h "sendmail directory"
Z--- 96,102 ----
Z
Z clean:
Z rm -f sendmail a.out XREF sendmail.cf
Z! rm -f sendmail.sr *.o strings version.c xs.c
Z
Z print: $(SRCS)
Z @ls -l | pr -h "sendmail directory"
Z*** /VERSION.old Thu Jun 20 20:16:39 1996
Z--- /VERSION Wed Jul 10 20:41:34 1996
Z***************
Z*** 1,4 ****
Z! Current Patch Level: 326
Z
Z 2.11 BSD
Z ============
Z--- 1,4 ----
Z! Current Patch Level: 327
Z
Z 2.11 BSD
Z ============
SHAR_EOF
fi
if test -f '/tmp/327.sh'
then
echo shar: "will not over-write existing file '/tmp/327.sh'"
else
sed 's/^Z//' << \SHAR_EOF > '/tmp/327.sh'
Z#!/bin/sh
Z
Zcd /usr/src/usr.lib/sendmail/src
Zmv -f ctime.c ctime.c.old
Zmv -f ctimed.c ctimed.c.old
Zmv -f Makefile.ns Makefile.ns.old
SHAR_EOF
chmod +x '/tmp/327.sh'
fi
if test -f '/tmp/327.shar'
then
echo shar: "will not over-write existing file '/tmp/327.shar'"
else
sed 's/^Z//' << \SHAR_EOF > '/tmp/327.shar'
Z#! /bin/sh
Z# This is a shell archive, meaning:
Z# 1. Remove everything above the #! /bin/sh line.
Z# 2. Save the resulting text in a file.
Z# 3. Execute the file with /bin/sh (not csh) to create:
Z# /usr/libexec
Z# /usr/src/libexec
Z# /usr/src/usr.lib/libstubs
Z# This archive created: Thu Jul 11 20:20:10 1996
Zexport PATH; PATH=/bin:/usr/bin:$PATH
Zif test ! -d '/usr/libexec'
Zthen
Z mkdir '/usr/libexec'
Zfi
Zcd '/usr/libexec'
Zchmod 755 .
Zcd ..
Zif test ! -d '/usr/src/libexec'
Zthen
Z mkdir '/usr/src/libexec'
Zfi
Zcd '/usr/src/libexec'
Zif test -f 'Makefile'
Zthen
Z echo shar: "will not over-write existing file 'Makefile'"
Zelse
Zsed 's/^X//' << \SHAR_EOF > 'Makefile'
ZX#
ZX# Steven Schultz - put in the public domain 1996/6/25.
ZX#
ZX# @(#)Makefile 1.0 (2.11BSD) 1996/6/25
ZX#
ZXDESTDIR=
ZXCFLAGS= -O
ZXSEPFLAG= -i
ZXTAGSFILE=tags
ZX
ZXSUBDIR= ctimed
ZX
ZXall: ${SUBDIR}
ZX
ZX${SUBDIR}: FRC
ZX cd $@; make SEPFLAG=${SEPFLAG} ${MFLAGS}
ZX
ZXFRC:
ZX
ZXinstall:
ZX -for i in ${SUBDIR}; do \
ZX (cd $$i; make SEPFLAG=${SEPFLAG} ${MFLAGS} \
ZX DESTDIR=${DESTDIR} install); done
ZX
ZXtags:
ZX cd libc; make ${MFLAGS} TAGSFILE=../${TAGSFILE} tags
ZX
ZXclean:
ZX rm -f a.out core *.s *.o
ZX -for i in ${SUBDIR}; do (cd $$i; make ${MFLAGS} clean); done
ZSHAR_EOF
Zchmod 644 'Makefile'
Zfi
Zif test ! -d 'ctimed'
Zthen
Z mkdir 'ctimed'
Zfi
Zcd 'ctimed'
Zif test -f 'Makefile'
Zthen
Z echo shar: "will not over-write existing file 'Makefile'"
Zelse
Zsed 's/^X//' << \SHAR_EOF > 'Makefile'
ZX#
ZX# Public Domain. 1996/6/25 - Steven Schultz
ZX#
ZX# @(#)Makefile 1.0 (2.11BSD GTE) 1996/6/25
ZX#
ZXCFLAGS= -O
ZXSEPFLAG= -i
ZXSRCS= ctimed.c
ZXOBJS= ctimed.o
ZX
ZXall: ctimed
ZX
ZXctimed: ${OBJS}
ZX ${CC} ${CFLAGS} ${SEPFLAG} -o $@ ${OBJS}
ZX
ZXclean:
ZX rm -f ${OBJS} ctimed tags
ZX
ZXdepend: ${SRCS}
ZX mkdep ${CFLAGS} ${SRCS}
ZX
ZXinstall: ctimed
ZX install -s -o root -g bin -m 755 ctimed ${DESTDIR}/usr/libexec/ctimed
ZX
ZXlint: ${SRCS}
ZX lint -hax ${SRCS}
ZX
ZXtags: ${SRCS}
ZX ctags ${SRCS}
ZSHAR_EOF
Zchmod 644 'Makefile'
Zfi
Zif test -f 'ctimed.c'
Zthen
Z echo shar: "will not over-write existing file 'ctimed.c'"
Zelse
Zsed 's/^X//' << \SHAR_EOF > 'ctimed.c'
ZX/*
ZX * Steven Schultz - sms@moe.2bsd.com
ZX *
ZX * @(#)ctimed.c 1.0 (2.11BSD) 1996/6/25
ZX *
ZX * ctimed - the daemon that supports the ctime() and getpw*() stubs
ZX * in 'libcstubs.a'.
ZX*/
ZX
ZX#include <signal.h>
ZX#include <stdio.h>
ZX#include <setjmp.h>
ZX#include <sys/ioctl.h>
ZX#include <sys/types.h>
ZX#include <sys/time.h>
ZX#include <pwd.h>
ZX#include <utmp.h>
ZX
ZX/*
ZX * These should probably be placed in an include file. If you add anything
ZX * here then you will also have to modify /usr/src/usr.lib/libstubs/stubs.c
ZX * (if for no other reason than to add the stub code).
ZX*/
ZX
ZX#define CTIME 1
ZX#define ASCTIME 2
ZX#define TZSET 3
ZX#define LOCALTIME 4
ZX#define GMTIME 5
ZX#define OFFTIME 6
ZX
ZX#define GETPWENT 7
ZX#define GETPWNAM 8
ZX#define GETPWUID 9
ZX#define SETPASSENT 10
ZX#define ENDPWENT 11
ZX
ZXextern struct tm *offtime();
ZX
ZX jmp_buf env;
ZX char *cp;
ZX char junk[256 + sizeof (struct passwd) + 4];
ZX long off;
ZX time_t l;
ZX void timeout(), checkppid();
ZX struct tm tmtmp, *tp;
ZX
ZXmain()
ZX {
ZX register int i;
ZX register struct passwd *pw;
ZX struct itimerval it;
ZX u_char c, xxx;
ZX int len, tosslen;
ZX uid_t uid;
ZX
ZX signal(SIGPIPE, SIG_DFL);
ZX for (i = getdtablesize(); --i > 2; )
ZX close(i);
ZX/*
ZX * Need a timer running while we disassociate from the control terminal
ZX * in case of a modem line which has lost carrier.
ZX*/
ZX timerclear(&it.it_interval);
ZX it.it_value.tv_sec = 5;
ZX it.it_value.tv_usec = 0;
ZX signal(SIGALRM, timeout);
ZX setitimer(ITIMER_REAL, &it, (struct itimerval *) NULL);
ZX if (setjmp(env) == 0)
ZX {
ZX i = open("/dev/tty", 0);
ZX if (i >= 0)
ZX {
ZX ioctl(i, TIOCNOTTY, NULL);
ZX close(i);
ZX }
ZX }
ZX/*
ZX * Now start a timer with one minute refresh. In the signal service
ZX * routine, check the parent process id to see if this process has
ZX * been orphaned and if so exit. This is primarily aimed at removing
ZX * the 'ctimed' process left behind by 'sendmail's multi-fork startup
ZX * but may prove useful in preventing accumulation of 'ctimed' processes
ZX * in other circumstances as well. Normally this process is short
ZX * lived.
ZX*/
ZX it.it_interval.tv_sec = 60;
ZX it.it_interval.tv_usec = 0;
ZX it.it_value.tv_sec = 60;
ZX it.it_value.tv_usec = 0;
ZX signal(SIGALRM, checkppid);
ZX setitimer(ITIMER_REAL, &it, (struct itimerval *) NULL);
ZX
ZX while (read(fileno(stdin), &c, 1) == 1)
ZX {
ZX switch (c)
ZX {
ZX case CTIME:
ZX l = 0L;
ZX getb(fileno(stdin), &l, sizeof l);
ZX cp = ctime(&l);
ZX write(fileno(stdout), cp, 26);
ZX break;
ZX case ASCTIME:
ZX getb(fileno(stdin), &tmtmp, sizeof tmtmp);
ZX cp = asctime(&tmtmp);
ZX write(fileno(stdout), cp, 26);
ZX break;
ZX case TZSET:
ZX (void) tzset();
ZX break;
ZX case LOCALTIME:
ZX l = 0L;
ZX getb(fileno(stdin), &l, sizeof l);
ZX tp = localtime(&l);
ZX write(fileno(stdout), tp, sizeof (*tp));
ZX strcpy(junk, tp->tm_zone);
ZX junk[24] = '\0';
ZX write(fileno(stdout), junk, 24);
ZX break;
ZX case GMTIME:
ZX l = 0L;
ZX getb(fileno(stdin), &l, sizeof l);
ZX tp = gmtime(&l);
ZX write(fileno(stdout), tp, sizeof (*tp));
ZX strcpy(junk, tp->tm_zone);
ZX junk[24] = '\0';
ZX write(fileno(stdout), junk, 24);
ZX break;
ZX case OFFTIME:
ZX getb(fileno(stdin), &l, sizeof l);
ZX getb(fileno(stdin), &off, sizeof off);
ZX#ifdef __bsdi__
ZX l += off;
ZX tp = localtime(&l);
ZX#else
ZX tp = offtime(&l, off);
ZX#endif
ZX write(fileno(stdout), tp, sizeof (*tp));
ZX break;
ZX case GETPWENT:
ZX pw = getpwent();
ZX do_pw(pw);
ZX break;
ZX case GETPWNAM:
ZX getb(fileno(stdin), &len, sizeof (int));
ZX if (len > UT_NAMESIZE)
ZX {
ZX tosslen = len - UT_NAMESIZE;
ZX len = UT_NAMESIZE;
ZX }
ZX else
ZX tosslen = 0;
ZX getb(fileno(stdin), junk, len);
ZX for (;tosslen; tosslen--)
ZX getb(fileno(stdin), &xxx, 1);
ZX junk[len] = '\0';
ZX pw = getpwnam(junk);
ZX do_pw(pw);
ZX break;
ZX case GETPWUID:
ZX getb(fileno(stdin), &uid, sizeof (uid_t));
ZX pw = getpwuid(uid);
ZX do_pw(pw);
ZX break;
ZX case SETPASSENT:
ZX getb(fileno(stdin), &len, sizeof (int));
ZX if (setpassent(len))
ZX len = 1;
ZX else
ZX len = 0;
ZX write(fileno(stdout), &len, sizeof (int));
ZX break;
ZX case ENDPWENT:
ZX endpwent();
ZX break;
ZX default:
ZX abort("switch");
ZX }
ZX }
ZX }
ZX
ZXgetb(f, p, n)
ZX int f;
ZX register char *p;
ZX register int n;
ZX {
ZX register int i;
ZX
ZX while (n)
ZX {
ZX i = read(f, p, n);
ZX if (i <= 0)
ZX return;
ZX p += i;
ZX n -= i;
ZX }
ZX }
ZX
ZXvoid
ZXtimeout()
ZX {
ZX
ZX longjmp(env, 1);
ZX }
ZX
ZXvoid
ZXcheckppid()
ZX {
ZX
ZX if (getppid() == 1)
ZX exit(0);
ZX }
ZX
ZXdo_pw(pw)
ZX struct passwd *pw;
ZX {
ZX int len;
ZX
ZX if (!pw)
ZX {
ZX len = 0;
ZX write(fileno(stdout), &len, sizeof (int));
ZX return;
ZX }
ZX len = packpwtobuf(pw, junk);
ZX write(fileno(stdout), &len, sizeof (int));
ZX write(fileno(stdout), pw, sizeof (*pw));
ZX write(fileno(stdout), junk, len);
ZX return;
ZX }
ZX
ZXpackpwtobuf(pw, buf)
ZX register struct passwd *pw;
ZX char *buf;
ZX {
ZX register char *cp = buf;
ZX register char *dp;
ZX
ZX dp = pw->pw_name;
ZX pw->pw_name = (char*) 0;
ZX while (*cp++ = *dp++)
ZX ;
ZX dp = pw->pw_passwd;
ZX pw->pw_passwd = (char*) (cp - buf);
ZX while (*cp++ = *dp++)
ZX ;
ZX dp = pw->pw_class;
ZX pw->pw_class = (char*) (cp - buf);
ZX while (*cp++ = *dp++)
ZX ;
ZX dp = pw->pw_gecos;
ZX pw->pw_gecos = (char*) (cp - buf);
ZX while (*cp++ = *dp++)
ZX ;
ZX dp = pw->pw_dir;
ZX pw->pw_dir = (char*) (cp - buf);
ZX while (*cp++ = *dp++)
ZX ;
ZX dp = pw->pw_shell;
ZX pw->pw_shell = (char*) (cp - buf);
ZX while (*cp++ = *dp++)
ZX ;
ZX return(cp - buf);
ZX }
ZSHAR_EOF
Zchmod 644 'ctimed.c'
Zfi
Zchmod 755 .
Zcd ..
Zchmod 755 .
Zcd ..
Zif test ! -d '/usr/src/usr.lib/libstubs'
Zthen
Z mkdir '/usr/src/usr.lib/libstubs'
Zfi
Zcd '/usr/src/usr.lib/libstubs'
Zif test -f 'stubtest.c'
Zthen
Z echo shar: "will not over-write existing file 'stubtest.c'"
Zelse
Zsed 's/^X//' << \SHAR_EOF > 'stubtest.c'
ZX#include <stdio.h>
ZX#include <sys/types.h>
ZX#include <pwd.h>
ZX#include <time.h>
ZX
ZXmain()
ZX {
ZX struct tm *tm;
ZX struct passwd *pw;
ZX char *cp;
ZX time_t l;
ZX uid_t uid;
ZX
ZX l = time(0);
ZX cp = ctime(&l);
ZX printf("ctime(%ld) = %s", l, cp);
ZX tm = gmtime(&l);
ZX dump_tm("gmtime", tm);
ZX cp = asctime(tm);
ZX printf("asctime(tm) = %s", cp);
ZX tm = localtime(&l);
ZX dump_tm("localtime", tm);
ZX
ZX if (setpassent(1))
ZX printf("setpassent(1) returned non-zero (success) status\n");
ZX else
ZX printf("setpassent(1) returned zero (shouldn't happen)\n");
ZX
ZX printf("getpwent\n");
ZX while (pw = getpwent())
ZX {
ZX dump_pw(pw);
ZX }
ZX printf("getpwnam(root)\n");
ZX pw = getpwnam("root");
ZX if (!pw)
ZX printf("OOPS - root doesn't apparently exist\n");
ZX else
ZX dump_pw(pw);
ZX printf("getpwnam(nobody)\n");
ZX pw = getpwnam("nobody");
ZX if (!pw)
ZX printf("OOPS - nobody doesn't apparently exist\n");
ZX uid = pw->pw_uid;
ZX printf("getpwuid\n");
ZX pw = getpwuid(uid);
ZX if (!pw)
ZX printf("OOPS - uid %u (from nobody) doesn't exist\n", uid);
ZX else
ZX dump_pw(pw);
ZX
ZX printf("endpwent\n");
ZX endpwent();
ZX }
ZX
ZXdump_tm(str, tm)
ZX char *str;
ZX struct tm *tm;
ZX {
ZX printf("%s sec: %d min: %d hr: %d mday: %d mon: %d yr: %d wday: %d yday: %d isdst: %d zone: %s gmtoff: %d\n",
ZX str,
ZX tm->tm_sec,
ZX tm->tm_min,
ZX tm->tm_hour,
ZX tm->tm_mday,
ZX tm->tm_mon,
ZX tm->tm_year,
ZX tm->tm_wday,
ZX tm->tm_yday,
ZX tm->tm_isdst,
ZX tm->tm_zone,
ZX tm->tm_gmtoff);
ZX }
ZX
ZXdump_pw(p)
ZX struct passwd *p;
ZX {
ZX printf("%s:%s:%u:%u:%s:%ld:%ld:%s:%s:%s\n",
ZX p->pw_name,
ZX p->pw_passwd,
ZX p->pw_uid, p->pw_gid,
ZX p->pw_class, p->pw_change, p->pw_expire,
ZX p->pw_gecos, p->pw_dir, p->pw_shell);
ZX }
ZSHAR_EOF
Zchmod 644 'stubtest.c'
Zfi
Zif test -f 'stubs.c'
Zthen
Z echo shar: "will not over-write existing file 'stubs.c'"
Zelse
Zsed 's/^X//' << \SHAR_EOF > 'stubs.c'
ZX#include <paths.h>
ZX#include <stdio.h>
ZX#include <sysexits.h>
ZX#include <varargs.h>
ZX
ZX#include <sys/types.h>
ZX#include <sys/time.h>
ZX#include <pwd.h>
ZX#include <utmp.h>
ZX
ZX#define SEND_FD W[1]
ZX#define RECV_FD R[0]
ZX
ZX#define CTIME 1
ZX#define ASCTIME 2
ZX#define TZSET 3
ZX#define LOCALTIME 4
ZX#define GMTIME 5
ZX#define OFFTIME 6
ZX
ZX#define GETPWENT 7
ZX#define GETPWNAM 8
ZX#define GETPWUID 9
ZX#define SETPASSENT 10
ZX#define ENDPWENT 11
ZX
ZX static int R[2], W[2], inited;
ZX static char result[256 + 4];
ZX static struct tm tmtmp;
ZX static struct passwd _pw, *getandfixpw();
ZX
ZXchar *
ZXctime(t)
ZX time_t *t;
ZX {
ZX u_char fnc = CTIME;
ZX
ZX sewer();
ZX write(SEND_FD, &fnc, sizeof fnc);
ZX write(SEND_FD, t, sizeof (*t));
ZX getb(RECV_FD, result, 26);
ZX return(result);
ZX }
ZX
ZXchar *
ZXasctime(tp)
ZX struct tm *tp;
ZX {
ZX u_char fnc = ASCTIME;
ZX
ZX sewer();
ZX write(SEND_FD, &fnc, sizeof fnc);
ZX write(SEND_FD, tp, sizeof (*tp));
ZX getb(RECV_FD, result, 26);
ZX return(result);
ZX }
ZX
ZXvoid
ZXtzset()
ZX {
ZX u_char fnc = TZSET;
ZX
ZX sewer();
ZX write(SEND_FD, &fnc, sizeof fnc);
ZX }
ZX
ZXstruct tm *
ZXlocaltime(tp)
ZX time_t *tp;
ZX {
ZX u_char fnc = LOCALTIME;
ZX
ZX sewer();
ZX write(SEND_FD, &fnc, sizeof fnc);
ZX write(SEND_FD, tp, sizeof (*tp));
ZX getb(RECV_FD, &tmtmp, sizeof tmtmp);
ZX getb(RECV_FD, result, 24);
ZX tmtmp.tm_zone = result;
ZX return(&tmtmp);
ZX }
ZX
ZXstruct tm *
ZXgmtime(tp)
ZX time_t *tp;
ZX {
ZX u_char fnc = GMTIME;
ZX
ZX sewer();
ZX write(SEND_FD, &fnc, sizeof fnc);
ZX write(SEND_FD, tp, sizeof (*tp));
ZX getb(RECV_FD, &tmtmp, sizeof tmtmp);
ZX getb(RECV_FD, result, 24);
ZX tmtmp.tm_zone = result;
ZX return(&tmtmp);
ZX }
ZX
ZXstruct tm *
ZXofftime(clock, offset)
ZX time_t *clock;
ZX long offset;
ZX {
ZX u_char fnc = OFFTIME;
ZX
ZX sewer();
ZX write(SEND_FD, &fnc, sizeof fnc);
ZX write(SEND_FD, clock, sizeof (*clock));
ZX write(SEND_FD, &offset, sizeof offset);
ZX getb(RECV_FD, &tmtmp, sizeof tmtmp);
ZX tmtmp.tm_zone = "";
ZX return(&tmtmp);
ZX }
ZX
ZXstruct passwd *
ZXgetpwent()
ZX {
ZX u_char fnc = GETPWENT;
ZX
ZX sewer();
ZX write(SEND_FD, &fnc, sizeof fnc);
ZX return(getandfixpw());
ZX }
ZX
ZXstruct passwd *
ZXgetpwnam(nam)
ZX char *nam;
ZX {
ZX u_char fnc = GETPWNAM;
ZX char lnam[UT_NAMESIZE + 1];
ZX int len;
ZX
ZX len = strlen(nam);
ZX if (len > UT_NAMESIZE)
ZX len = UT_NAMESIZE;
ZX bcopy(nam, lnam, len);
ZX lnam[len] = '\0';
ZX
ZX sewer();
ZX write(SEND_FD, &fnc, 1);
ZX write(SEND_FD, &len, sizeof (int));
ZX write(SEND_FD, lnam, len);
ZX return(getandfixpw());
ZX }
ZX
ZXstruct passwd *
ZXgetpwuid(uid)
ZX uid_t uid;
ZX {
ZX u_char fnc = GETPWUID;
ZX
ZX sewer();
ZX write(SEND_FD, &fnc, sizeof fnc);
ZX write(SEND_FD, &uid, sizeof (uid_t));
ZX return(getandfixpw());
ZX }
ZX
ZXsetpwent()
ZX {
ZX return(setpassent(0));
ZX }
ZX
ZXsetpassent(stayopen)
ZX int stayopen;
ZX {
ZX u_char fnc = SETPASSENT;
ZX int sts;
ZX
ZX sewer();
ZX write(SEND_FD, &fnc, sizeof fnc);
ZX write(SEND_FD, &stayopen, sizeof (int));
ZX getb(RECV_FD, &sts, sizeof (int));
ZX return(sts);
ZX }
ZX
ZXvoid
ZXendpwent()
ZX {
ZX u_char fnc = ENDPWENT;
ZX
ZX sewer();
ZX write(SEND_FD, &fnc, sizeof fnc);
ZX return;
ZX }
ZX
ZX/* setpwfile() is deprecated */
ZXvoid
ZXsetpwfile(file)
ZX char *file;
ZX {
ZX return;
ZX }
ZX
ZXstruct passwd *
ZXgetandfixpw()
ZX {
ZX short sz;
ZX
ZX getb(RECV_FD, &sz, sizeof (int));
ZX if (sz == 0)
ZX return(NULL);
ZX getb(RECV_FD, &_pw, sizeof (_pw));
ZX getb(RECV_FD, result, sz);
ZX _pw.pw_name += (int)result;
ZX _pw.pw_passwd += (int)result;
ZX _pw.pw_class += (int)result;
ZX _pw.pw_gecos += (int)result;
ZX _pw.pw_dir += (int)result;
ZX _pw.pw_shell += (int)result;
ZX return(&_pw);
ZX }
ZX
ZXgetb(f, p, n)
ZX register int f, n;
ZX register char *p;
ZX {
ZX int i;
ZX
ZX while (n)
ZX {
ZX i = read(f, p, n);
ZX if (i <= 0)
ZX return;
ZX p += i;
ZX n -= i;
ZX }
ZX }
ZX
ZXsewer()
ZX {
ZX register int pid, ourpid = getpid();
ZX
ZX if (inited == ourpid)
ZX return;
ZX if (inited)
ZX {
ZX close(SEND_FD);
ZX close(RECV_FD);
ZX }
ZX pipe(W);
ZX pipe(R);
ZX pid = vfork();
ZX if (pid == 0)
ZX { /* child */
ZX alarm(0); /* cancel alarms */
ZX dup2(W[0], 0); /* parent write side to our stdin */
ZX dup2(R[1], 1); /* parent read side to our stdout */
ZX close(SEND_FD); /* copies made, close the... */
ZX close(RECV_FD); /* originals now */
ZX execl(_PATH_CTIMED, "ctimed", 0);
ZX _exit(EX_OSFILE);
ZX }
ZX if (pid == -1)
ZX abort(); /* nothing else really to do */
ZX close(W[0]); /* close read side of SEND channel */
ZX close(R[1]); /* close write side of RECV channel */
ZX inited = ourpid; /* don't do this again in this proc */
ZX }
ZX
ZXXXctime()
ZX {
ZX
ZX if (SEND_FD)
ZX close(SEND_FD);
ZX if (RECV_FD)
ZX close(RECV_FD);
ZX SEND_FD = RECV_FD = 0;
ZX inited = 0;
ZX }
ZSHAR_EOF
Zchmod 644 'stubs.c'
Zfi
Zif test -f 'Makefile'
Zthen
Z echo shar: "will not over-write existing file 'Makefile'"
Zelse
Zsed 's/^X//' << \SHAR_EOF > 'Makefile'
ZX#
ZX# Public Domain. 1996/6/25 - Steven Schultz
ZX#
ZX# @(#)Makefile 1.0 (2.11BSD GTE) 1996/6/25
ZX#
ZXDEFS=
ZXCFLAGS=-O $(DEFS)
ZXTAGSFILE=tags
ZX
ZXall: libstubs.a libstubs_p.a
ZX
ZXlibstubs.a: stubs.c
ZX ${CC} -c ${CFLAGS} stubs.c
ZX ld -r -X -o libstubs.a stubs.o
ZX rm -f stubs.o
ZX
ZXlibstubs_p.a: stubs.c
ZX ${CC} -p -c ${CFLAGS} stubs.c
ZX ld -r -X -o libstubs_p.a stubs.o
ZX rm -f stubs.o
ZX
ZXinstall: all
ZX install -m 644 libstubs.a $(DESTDIR)/usr/lib
ZX install -m 644 libstubs_p.a $(DESTDIR)/usr/lib
ZX
ZXtags:
ZX ctags -a -f ${TAGSFILE} `pwd`/stubs.c
ZX
ZXclean:
ZX rm -f *.o libstubs.a libstubs_p.a
ZSHAR_EOF
Zchmod 644 'Makefile'
Zfi
Zchmod 755 .
Zcd ..
Zexit 0
Z# End of shell archive
SHAR_EOF
fi
exit 0
# End of shell archive