NNTP 1.5.11 (11 Feburary 1991) patch release (part 4 of 4)

Stan Barber nntp at tmc.edu
Mon Feb 11 07:58:22 AEST 1991


#! /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 the files:
#	support
#	server
# This archive created: Sun Feb 10 14:30:48 1991
export PATH; PATH=/bin:$PATH
if test ! -d 'support'
then
	echo shar: creating directory "'support'"
	mkdir 'support'
fi
echo shar: entering directory "'support'"
cd 'support'
echo shar: extracting "'access_file'" '(799 characters)'
sed 's/^	X//' << \SHAR_EOF > 'access_file'
	X#
	X# Sample NNTP access file. 
	X# Note that "default" must be the first entry in the
	X# table. Order is important. Put the most restictive
	X# entried just behind "default"
	X#
	X# If you defined SUBNET when you compiled the server,
	X# this file can have subnets as well as class A, B, C
	X# networks, hosts, and domains.
	X#
	X# host/net		read/xfer/no	post/no
	X#
	X# by default, let anyone transfer news, but not read or post
	Xdefault			xfer		no
	X# bugs, a notorious undergraduate machine, is not allowed
	X# to read or post news at all.
	Xbugs.berkeley.edu	no		no
	X# ic can read and post news, but users on ic cannot read
	X# articles in the group ucb.postgres or any of its decendents
	X# (e.g., ucb.postgres.core)
	Xic			read		post	!ucb.postgres
	X# hosts on the Berkeley campus can read and post news
	X*.berkeley.edu		read		post
SHAR_EOF
if test 799 -ne "`wc -c < 'access_file'`"
then
	echo shar: error transmitting "'access_file'" '(should have been 799 characters)'
fi
echo shar: done with directory "'support'"
cd ..
if test ! -d 'server'
then
	echo shar: creating directory "'server'"
	mkdir 'server'
fi
echo shar: entering directory "'server'"
cd 'server'
echo shar: extracting "'server.pt2.diff'" '(28993 characters)'
if test -f 'server.pt2.diff'
then
	echo shar: will not over-write existing file "'server.pt2.diff'"
