*BSD News Article 73551


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