else
sed 's/^	X//' << \SHAR_EOF > 'server.pt2.diff'
	XIndex: Makefile
	XPrereq: 1.2
	X*** Makefile	Thu Jul  5 02:29:07 1990
	X--- ../../nntp/server/Makefile	Sat Dec 22 10:16:13 1990
	X***************
	X*** 1,4
	X! # $Header: Makefile,v 1.2 90/07/05 02:22:37 sob Exp $
	X  # Makefile for NNTP server
	X  #
	X  
	X
	X--- 1,4 -----
	X! # $Header: Makefile,v 1.3 90/12/22 10:16:02 sob Exp $
	X  # Makefile for NNTP server
	X  #
	X  
	X***************
	X*** 6,12
	X  	ahbs.o globals.o group.o help.o ihave.o list.o misc.o netaux.o \
	X  	newgroups.o newnews.o nextlast.o ngmatch.o post.o parsit.o scandir.o \
	X  	slave.o spawn.o strcasecmp.o subnet.o time.o xhdr.o fakesyslog.o \
	X! 	batch.o putenv.o auth.o ../common/version.o
	X  
	X  SRVRSRC = main.c serve.c access.c access_inet.c access_dnet.c active.c \
	X  	ahbs.c globals.c group.c help.c ihave.c list.c misc.c netaux.c \
	X
	X--- 6,12 -----
	X  	ahbs.o globals.o group.o help.o ihave.o list.o misc.o netaux.o \
	X  	newgroups.o newnews.o nextlast.o ngmatch.o post.o parsit.o scandir.o \
	X  	slave.o spawn.o strcasecmp.o subnet.o time.o xhdr.o fakesyslog.o \
	X! 	batch.o auth.o timer.o ../common/version.o
	X  
	X  SRVRSRC = main.c serve.c access.c access_inet.c access_dnet.c active.c \
	X  	ahbs.c globals.c group.c help.c ihave.c list.c misc.c netaux.c \
	X***************
	X*** 12,18
	X  	ahbs.c globals.c group.c help.c ihave.c list.c misc.c netaux.c \
	X  	newgroups.c newnews.c nextlast.c ngmatch.c post.c parsit.c scandir.c \
	X  	slave.c spawn.c strcasecmp.c subnet.c time.c xhdr.c fakesyslog.c \
	X! 	batch.c putenv.c auth.c ../common/version.c
	X  
	X  SRVRINC = common.h ../common/conf.h ../common/nntp.h
	X  
	X
	X--- 12,18 -----
	X  	ahbs.c globals.c group.c help.c ihave.c list.c misc.c netaux.c \
	X  	newgroups.c newnews.c nextlast.c ngmatch.c post.c parsit.c scandir.c \
	X  	slave.c spawn.c strcasecmp.c subnet.c time.c xhdr.c fakesyslog.c \
	X! 	batch.c auth.c timer.c ../common/version.c
	X  
	X  SRVRINC = common.h ../common/conf.h ../common/nntp.h timer.h
	X  
	X***************
	X*** 14,20
	X  	slave.c spawn.c strcasecmp.c subnet.c time.c xhdr.c fakesyslog.c \
	X  	batch.c putenv.c auth.c ../common/version.c
	X  
	X! SRVRINC = common.h ../common/conf.h ../common/nntp.h
	X  
	X  SRCS	= ${SRVRSRC}
	X  
	X
	X--- 14,20 -----
	X  	slave.c spawn.c strcasecmp.c subnet.c time.c xhdr.c fakesyslog.c \
	X  	batch.c auth.c timer.c ../common/version.c
	X  
	X! SRVRINC = common.h ../common/conf.h ../common/nntp.h timer.h
	X  
	X  SRCS	= ${SRVRSRC}
	X  
	X***************
	X*** 52,58
	X  	sccs prt -y *.[ch] > /dev/null
	X  
	X  tags:	${SRVRSRC} ${SRVRINC}
	X! 	ctags ${SRVRSRC} ${SRVRINC}
	X  
	X  # Dependencies
	X  
	X
	X--- 52,58 -----
	X  	sccs prt -y *.[ch] > /dev/null
	X  
	X  tags:	${SRVRSRC} ${SRVRINC}
	X! 	ctags -wt ${SRVRSRC} ${SRVRINC}
	X  
	X  # Dependencies
	X  
	X*** README	Thu Jul  5 02:29:07 1990
	X--- ../../nntp/server/README	Sun Oct 28 10:40:20 1990
	X***************
	X*** 48,54
	X  	      yellow pages.
	X  
	X  	      Don't forget to kill -HUP your inetd (or kill it and restart
	X!               it if you are on SunOS).
	X  
	X  	   If you're NOT using inetd,
	X  
	X
	X--- 48,54 -----
	X  	      yellow pages.
	X  
	X  	      Don't forget to kill -HUP your inetd (or kill it and restart
	X!               it if you are on SunOS prior to version 4.1).
	X  
	X  	   If you're NOT using inetd,
	X  
	X*** batch.c	Sat Aug 25 16:59:48 1990
	X--- ../../nntp/server/batch.c	Sun Jan 13 03:27:43 1991
	X***************
	X*** 1,5
	X  #ifndef lint
	X! static	char	*rcsid = "@(#)Header: batch.c,v 1.5 90/08/02 13:32:10 sob Exp $";
	X  #endif
	X  /*
	X   * Batch subroutine for Cnews.
	X
	X--- 1,5 -----
	X  #ifndef lint
	X! static	char	*rcsid = "@(#)$Header: batch.c,v 1.15 91/01/13 03:27:26 sob Exp $";
	X  #endif
	X  /*
	X   * Batch subroutine for Cnews.
	X***************
	X*** 30,37
	X  /* imports */
	X  extern time_t time();
	X  extern char *malloc(), *mktemp(), *index(), *rindex();
	X- extern char **myenviron;
	X- 
	X  /* forwards */
	X  static char *strsave();
	X  static int xfer_timeout();
	X
	X--- 30,35 -----
	X  /* imports */
	X  extern time_t time();
	X  extern char *malloc(), *mktemp(), *index(), *rindex();
	X  /* forwards */
	X  static char *strsave();
	X  #ifdef XFER_TIMEOUT
	X***************
	X*** 34,39
	X  
	X  /* forwards */
	X  static char *strsave();
	X  static int xfer_timeout();
	X  static int cpstdin();
	X  static int appbatch();
	X
	X--- 32,38 -----
	X  extern char *malloc(), *mktemp(), *index(), *rindex();
	X  /* forwards */
	X  static char *strsave();
	X+ #ifdef XFER_TIMEOUT
	X  static int xfer_timeout();
	X  #endif
	X  static int cpstdin();
	X***************
	X*** 35,40
	X  /* forwards */
	X  static char *strsave();
	X  static int xfer_timeout();
	X  static int cpstdin();
	X  static int appbatch();
	X  static int enqueue();
	X
	X--- 34,40 -----
	X  static char *strsave();
	X  #ifdef XFER_TIMEOUT
	X  static int xfer_timeout();
	X+ #endif
	X  static int cpstdin();
	X  static int appbatch();
	X  static int enqueue();
	X***************
	X*** 47,52
	X  static char *endart = art;		/* points just past end of article */
	X  static int incore = YES;
	X  
	X  static struct batch_file {
	X  	char *name;
	X  	FILE *file;
	X
	X--- 47,57 -----
	X  static char *endart = art;		/* points just past end of article */
	X  static int incore = YES;
	X  
	X+ #ifdef NONEWSRUN
	X+ static int uniq = 0;                    /* unique counter for this process */
	X+ static int in_batchdir = NO;
	X+ 
	X+ #endif /* NONEWSRUN */
	X  static struct batch_file {
	X  	char *name;
	X  	FILE *file;
	X***************
	X*** 53,58
	X  	char isopen;
	X  	time_t start;			/* time of creation */
	X  	off_t size;			/* current size */
	X  } btch = { NULL, NULL, NO, 0, 0 };
	X  
	X  /*
	X
	X--- 58,64 -----
	X  	char isopen;
	X  	time_t start;			/* time of creation */
	X  	off_t size;			/* current size */
	X+ 	int arts;			/* number of articles */
	X  } btch = { NULL, NULL, NO, 0, 0 };
	X  
	X  /*
	X***************
	X*** 68,74
	X   *		Can time out if XFER_TIMEOUT is defined.
	X   */
	X  int
	X! batch_input_article(cont_code, err_code, errbuf)
	X  int cont_code, err_code;
	X  char *errbuf;
	X  {
	X
	X--- 74,80 -----
	X   *		Can time out if XFER_TIMEOUT is defined.
	X   */
	X  int
	X! batch_input_article(cont_code, err_code, errbuf, msg_id)
	X  int cont_code, err_code;
	X  char *errbuf;
	X  char *msg_id;
	X***************
	X*** 71,76
	X  batch_input_article(cont_code, err_code, errbuf)
	X  int cont_code, err_code;
	X  char *errbuf;
	X  {
	X  	int status = 1;			/* okay status */
	X  
	X
	X--- 77,83 -----
	X  batch_input_article(cont_code, err_code, errbuf, msg_id)
	X  int cont_code, err_code;
	X  char *errbuf;
	X+ char *msg_id;
	X  {
	X  	int status = 1;			/* okay status */
	X  
	X***************
	X*** 79,84
	X  	signal(SIGQUIT, SIG_IGN);
	X  	signal(SIGHUP, SIG_IGN);
	X  
	X  	if (btch.name == NULL) {
	X  		/* BATCH_FILE may trigger unprivileged() */
	X  		btch.name = mktemp(strsave(BATCH_FILE));
	X
	X--- 86,102 -----
	X  	signal(SIGQUIT, SIG_IGN);
	X  	signal(SIGHUP, SIG_IGN);
	X  
	X+ #ifdef NONEWSRUN
	X+ 	/* This really should be done in main.c so that we don't have to
	X+ 	   check each time we get a new article - sigh */
	X+ 
	X+ 	if (!in_batchdir)
	X+ 		if (chdir(INDIR) < 0)
	X+ 			syslog(LOG_ERR, "chdir(%s) failed", INDIR);
	X+ 		else
	X+ 			in_batchdir = YES;
	X+ 
	X+ #endif /* NONEWSRUN */
	X  	if (btch.name == NULL) {
	X  		/* BATCH_FILE may trigger unprivileged() */
	X  		btch.name = mktemp(strsave(BATCH_FILE));
	X***************
	X*** 89,95
	X  #ifdef UMASK
	X  	(void) umask(UMASK);
	X  #endif
	X! 	if (!cpstdin(cont_code, err_code, errbuf)) /* may create tempfile */
	X  		return 0;
	X  #ifdef POSTER
	X  	if (tempfile[0])
	X
	X--- 107,114 -----
	X  #ifdef UMASK
	X  	(void) umask(UMASK);
	X  #endif
	X! 	/* may create tempfile */
	X! 	if (!cpstdin(cont_code, err_code, errbuf, msg_id))
	X  		return 0;
	X  #ifdef POSTER
	X  	if (tempfile[0])
	X***************
	X*** 96,101
	X  		(void) chown(tempfile, uid_poster, gid_poster);
	X  #endif
	X  	status = appbatch();
	X  	if (tempfile[0] != '\0')
	X  		(void) unlink(tempfile);
	X  	if (status == 1 && oktorunbatch())
	X
	X--- 115,121 -----
	X  		(void) chown(tempfile, uid_poster, gid_poster);
	X  #endif
	X  	status = appbatch();
	X+ 	btch.arts++;
	X  	if (tempfile[0] != '\0')
	X  		(void) unlink(tempfile);
	X  	if (status == 1 && oktorunbatch())
	X***************
	X*** 111,118
	X  	if (!btch.isopen || fstat(fileno(btch.file), &stbuf) < 0)
	X  		return NO;
	X  	btch.size = stbuf.st_size;
	X! 	return btch.size > TOOBIG ||
	X! 		btch.size > 0 && time((time_t *)NULL) - btch.start > TOOOLD;
	X  }
	X  
	X  /*
	X
	X--- 131,138 -----
	X  	if (!btch.isopen || fstat(fileno(btch.file), &stbuf) < 0)
	X  		return NO;
	X  	btch.size = stbuf.st_size;
	X! 	return(btch.arts >= TOOMANY || btch.size > TOOBIG ||
	X! 	    btch.size > 0 && time((time_t *)NULL) - btch.start > TOOOLD);
	X  }
	X  
	X  /*
	X***************
	X*** 121,127
	X   */
	X  /* ARGSUSED errbuf */
	X  static int					/* boolean: got article ok? */
	X! cpstdin(cont_code, err_code, errbuf)
	X  int cont_code, err_code;
	X  char *errbuf;
	X  {
	X
	X--- 141,147 -----
	X   */
	X  /* ARGSUSED errbuf */
	X  static int					/* boolean: got article ok? */
	X! cpstdin(cont_code, err_code, errbuf, msg_id)
	X  int cont_code, err_code;
	X  char *errbuf, *msg_id;
	X  {
	X***************
	X*** 123,129
	X  static int					/* boolean: got article ok? */
	X  cpstdin(cont_code, err_code, errbuf)
	X  int cont_code, err_code;
	X! char *errbuf;
	X  {
	X  	register FILE *tfp = NULL;
	X  	register char *cp, *realline;
	X
	X--- 143,149 -----
	X  static int					/* boolean: got article ok? */
	X  cpstdin(cont_code, err_code, errbuf, msg_id)
	X  int cont_code, err_code;
	X! char *errbuf, *msg_id;
	X  {
	X  	register FILE *tfp = NULL;
	X  	register char *cp, *realline;
	X***************
	X*** 206,213
	X  			(void) unlink(tempfile);
	X  #ifdef SYSLOG
	X  #ifdef LOG
	X! 		syslog(LOG_ERR, "%s spawn: EOF before period on line by itself",
	X! 			hostname);
	X  #else
	X  		syslog(LOG_ERR, "spawn: EOF before period on line by itself");
	X  #endif
	X
	X--- 226,234 -----
	X  			(void) unlink(tempfile);
	X  #ifdef SYSLOG
	X  #ifdef LOG
	X! 		syslog(LOG_ERR,
	X! 		    "%s cpstdin: EOF before period on line by itself %s",
	X! 			hostname, msg_id);
	X  #else
	X  		syslog(LOG_ERR,
	X  		    "cpstdin: EOF before period on line by itself %s", msg_id);
	X***************
	X*** 209,215
	X  		syslog(LOG_ERR, "%s spawn: EOF before period on line by itself",
	X  			hostname);
	X  #else
	X! 		syslog(LOG_ERR, "spawn: EOF before period on line by itself");
	X  #endif
	X  #endif
	X  		return 0;
	X
	X--- 230,237 -----
	X  		    "%s cpstdin: EOF before period on line by itself %s",
	X  			hostname, msg_id);
	X  #else
	X! 		syslog(LOG_ERR,
	X! 		    "cpstdin: EOF before period on line by itself %s", msg_id);
	X  #endif
	X  #endif
	X  		return 0;
	X***************
	X*** 259,265
	X  		btch.file = fopen(btch.name, "a");
	X  		if (btch.file == NULL) {
	X  #ifdef SYSLOG
	X! 			syslog(LOG_ERR,"appbatch(): %s: %m", btch.name);
	X  #endif
	X  			return 0;
	X  		}
	X
	X--- 281,287 -----
	X  		btch.file = fopen(btch.name, "a");
	X  		if (btch.file == NULL) {
	X  #ifdef SYSLOG
	X! 			syslog(LOG_ERR,"appbatch: fopen: %s: %m", btch.name);
	X  #endif
	X  			return 0;
	X  		}
	X***************
	X*** 264,270
	X  			return 0;
	X  		}
	X  		btch.isopen = YES;
	X- 		btch.size = 0;
	X  		btch.start = time(&btch.start);
	X  	}
	X  
	X
	X--- 286,291 -----
	X  			return 0;
	X  		}
	X  		btch.isopen = YES;
	X  		btch.start = time(&btch.start);
	X  		btch.size = 0;
	X  		btch.arts = 0;
	X***************
	X*** 266,271
	X  		btch.isopen = YES;
	X  		btch.size = 0;
	X  		btch.start = time(&btch.start);
	X  	}
	X  
	X  	/* find article size and write the article */
	X
	X--- 287,294 -----
	X  		}
	X  		btch.isopen = YES;
	X  		btch.start = time(&btch.start);
	X+ 		btch.size = 0;
	X+ 		btch.arts = 0;
	X  	}
	X  
	X  	/* find article size and write the article */
	X***************
	X*** 278,284
	X  		if (fstat(fileno(tfp), &stbuf) >= 0)
	X  			size = stbuf.st_size;
	X  	}
	X! 	(void) fprintf(btch.file, "#! rnews %ld\n", size);
	X  
	X  	/* copy the article to the batch file */
	X  	if (incore)
	X
	X--- 301,307 -----
	X  		if (fstat(fileno(tfp), &stbuf) >= 0)
	X  			size = stbuf.st_size;
	X  	}
	X! 	(void) fprintf(btch.file, "#! rnews %ld %s\n", size, hostname);
	X  
	X  	/* copy the article to the batch file */
	X  	if (incore)
	X***************
	X*** 287,293
	X  		while ((bytes = fread(artbuf, 1, sizeof artbuf, tfp)) > 0)
	X  			if (fwrite(artbuf, 1, bytes, btch.file) != bytes) {
	X  #ifdef SYSLOG
	X! 				syslog(LOG_ERR,"can't write %s", btch.name);
	X  #endif
	X  				status = 0;	/* hmm, #! count is off */
	X  				break;
	X
	X--- 310,318 -----
	X  		while ((bytes = fread(artbuf, 1, sizeof artbuf, tfp)) > 0)
	X  			if (fwrite(artbuf, 1, bytes, btch.file) != bytes) {
	X  #ifdef SYSLOG
	X! 				syslog(LOG_ERR,
	X! 				    "enqueue: fwrite can't write %s",
	X! 				    btch.name);
	X  #endif
	X  				status = 0;	/* hmm, #! count is off */
	X  				break;
	X***************
	X*** 296,302
	X  	}
	X  	if (fflush(btch.file) == EOF) {
	X  #ifdef SYSLOG
	X! 		syslog(LOG_ERR,"can't write %s", btch.name);
	X  #endif
	X  		status = 0;
	X  	}
	X
	X--- 321,327 -----
	X  	}
	X  	if (fflush(btch.file) == EOF) {
	X  #ifdef SYSLOG
	X! 		syslog(LOG_ERR, "enqueue: fflush: %s", btch.name);
	X  #endif
	X  		status = 0;
	X  	}
	X***************
	X*** 338,343
	X  	int pid, wpid, status, fd, exitstat;
	X  	char permname[MAXDIGITS], *number = permname, *newsrun;
	X  	struct stat stbuf;
	X  
	X  	(void) fclose(btch.file);
	X  	btch.file = NULL;
	X
	X--- 363,374 -----
	X  	int pid, wpid, status, fd, exitstat;
	X  	char permname[MAXDIGITS], *number = permname, *newsrun;
	X  	struct stat stbuf;
	X+ #ifdef POSTER
	X+ 	char *envp[4], user[sizeof(POSTER) + 5], logname[sizeof(POSTER) + 8];
	X+ 	char *home;
	X+ #else
	X+ 	char *envp[1];
	X+ #endif
	X  
	X  	if (fclose(btch.file) != 0) {
	X  #ifdef SYSLOG
	X***************
	X*** 339,345
	X  	char permname[MAXDIGITS], *number = permname, *newsrun;
	X  	struct stat stbuf;
	X  
	X! 	(void) fclose(btch.file);
	X  	btch.file = NULL;
	X  	btch.isopen = NO;
	X  	btch.start = 0;
	X
	X--- 370,380 -----
	X  	char *envp[1];
	X  #endif
	X  
	X! 	if (fclose(btch.file) != 0) {
	X! #ifdef SYSLOG
	X! 		syslog(LOG_ERR, "enqueue: fclose: %m");
	X! #endif
	X! 	}
	X  	btch.file = NULL;
	X  	btch.isopen = NO;
	X  	btch.start = 0;
	X***************
	X*** 344,349
	X  	btch.isopen = NO;
	X  	btch.start = 0;
	X  	btch.size = 0;
	X  
	X  	(void) fflush(stdout);
	X  	(void) fflush(stderr);
	X
	X--- 379,385 -----
	X  	btch.isopen = NO;
	X  	btch.start = 0;
	X  	btch.size = 0;
	X+ 	btch.arts = 0;
	X  
	X  	(void) fflush(stdout);
	X  	(void) fflush(stderr);
	X***************
	X*** 347,352
	X  
	X  	(void) fflush(stdout);
	X  	(void) fflush(stderr);
	X  	pid = fork();
	X  	if (pid == -1) {
	X  #ifdef SYSLOG
	X
	X--- 383,389 -----
	X  
	X  	(void) fflush(stdout);
	X  	(void) fflush(stderr);
	X+ #ifndef NONEWSRUN
	X  	pid = fork();
	X  	if (pid == -1) {
	X  #ifdef SYSLOG
	X***************
	X*** 350,356
	X  	pid = fork();
	X  	if (pid == -1) {
	X  #ifdef SYSLOG
	X! 		syslog(LOG_ERR,"can't fork");
	X  #endif
	X  		return 0;
	X  	} else if (pid != 0) {			/* parent */
	X
	X--- 387,393 -----
	X  	pid = fork();
	X  	if (pid == -1) {
	X  #ifdef SYSLOG
	X! 		syslog(LOG_ERR, "enqueue: fork: %m");
	X  #endif
	X  		return 0;
	X  	} else if (pid != 0) {			/* parent */
	X***************
	X*** 365,370
	X  #endif
	X  		return exitstat != 0? -1 :1;
	X  	}
	X  #ifdef POSTER
	X  #ifndef USG
	X  		if (getuid() == 0) initgroups(POSTER,gid_poster);
	X
	X--- 402,408 -----
	X  #endif
	X  		return exitstat != 0? -1 :1;
	X  	}
	X+ #endif /* NONEWSRUN */
	X  #ifdef POSTER
	X  #ifndef USG
	X  		if (getuid() == 0) initgroups(POSTER,gid_poster);
	X***************
	X*** 369,375
	X  #ifndef USG
	X  		if (getuid() == 0) initgroups(POSTER,gid_poster);
	X  #endif
	X- 		(void) setuid(uid_poster);
	X  		(void) setgid(gid_poster);
	X  #endif
	X  
	X
	X--- 407,412 -----
	X  #ifndef USG
	X  		if (getuid() == 0) initgroups(POSTER,gid_poster);
	X  #endif
	X  		(void) setgid(gid_poster);
	X  		(void) setuid(uid_poster);
	X  #endif
	X***************
	X*** 371,376
	X  #endif
	X  		(void) setuid(uid_poster);
	X  		(void) setgid(gid_poster);
	X  #endif
	X  
	X  	/* child: must exit */
	X
	X--- 408,414 -----
	X  		if (getuid() == 0) initgroups(POSTER,gid_poster);
	X  #endif
	X  		(void) setgid(gid_poster);
	X+ 		(void) setuid(uid_poster);
	X  #endif
	X  #ifndef NONEWSRUN
	X  	/* child: must exit */
	X***************
	X*** 372,378
	X  		(void) setuid(uid_poster);
	X  		(void) setgid(gid_poster);
	X  #endif
	X! 
	X  	/* child: must exit */
	X  #ifdef SYSLOG
	X  	/* Close in such a way that syslog() will know to reopen */
	X
	X--- 410,416 -----
	X  		(void) setgid(gid_poster);
	X  		(void) setuid(uid_poster);
	X  #endif
	X! #ifndef NONEWSRUN
	X  	/* child: must exit */
	X  #ifdef SYSLOG
	X  	/* Close in such a way that syslog() will know to reopen */
	X***************
	X*** 382,388
	X  		(void) close(fd);
	X  	if (chdir(INDIR) < 0) {
	X  #ifdef SYSLOG
	X! 		syslog(LOG_ERR, "chdir(%s) failed", INDIR);
	X  #else
	X  		;
	X  #endif
	X
	X--- 420,426 -----
	X  		(void) close(fd);
	X  	if (chdir(INDIR) < 0) {
	X  #ifdef SYSLOG
	X! 		syslog(LOG_ERR, "enqueue: chdir(%s): %m", INDIR);
	X  #else
	X  		;
	X  #endif
	X***************
	X*** 390,395
	X  
	X  	/* rename btch.name to a number so newsrun will see it */
	X  	sprintf(number, "%ld", (long)time(&now));
	X  	while (link(btch.name, permname) < 0) {
	X  		if (stat(btch.name, &stbuf) < 0)
	X  			break;
	X
	X--- 428,436 -----
	X  
	X  	/* rename btch.name to a number so newsrun will see it */
	X  	sprintf(number, "%ld", (long)time(&now));
	X+ #else
	X+ 	sprintf(number, "%d.%d", getpid(), uniq++);
	X+ #endif /* NONEWSRUN */
	X  	while (link(btch.name, permname) < 0) {
	X  		if (stat(btch.name, &stbuf) < 0)
	X  			break;
	X***************
	X*** 394,399
	X  		if (stat(btch.name, &stbuf) < 0)
	X  			break;
	X  		sleep(2);
	X  		sprintf(number, "%ld", (long)time(&now));
	X  	}
	X  	if (unlink(btch.name) < 0)
	X
	X--- 435,441 -----
	X  		if (stat(btch.name, &stbuf) < 0)
	X  			break;
	X  		sleep(2);
	X+ #ifndef NONEWSRUN
	X  		sprintf(number, "%ld", (long)time(&now));
	X  #else
	X  		sprintf(number, "%d.%d", getpid(), uniq++);
	X***************
	X*** 395,400
	X  			break;
	X  		sleep(2);
	X  		sprintf(number, "%ld", (long)time(&now));
	X  	}
	X  	if (unlink(btch.name) < 0)
	X  #ifdef SYSLOG
	X
	X--- 437,445 -----
	X  		sleep(2);
	X  #ifndef NONEWSRUN
	X  		sprintf(number, "%ld", (long)time(&now));
	X+ #else
	X+ 		sprintf(number, "%d.%d", getpid(), uniq++);
	X+ #endif /* NONEWSRUN */
	X  	}
	X  	if (unlink(btch.name) < 0) {
	X  #ifdef SYSLOG
	X***************
	X*** 396,402
	X  		sleep(2);
	X  		sprintf(number, "%ld", (long)time(&now));
	X  	}
	X! 	if (unlink(btch.name) < 0)
	X  #ifdef SYSLOG
	X  		syslog(LOG_ERR, "cannot find %s", btch.name);
	X  #else
	X
	X--- 441,447 -----
	X  		sprintf(number, "%d.%d", getpid(), uniq++);
	X  #endif /* NONEWSRUN */
	X  	}
	X! 	if (unlink(btch.name) < 0) {
	X  #ifdef SYSLOG
	X  		syslog(LOG_ERR, "enqueue: cannot unlink %s: %m", btch.name);
	X  #endif
	X***************
	X*** 398,406
	X  	}
	X  	if (unlink(btch.name) < 0)
	X  #ifdef SYSLOG
	X! 		syslog(LOG_ERR, "cannot find %s", btch.name);
	X! #else
	X! 		;
	X  #endif
	X  
	X  	signal(SIGINT, SIG_IGN);
	X
	X--- 443,449 -----
	X  	}
	X  	if (unlink(btch.name) < 0) {
	X  #ifdef SYSLOG
	X! 		syslog(LOG_ERR, "enqueue: cannot unlink %s: %m", btch.name);
	X  #endif
	X  	}
	X  #ifndef NONEWSRUN
	X***************
	X*** 402,407
	X  #else
	X  		;
	X  #endif
	X  
	X  	signal(SIGINT, SIG_IGN);
	X  	signal(SIGQUIT, SIG_IGN);
	X
	X--- 445,452 -----
	X  #ifdef SYSLOG
	X  		syslog(LOG_ERR, "enqueue: cannot unlink %s: %m", btch.name);
	X  #endif
	X+ 	}
	X+ #ifndef NONEWSRUN
	X  
	X  	signal(SIGINT, SIG_IGN);
	X  	signal(SIGQUIT, SIG_IGN);
	X***************
	X*** 411,417
	X  	newsrun = strsave(NEWSRUN);
	X  	if (newsrun == NULL)
	X  		newsrun = "/usr/lib/newsbin/input/newsrun";
	X! 	execle(newsrun, newsrun, (char *)NULL, myenviron);
	X  #ifdef SYSLOG
	X  	syslog(LOG_ERR, "enqueue: execle(%s): %m", newsrun);
	X  #endif
	X
	X--- 456,481 -----
	X  	newsrun = strsave(NEWSRUN);
	X  	if (newsrun == NULL)
	X  		newsrun = "/usr/lib/newsbin/input/newsrun";
	X! 
	X! 	/* Empty environment keeps cnews inews from telling lies */
	X! #ifdef POSTER
	X! 	sprintf(user, "USER=%s", POSTER);
	X! 	sprintf(logname, "LOGNAME=%s", POSTER);
	X! 	if ((home = (char *)malloc(strlen(home_poster)+5)) != NULL)
	X! 		sprintf(home, "HOME=%s", home_poster);
	X! 	envp[0] = user;
	X! 	envp[1] = logname;
	X! 	envp[2] = home;
	X! 	envp[3] = 0;
	X! #else
	X! 	envp[0] = 0;
	X! #endif
	X! #ifdef USG
	X!  	/* execle() fails because newsrun is a shell procedure */
	X!  	execle("/bin/sh", "sh", newsrun, (char *)NULL, envp);
	X! #else
	X! 	execle(newsrun, newsrun, (char *)NULL, envp);
	X! #endif
	X  #ifdef SYSLOG
	X  	syslog(LOG_ERR, "enqueue: execle(%s): %m", newsrun);
	X  #endif
	X***************
	X*** 417,422
	X  #endif
	X  	exit(1);
	X  	/* NOTREACHED */
	X  }
	X  static char *
	X  strsave(s)
	X
	X--- 481,489 -----
	X  #endif
	X  	exit(1);
	X  	/* NOTREACHED */
	X+ #else
	X+ 	return(1);
	X+ #endif /* NONEWSRUN */
	X  }
	X  
	X  static char *
	X***************
	X*** 418,423
	X  	exit(1);
	X  	/* NOTREACHED */
	X  }
	X  static char *
	X  strsave(s)
	X  register char *s;
	X
	X--- 485,491 -----
	X  	return(1);
	X  #endif /* NONEWSRUN */
	X  }
	X+ 
	X  static char *
	X  strsave(s)
	X  register char *s;
	XIndex: common.h
	XPrereq: 1.33
	X*** common.h	Sat Aug 25 17:00:35 1990
	X--- ../../nntp/server/common.h	Sat Feb  2 15:55:37 1991
	X***************
	X*** 1,7
	X  /*
	X   * Common declarations, includes, and other goodies.
	X   *
	X!  * @(#)$Header: common.h,v 1.33 90/08/25 17:00:11 sob Exp $
	X   */
	X  
	X  
	X
	X--- 1,7 -----
	X  /*
	X   * Common declarations, includes, and other goodies.
	X   *
	X!  * @(#)$Header: common.h,v 1.38 91/02/02 15:55:21 sob Exp $
	X   */
	X  
	X  
	X***************
	X*** 5,10
	X   */
	X  
	X  
	X  #include <stdio.h>
	X  #include <sys/types.h>
	X  #include <sys/stat.h>
	X
	X--- 5,11 -----
	X   */
	X  
	X  
	X+ #include "../common/conf.h"
	X  #include <stdio.h>
	X  #ifndef BSD_42
	X  #include <sys/types.h>
	X***************
	X*** 6,11
	X  
	X  
	X  #include <stdio.h>
	X  #include <sys/types.h>
	X  #include <sys/stat.h>
	X  #include <errno.h>
	X
	X--- 7,13 -----
	X  
	X  #include "../common/conf.h"
	X  #include <stdio.h>
	X+ #ifndef BSD_42
	X  #include <sys/types.h>
	X  #endif /* BSD_42 */
	X  #include <sys/param.h>
	X***************
	X*** 7,12
	X  
	X  #include <stdio.h>
	X  #include <sys/types.h>
	X  #include <sys/stat.h>
	X  #include <errno.h>
	X  #include <ctype.h>
	X
	X--- 9,16 -----
	X  #include <stdio.h>
	X  #ifndef BSD_42
	X  #include <sys/types.h>
	X+ #endif /* BSD_42 */
	X+ #include <sys/param.h>
	X  #include <sys/stat.h>
	X  #include <errno.h>
	X  #include <ctype.h>
	X***************
	X*** 12,18
	X  #include <ctype.h>
	X  #include <pwd.h>
	X  #include <sys/file.h>
	X- #include <sys/param.h>
	X  #ifdef BSD2_10
	X  #include <short_names.h>
	X  #endif BSD2_10
	X
	X--- 16,21 -----
	X  #include <ctype.h>
	X  #include <pwd.h>
	X  #include <sys/file.h>
	X  #ifdef BSD2_10
	X  #include <short_names.h>
	X  #endif /* BSD2_10 */
	X***************
	X*** 15,21
	X  #include <sys/param.h>
	X  #ifdef BSD2_10
	X  #include <short_names.h>
	X! #endif BSD2_10
	X  
	X  #include "../common/nntp.h"
	X  #include "../common/conf.h"
	X
	X--- 18,24 -----
	X  #include <sys/file.h>
	X  #ifdef BSD2_10
	X  #include <short_names.h>
	X! #endif /* BSD2_10 */
	X  
	X  #include "../common/nntp.h"
	X  
	X***************
	X*** 18,24
	X  #endif BSD2_10
	X  
	X  #include "../common/nntp.h"
	X- #include "../common/conf.h"
	X  
	X  #ifdef SYSLOG
	X  # ifdef FAKESYSLOG
	X
	X--- 21,26 -----
	X  #endif /* BSD2_10 */
	X  
	X  #include "../common/nntp.h"
	X  
	X  #ifdef SYSLOG
	X  # ifdef FAKESYSLOG
	X***************
	X*** 32,38
	X  extern struct passwd *getpwent(), *getpwuid(), *getpwnam();
	X  #define iolen_t unsigned
	X  # include <string.h>
	X! #else not USG
	X  # include <strings.h>
	X  # include <sys/wait.h>
	X  #define iolen_t int
	X
	X--- 34,40 -----
	X  extern struct passwd *getpwent(), *getpwuid(), *getpwnam();
	X  #define iolen_t unsigned
	X  # include <string.h>
	X! #else /* not USG */
	X  # include <strings.h>
	X  # include <sys/wait.h>
	X  #define iolen_t int
	X***************
	X*** 36,42
	X  # include <strings.h>
	X  # include <sys/wait.h>
	X  #define iolen_t int
	X! #endif not USG
	X  
	X  #ifdef NDIR
	X  #ifdef M_XENIX
	X
	X--- 38,44 -----
	X  # include <strings.h>
	X  # include <sys/wait.h>
	X  #define iolen_t int
	X! #endif /* not USG */
	X  
	X  #ifdef NDIR
	X  #ifdef M_XENIX
	X***************
	X*** 44,50
	X  #else
	X  # include <ndir.h>
	X  #endif
	X! #else not NDIR
	X  # include <sys/dir.h>
	X  #endif not NDIR
	X  
	X
	X--- 46,52 -----
	X  #else
	X  # include <ndir.h>
	X  #endif
	X! #else /* not NDIR */
	X  # include <sys/dir.h>
	X  #endif /* not NDIR */
	X  
	X***************
	X*** 46,52
	X  #endif
	X  #else not NDIR
	X  # include <sys/dir.h>
	X! #endif not NDIR
	X  
	X  #ifdef FCNTL
	X  # include <fcntl.h>
	X
	X--- 48,54 -----
	X  #endif
	X  #else /* not NDIR */
	X  # include <sys/dir.h>
	X! #endif /* not NDIR */
	X  
	X  #ifdef FCNTL
	X  # include <fcntl.h>
	X***************
	X*** 50,56
	X  
	X  #ifdef FCNTL
	X  # include <fcntl.h>
	X! #endif FCNTL
	X  
	X  #ifdef ultrix
	X  extern char * index();
	X
	X--- 52,58 -----
	X  
	X  #ifdef FCNTL
	X  # include <fcntl.h>
	X! #endif /* FCNTL */
	X  
	X  #ifdef ultrix
	X  extern char * index();
	X***************
	X*** 71,76
	X  #  undef NULL
	X  #  define NULL	0
	X  # endif /* DBZ */
	X  #endif /* DBM */
	X  
	X  #ifdef NDBM
	X
	X--- 73,82 -----
	X  #  undef NULL
	X  #  define NULL	0
	X  # endif /* DBZ */
	X+ #else
	X+ # ifdef NDBM
	X+ #  include <ndbm.h>
	X+ # endif /* NDBM */
	X  #endif /* DBM */
	X  
	X  #ifdef TIMEOUT
	X***************
	X*** 73,80
	X  # endif /* DBZ */
	X  #endif /* DBM */
	X  
	X! #ifdef NDBM
	X! # include <ndbm.h>
	X  #endif
	X  /*
	X   * Some generic maximums.
	X
	X--- 79,87 -----
	X  # endif /* NDBM */
	X  #endif /* DBM */
	X  
	X! #ifdef TIMEOUT
	X! #ifndef TIMERS
	X! #define TIMERS
	X  #endif
	X  #endif
	X  
	X***************
	X*** 76,81
	X  #ifdef NDBM
	X  # include <ndbm.h>
	X  #endif
	X  /*
	X   * Some generic maximums.
	X   */
	X
	X--- 83,102 -----
	X  #ifndef TIMERS
	X  #define TIMERS
	X  #endif
	X+ #endif
	X+ 
	X+ #ifdef LOGINCHECK
	X+ #ifndef TIMERS
	X+ #define TIMERS
	X+ #endif
	X+ #endif
	X+ 
	X+ #ifdef BATCHCHECK
	X+ #ifndef TIMERS
	X+ #define TIMERS
	X+ #endif
	X+ #endif
	X+ 
	X  /*
	X   * Some generic maximums.
	X   */
	X***************
	X*** 82,88
	X  
	X  #ifndef MAXPATHLEN
	X  #define	MAXPATHLEN	1024
	X! #endif not MAXPATHLEN
	X  
	X  #ifndef MAXHOSTNAMELEN
	X  #define	MAXHOSTNAMELEN	256
	X
	X--- 103,109 -----
	X  
	X  #ifndef MAXPATHLEN
	X  #define	MAXPATHLEN	1024
	X! #endif
	X  
	X  #ifndef MAXHOSTNAMELEN
	X  #define	MAXHOSTNAMELEN	256
	X***************
	X*** 86,92
	X  
	X  #ifndef MAXHOSTNAMELEN
	X  #define	MAXHOSTNAMELEN	256
	X! #endif not MAXHOSTNAMELEN
	X  
	X  #ifndef MINFREE
	X  #define MINFREE         0
	X
	X--- 107,113 -----
	X  
	X  #ifndef MAXHOSTNAMELEN
	X  #define	MAXHOSTNAMELEN	256
	X! #endif
	X  
	X  #ifndef MINFREE
	X  #define MINFREE         0
	X***************
	X*** 126,131
	X  extern	char	*gethistent();
	X  extern	int	restreql();
	X  extern	int	s1strneql();	/* for ngmatch */
	X  
	X  extern	char	spooldir[];
	X  extern	char	activefile[];
	X
	X--- 147,158 -----
	X  extern	char	*gethistent();
	X  extern	int	restreql();
	X  extern	int	s1strneql();	/* for ngmatch */
	X+ #ifdef DEBUG
	X+ void debugup(), debugdown();
	X+ #endif
	X+ #ifdef SETPROCTITLE
	X+ void setproctitle();
	X+ #endif
	X  
	X  extern	char	spooldir[];
	X  extern	char	activefile[];
	X***************
	X*** 143,148
	X  extern	char	*homedir;
	X  extern	int	ingroup;
	X  extern	int	maxgroups;
	X  extern	int	art_array[];
	X  extern	int	art_ptr;
	X  extern	FILE	*art_fp;
	X
	X--- 170,179 -----
	X  extern	char	*homedir;
	X  extern	int	ingroup;
	X  extern	int	maxgroups;
	X+ #ifdef DYNAMIC_ART_ARRAY
	X+ extern	int	*art_array;
	X+ extern	unsigned int size_art_array;
	X+ #else
	X  extern	int	art_array[];
	X  #endif
	X  extern	int	art_ptr;
	X***************
	X*** 144,149
	X  extern	int	ingroup;
	X  extern	int	maxgroups;
	X  extern	int	art_array[];
	X  extern	int	art_ptr;
	X  extern	FILE	*art_fp;
	X  extern	int	num_arts;
	X
	X--- 175,181 -----
	X  extern	unsigned int size_art_array;
	X  #else
	X  extern	int	art_array[];
	X+ #endif
	X  extern	int	art_ptr;
	X  extern	FILE	*art_fp;
	X  extern	int	num_arts;
	X***************
	X*** 148,153
	X  extern	FILE	*art_fp;
	X  extern	int	num_arts;
	X  extern	int	uid_poster, gid_poster;
	X  extern	int	canread, canpost, canxfer;
	X  extern	char	**ngpermlist;
	X  extern	int	ngpermcount;
	X
	X--- 180,186 -----
	X  extern	FILE	*art_fp;
	X  extern	int	num_arts;
	X  extern	int	uid_poster, gid_poster;
	X+ extern	char	*home_poster;
	X  extern	int	canread, canpost, canxfer;
	X  extern	char	**ngpermlist;
	X  extern	int	ngpermcount;
	X***************
	X*** 155,160
	X  extern	char	nntp_version[];
	X  
	X  extern	char	hostname[];
	X  
	X  #ifdef LOG
	X  extern	int	grps_acsd, arts_acsd;
	X
	X--- 188,194 -----
	X  extern	char	nntp_version[];
	X  
	X  extern	char	hostname[];
	X+ extern	int	debug;
	X  
	X  #ifdef LOG
	X  extern	int	grps_acsd, arts_acsd;
	XIndex: globals.c
	XPrereq: 1.7
	X*** globals.c	Thu Jul  5 23:09:18 1990
	X--- ../../nntp/server/globals.c	Sat Feb  2 15:55:43 1991
	X***************
	X*** 1,5
	X  #ifndef lint
	X! static char	*sccsid = "@(#)$Header: globals.c,v 1.7 90/07/05 23:09:11 sob Exp $";
	X  #endif
	X  
	X  /*
	X
	X--- 1,5 -----
	X  #ifndef lint
	X! static char	*sccsid = "@(#)$Header: globals.c,v 1.10 91/02/02 15:55:37 sob Exp $";
	X  #endif
	X  
	X  /*
	X***************
	X*** 36,41
	X  int	ingroup = 0;
	X  int	art_ptr;
	X  int	num_arts;
	X  int	art_array[MAX_ARTICLES];
	X  FILE	*art_fp;
	X  int	uid_poster, gid_poster;
	X
	X--- 36,45 -----
	X  int	ingroup = 0;
	X  int	art_ptr;
	X  int	num_arts;
	X+ #ifdef DYNAMIC_ART_ARRAY
	X+ int	*art_array = 0;		/* dynamic array */
	X+ unsigned int size_art_array = 0;	/* current size of art_array */
	X+ #else
	X  int	art_array[MAX_ARTICLES];
	X  #endif
	X  FILE	*art_fp;
	X***************
	X*** 37,42
	X  int	art_ptr;
	X  int	num_arts;
	X  int	art_array[MAX_ARTICLES];
	X  FILE	*art_fp;
	X  int	uid_poster, gid_poster;
	X  int	canpost, canread, canxfer;
	X
	X--- 41,47 -----
	X  unsigned int size_art_array = 0;	/* current size of art_array */
	X  #else
	X  int	art_array[MAX_ARTICLES];
	X+ #endif
	X  FILE	*art_fp;
	X  int	uid_poster, gid_poster;
	X  char	*home_poster;
	X***************
	X*** 39,44
	X  int	art_array[MAX_ARTICLES];
	X  FILE	*art_fp;
	X  int	uid_poster, gid_poster;
	X  int	canpost, canread, canxfer;
	X  char	**ngpermlist;
	X  int	ngpermcount;
	X
	X--- 44,50 -----
	X  #endif
	X  FILE	*art_fp;
	X  int	uid_poster, gid_poster;
	X+ char	*home_poster;
	X  int	canpost, canread, canxfer;
	X  char	**ngpermlist;
	X  int	ngpermcount;
	X***************
	X*** 43,48
	X  char	**ngpermlist;
	X  int	ngpermcount;
	X  char	hostname[256];
	X  
	X  #ifdef AUTH
	X  int	Needauth;	/* 1 if we need to do authorization */
	X
	X--- 49,55 -----
	X  char	**ngpermlist;
	X  int	ngpermcount;
	X  char	hostname[256];
	X+ int	debug;
	X  
	X  #ifdef AUTH
	X  int	Needauth;	/* 1 if we need to do authorization */
SHAR_EOF
if test 28993 -ne "`wc -c < 'server.pt2.diff'`"
then
	echo shar: error transmitting "'server.pt2.diff'" '(should have been 28993 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'timer.c'" '(3900 characters)'
if test -f 'timer.c'
then
	echo shar: will not over-write existing file "'timer.c'"
else
sed 's/^	X//' << \SHAR_EOF > 'timer.c'
	X/*
	X * Machinery to run routines off timers.
	X */
	X#include "common.h"
	X
	X#ifdef TIMERS
	X#ifndef lint
	Xstatic char rcsid[] =
	X    "@(#) $Header: timer.c,v 1.2 90/12/27 22:16:27 sob Exp $ (NNTP with TIMERS)";
	X#endif
	X#else
	X#ifndef lint
	Xstatic char rcsid[] =
	X    "@(#) $Header: timer.c,v 1.2 90/12/27 22:16:27 sob Exp $ (NNTP without TIMERS)";
	X#endif
	X#endif
	X
	X#ifdef TIMERS
	X#include <sys/time.h>
	X#include "timer.h"
	X#ifndef USG
	X#ifndef FD_SETSIZE
	X/* Forward compatability */
	X#define FD_SET(n, p)    ((p)->fds_bits[0] |= (1<<(n)))
	X#define FD_CLR(n, p)    ((p)->fds_bits[0] &= ~(1<<(n)))
	X#define FD_ISSET(n, p)  ((p)->fds_bits[0] & (1<<(n)))
	X#define FD_ZERO(p)      ((p)->fds_bits[0] = 0)
	X#endif
	X#endif
	X/* non-portable */
	X#define BUFFERED_DATA(f) ((f)->_cnt > 0)
	X
	Xstatic long lastsecs;
	X
	X/*
	X * Should be called before first call to timer_sleep()
	X */
	Xvoid
	Xtimer_init(timers, ntimer)
	X	register struct timer *timers;
	X	register int ntimer;
	X{
	X	register int i;
	X	register struct timer *tp;
	X
	X#ifdef SYSLOG
	X	if (ntimer <= 0)
	X		syslog(LOG_ERR,
	X		    "timer_init(): configuration error, %d timers\n", ntimer);
	X#endif
	X
	X	/* Reset all timers */
	X	for (i = ntimer, tp = timers; i > 0; --i, ++tp)
	X		tp->left = tp->seconds;
	X
	X	/* Start clock */
	X	lastsecs = time((long *)0);
	X}
	X
	X/*
	X * Sleep until input or next timer needs to be run and then run any
	X * expired timers. Returns true if input is available to be read.
	X */
	Xint
	Xtimer_sleep(timers, ntimer)
	X	register struct timer *timers;
	X	register int ntimer;
	X{
	X	register int i, n;
	X	register struct timer *tp;
	X	register long secs;
	X#ifdef USG
	X	long timeout;
	X	long readfds;
	X#else
	X	register struct timeval *timeoutp;
	X	struct timeval timeout;
	X	fd_set readfds;
	X#endif
	X
	X	/* No need to do the select if there are characters in the buffer */
	X	if (BUFFERED_DATA(stdin))
	X		return(1);
	X
	X	/* Length of next timeout is minimum of all "timers" */
	X#ifdef USG
	X	timeout = -1;
	X	for (i = ntimer, tp = timers; i > 0; --i, ++tp)
	X		if (tp->left >= 0 &&
	X		    (tp->left < timeout || timeout < 0))
	X			timeout = tp->left;
	X
	X	/* If active timeouts (this can easily happen), block until input */
	X	if (timeout < 0)
	X		timeout = 0;
	X#ifdef EXCELAN
	X	readfds = 1<<(fileno(stdin));
	X	timeout = timeout * 1000;     /* timeout needs to be in milliseconds */
	X#endif /* EXCELAN */
	X#else
	X	timeout.tv_sec = -1;
	X	timeout.tv_usec = 0;
	X	for (i = ntimer, tp = timers; i > 0; --i, ++tp)
	X		if (tp->left >= 0 &&
	X		    (tp->left < timeout.tv_sec || timeout.tv_sec < 0))
	X			timeout.tv_sec = tp->left;
	X
	X	/* If active timeouts (this can easily happen), block until input */
	X	if (timeout.tv_sec < 0)
	X		timeoutp = 0;
	X	else
	X		timeoutp = &timeout;
	X
	X	/* Do select */
	X	FD_ZERO(&readfds);
	X	FD_SET(fileno(stdin), &readfds);
	X#endif /* !USG */
	X	errno = 0;
	X#ifdef EXCELAN
	X	n = select(fileno(stdin) + 1, &readfds, (long*)0, timeout);
	X#else
	X	n = select(fileno(stdin) + 1,
	X	    &readfds, (fd_set*)0, (fd_set*)0, timeoutp);
	X#endif
	X	/* "Interrupted system call" isn't a real error */
	X	if (n < 0 && errno != EINTR) {
	X#ifdef SYSLOG
	X		syslog(LOG_ERR, "%s read select: %m", hostname);
	X#endif
	X		exit(1);
	X	}
	X
	X	/* Calculate off seconds since last time */
	X	secs = time((long *)0) - lastsecs;
	X	if (secs < 0)
	X		secs = 0;
	X
	X	/* Subtract time from "timers" that have time remaining */
	X	for (i = ntimer, tp = timers; i > 0; --i, ++tp)
	X		if (tp->left > 0 && (tp->left -= secs) < 0)
	X			tp->left = 0;
	X
	X	/* Update lastsecs */
	X	lastsecs += secs;
	X
	X	/* If we have input, reset clock on guys that like it that way */
	X	if (n > 0)
	X		for (i = ntimer, tp = timers; i > 0; --i, ++tp)
	X			if (tp->resetoninput)
	X				tp->left = tp->seconds;
	X
	X	/* Process "timers" that have timed out */
	X	for (i = ntimer, tp = timers; i > 0; --i, ++tp) {
	X		if (tp->left == 0) {
	X			(tp->subr)();
	X			/* resetoninput guys only get "reset on input" */
	X			if (tp->resetoninput)
	X				tp->left = -1;
	X			else
	X				tp->left = tp->seconds;
	X		}
	X	}
	X
	X	/* Indicate no input */
	X	if (n <= 0)
	X		return(0);
	X	return(1);
	X	
	X}
	X#endif
SHAR_EOF
if test 3900 -ne "`wc -c < 'timer.c'`"
then
	echo shar: error transmitting "'timer.c'" '(should have been 3900 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'timer.h'" '(325 characters)'
if test -f 'timer.h'
then
	echo shar: will not over-write existing file "'timer.h'"
else
sed 's/^	X//' << \SHAR_EOF > 'timer.h'
	X/* @(#) $Header: timer.h,v 1.2 90/12/12 00:52:56 sob Exp $ */
	X
	Xstruct timer {
	X	void (*subr)();		/* routine to invoke at timeout */
	X	int resetoninput;	/* if true, reset timer on input */
	X	long seconds;		/* seconds until a timeout */
	X	long left;		/* seconds left until next timeout */
	X};
	X
	Xvoid timer_init();
	Xint timer_sleep();
SHAR_EOF
if test 325 -ne "`wc -c < 'timer.h'`"
then
	echo shar: error transmitting "'timer.h'" '(should have been 325 characters)'
fi
fi # end of overwriting check
echo shar: done with directory "'server'"
cd ..
#	End of shell archive
exit 0



More information about the Comp.sources.bugs mailing list