[comp.sources.unix] v12i029: C News alpha release, Part04/14

rsalz@uunet.UU.NET (Rich Salz) (10/21/87)

Submitted-by: utzoo!henry (Henry Spencer)
Posting-number: Volume 12, Issue 29
Archive-name: cnews/part04

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 4 (of 14)."
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'COPYRIGHT' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'COPYRIGHT'\"
else
echo shar: Extracting \"'COPYRIGHT'\" \(1355 characters\)
sed "s/^X//" >'COPYRIGHT' <<'END_OF_FILE'
X/*
X * Copyright (c) University of Toronto 1985, 1986, 1987.
X * Written by Geoffrey Collyer and Henry Spencer.
X * This software is not subject to any license of the American Telephone
X * and Telegraph Company or of the Regents of the University of California.
X *
X * Permission is granted to anyone to use this software for any purpose on
X * any computer system, and to alter it and redistribute it freely, subject
X * to the following restrictions:
X *
X * 1. The authors are not responsible for the consequences of use of this
X *    software, no matter how awful, even if they arise from flaws in it.
X *
X * 2. The origin of this software must not be misrepresented, either by
X *    explicit claim or by omission.  Since few users ever read sources,
X *    credits must appear in the documentation.
X *
X * 3. Altered versions must be plainly marked as such, and must not be
X *    misrepresented as being the original software.  Since few users
X *    ever read sources, credits must appear in the documentation.
X *
X * 4. This notice may not be removed or altered.
X *
X * 5. This release may be redistributed only in its original state:  existing
X *    material (e.g. sources) may not be deleted, changes may not be made to
X *    the originals, and new materials must be added as a supplementary
X *    distribution rather than interspersed with the originals.
X */
END_OF_FILE
if test 1355 -ne `wc -c <'COPYRIGHT'`; then
    echo shar: \"'COPYRIGHT'\" unpacked with wrong size!
fi
# end of 'COPYRIGHT'
fi
if test -f 'batch/Makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'batch/Makefile'\"
else
echo shar: Extracting \"'batch/Makefile'\" \(1567 characters\)
sed "s/^X//" >'batch/Makefile' <<'END_OF_FILE'
X# Configuration stuff.
XCFLAGS=-O
XLDFLAGS=-n
XNEWSCTL=/usr/lib/news
XNEWSARTS=/usr/spool/news
XNEWSBIN=/usr/lib/newsbin
X
X# File lists.
XPGMS=batchmake batchmunch batchprep batchsize batchxmit queuelen queuemax \
X	roomfor sendbatches
XALL=README dMakefile batchmake.c batchmunch batchprep batchsize batchxmit \
X	newsbatch.8.p queuelen queuemax roomfor sendbatches teststuff \
X	testmakefile
XPLIST=README Makefile sendbatches batchmake.c batchmunch batchprep \
X	batchsize batchxmit queuelen queuemax roomfor
X
Xthem:	batchmake newsbatch.8
X
Xbatchmake:	batchmake.o
X	cc $(CFLAGS) $(LDFLAGS) batchmake.o -o $@
X
Xnewsbatch.8:	newsbatch.8.p muck
X	sed -f muck newsbatch.8.p >$@
X
Xmuck:
X	echo 's;\$$NEWSCTL;$(NEWSCTL);g' >muck
X	echo 's;\$$NEWSARTS;$(NEWSARTS);g' >>muck
X	echo 's;\$$NEWSBIN;$(NEWSBIN);g' >>muck
X
Xtidy:
X	rm -f batchmake batchmake.o muck newsbatch.8
X
Xinstall:	$(PGMS) newsbatch.8 teststuff muck
X	if test ! -d $(NEWSBIN)/batch ; then mkdir $(NEWSBIN)/batch ; fi
X	cp $(PGMS) $(NEWSBIN)/batch
X	cp newsbatch.8 /usr/man/man8
X	if test ! -d $(NEWSCTL)/batch ; then mkdir $(NEWSCTL)/batch ; fi
X	if test ! -d $(NEWSCTL)/batch/b.test ; then mkdir $(NEWSCTL)/batch/b.test ; fi
X	cat teststuff | ( cd $(NEWSCTL)/batch/b.test ; sh )
X	sed -f muck testmakefile >$(NEWSCTL)/batch/b.test/Makefile
X	@echo 'To test, cd $(NEWSCTL)/batch/b.test and say "make".'
X
X# EXCISE
X
Xteststuff:
X	cd b.test; makedtr * >../teststuff
X
Xdtr:	$(ALL)
X	makedtr $(ALL) >dtr
X
XdMakefile:	Makefile
X	sed '/^# EXCISE/,$$d; s/tidy/clean/' Makefile >$@
X
Xclean:	tidy
X	rm -f teststuff dMakefile
X
Xprint:
X	pr $(PLIST) | hpfour
END_OF_FILE
if test 1567 -ne `wc -c <'batch/Makefile'`; then
    echo shar: \"'batch/Makefile'\" unpacked with wrong size!
fi
# end of 'batch/Makefile'
fi
if test -f 'gngp/gngp.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'gngp/gngp.c'\"
else
echo shar: Extracting \"'gngp/gngp.c'\" \(1988 characters\)
sed "s/^X//" >'gngp/gngp.c' <<'END_OF_FILE'
X/*
X * gngp - globally find newsgroup and print
X *	like grep, but for newsgroup patterns instead of regular expressions
X */
X
X#include <stdio.h>
X
Xchar *progname;
Xint debug = 0;
X
X/*
X * if true, match only ng at start of line, followed by whitespace or newline.
X */
Xint anchored = 0;
X
XFILE *efopen();
X
X/*
X * main - parse arguments and handle options
X */
Xmain(argc, argv)
Xint argc;
Xchar *argv[];
X{
X	int c, status = 0;
X	int errflg = 0;
X	FILE *in;
X	extern int optind;
X	extern char *optarg;
X
X	progname = argv[0];
X	while ((c = getopt(argc, argv, "ad")) != EOF)
X		switch (c) {
X		case 'a':		/* anchored at start of line */
X			anchored++;
X			break;
X		case 'd':
X			matchdebug(1);	/* all debugging on */
X			debug++;
X			break;
X		default:
X			errflg++;
X			break;
X		}
X	if (errflg || optind == argc) {
X		(void) fprintf(stderr, "usage: %s [-ad] pattern [file...]\n",
X			progname);
X		exit(2);
X	}
X	if (optind == argc-1)
X		status |= process(argv[optind], stdin, "stdin");
X	else {
X		int patind = optind;
X
X		for (optind++; optind < argc; optind++) {
X			in = efopen(argv[optind], "r");
X			status |= process(argv[patind], in, argv[optind]);
X			(void) fclose(in);
X		}
X	}
X	exit(status != 0? 0: 1);
X}
X
X/*
X * process - process input file
X */
Xprocess(pattern, in, inname)
Xchar *pattern;
XFILE *in;
Xchar *inname;
X{
X	int status = 0;
X	char line[BUFSIZ];
X
X	while (fgets(line, sizeof line, in) != NULL)
X		if (anchored)
X			status |= gngp(pattern, line);
X		else {
X			register char *start;
X
X			for (start = line; *start != '\0'; start++)
X				status |= gngp(pattern, start);
X		}
X	return status;
X}
X
Xint
Xgngp(pattern, text)
Xregister char *pattern, *text;
X{
X	int returned;
X	char savewhite;
X	char *whitesp;
X
X	if (anchored) {
X		extern char *strpbrk();
X
X		whitesp = strpbrk(text, " \t\n");
X		if (whitesp != NULL) {
X			savewhite = *whitesp;
X			*whitesp = '\0';
X		}
X	}
X	returned = ngmatch(pattern, text);
X	if (anchored) {
X		if (whitesp != NULL)
X			*whitesp = savewhite;
X	}
X	if (returned)
X		(void) fputs(text, stdout);
X	return returned;
X}
END_OF_FILE
if test 1988 -ne `wc -c <'gngp/gngp.c'`; then
    echo shar: \"'gngp/gngp.c'\" unpacked with wrong size!
fi
# end of 'gngp/gngp.c'
fi
if test -f 'libc/error.3' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'libc/error.3'\"
else
echo shar: Extracting \"'libc/error.3'\" \(1621 characters\)
sed "s/^X//" >'libc/error.3' <<'END_OF_FILE'
X.TH ERROR 3 local
X.DA 8 May 1984
X.SH NAME
Xerror, warning \- print error messages
X.SH SYNOPSIS
X.nf
X.B error(s1, s2)
X.B char *s1;
X.B char *s2;
X
X.B warning(s1, s2)
X.B char *s1;
X.B char *s2;
X
X.B extern char *progname;
X.B extern int errno;
X
X.B progname = argv[0];
X.SH DESCRIPTION
X.I Warning
Xprints an error message, with suitable embellishments,
Xand clears
X.IR errno .
X.I Error
Xdoes likewise and then exits.
XThe
X.I s1
Xargument should be a
X.I printf
Xformat string (without a trailing newline), with
X.I s2
Xavailable as an argument.
X.PP
XIf there is an environment variable
X.BR CMDNAME
Xwith non-null value,
Xits contents are printed first, followed by a colon.
XFollowing this,
Xany non-null value of
X.I progname
Xis printed, followed by a colon and a space.
XFollowing this,
X.IR fprintf (3)
Xis invoked with
X.I s1
Xas the format string and
X.I s2
Xas the argument.
XIf the value of
X.I errno
Xis within the normal range,
Xa standard elaborating message is printed (see
X.IR intro (2)).
X.PP
X.B CMDNAME
Xshould be set by shellfiles that expect subordinate programs to
Xissue error message in the shellfile's name.
X.I Progname
Xshould be set by all programs;
X.I argv[0]
Xis usually a suitable thing to set it to.
X.I Errno
Xis set by system calls and various other routines,
Xalthough its use is not universal;
Xnote that it is not reset by successful system calls following an
Xunsuccessful one.
X.SH SEE ALSO
Xintro(2), intro(3), printf(3), exit(2), getopt(3)
X.SH DIAGNOSTICS
X.IR Error 's
Xexit status is 1.
X.SH HISTORY
XLocal products, modelled on the
X.I error
Xin Kernighan&Pike.
X.SH BUGS
XBe nice if they could take a full
X.IR printf -style
Xargument list.
END_OF_FILE
if test 1621 -ne `wc -c <'libc/error.3'`; then
    echo shar: \"'libc/error.3'\" unpacked with wrong size!
fi
# end of 'libc/error.3'
fi
if test -f 'libc/fgetmfs.3' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'libc/fgetmfs.3'\"
else
echo shar: Extracting \"'libc/fgetmfs.3'\" \(1406 characters\)
sed "s/^X//" >'libc/fgetmfs.3' <<'END_OF_FILE'
X.TH FGETMFS 3 local "Public Domain"
X.DA 3 August 1987
X.SH NAME
Xfgetmfs \- read an arbitrarily long, possibly continued line
X.SH SYNOPSIS
X.B "#include <stdio.h>
X.br
X.B "#include <fgetmfs.h>
X.PP
X.B "char *fgetmfs(stream, cont)"
X.br
X.B "FILE *stream;"
X.br
X.B "int cont;"
X.SH DESCRIPTION
X.I Fgetmfs
Xreads an arbitrarily long line from
X.IR stream ,
Xallocating memory via
X.IR malloc (3)
Xas needed.
XFor efficiency,
Xif
X.I cont
Xis not
X.IR CONT_NO ,
Xsuch as
X.I CONT_NOSPC
Xor
X.IR CONT_SPC ,
Xoccurrences of a backslash and a newline together
Xand in that order
Xwill be deleted from the input stream;
Xif
X.I cont
Xis
X.IR CONT_NOSPC ,
Xany whitespace after the newline
Xin the input stream will also be deleted from it.
X.PP
X.I Fgetmfs
Xis intended to provide a reliable mechanism for reading
Xinput containing lines of arbitrary length,
Xrather than trusting that no line with be longer than some
Xarbitrary tolerance.
X.PP
XThe memory returned by
X.I fgetmfs
Xshould be returned when no longer needed via
X.IR free (3).
X.\" .SH FILES
X.SH SEE ALSO
X.IR malloc (3),
X.IR fgets (3)
X.SH DIAGNOSTICS
XReturns NULL (0) if memory cannot be allocated or upon reading end-of-file;
Xuse
X.I feof(stream)
Xto distinguish.
X.SH HISTORY
XWritten by Geoff Collyer
Xat the University of Toronto
Xas part of the C news project.
X.SH BUGS
XIt's too slow.
X.br
XThe meaning of the
X.I cont
Xflag is ugly,
Xbut layering this form of continuation on top is even slower.
END_OF_FILE
if test 1406 -ne `wc -c <'libc/fgetmfs.3'`; then
    echo shar: \"'libc/fgetmfs.3'\" unpacked with wrong size!
fi
# end of 'libc/fgetmfs.3'
fi
if test -f 'libc/memcpy.fast/src/duff.longs.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'libc/memcpy.fast/src/duff.longs.c'\"
else
echo shar: Extracting \"'libc/memcpy.fast/src/duff.longs.c'\" \(1420 characters\)
sed "s/^X//" >'libc/memcpy.fast/src/duff.longs.c' <<'END_OF_FILE'
X#define LUMP long
X
Xmemcpy(to, from, count)	/* assumes unaligned LUMPs can be copied */
Xregister char *from, *to;
Xregister int count;
X{
X	/*
X	 * This code uses Duff's Device (tm Tom Duff)
X	 * to unroll the copying loop:
X	 * while (count-- > 0)
X	 *	*to++ = *from++;
X	 * Sorry the code is so ugly.
X	 */
X	if (count > 0) {
X		register LUMP *fromlump = (LUMP *)from, *tolump = (LUMP *)to;
X		register int inloops;
X		register int loops = count >> 3;	/* /8 */
X
X		count %= 8;		/* about to copy loops*8 bytes */
X		inloops = (loops+8-1) >> 3;	/* /8 round up */
X#define COPY8BYTES	*tolump++ = *fromlump++; \
X			*tolump++ = *fromlump++
X		if (loops > 0) {
X			switch (loops&(8-1)) {	/* %8 */
X			case 0:	do {
X					COPY8BYTES;
X				case 7:	COPY8BYTES;
X				case 6:	COPY8BYTES;
X				case 5:	COPY8BYTES;
X				case 4:	COPY8BYTES;
X				case 3:	COPY8BYTES;
X				case 2:	COPY8BYTES;
X				case 1:	COPY8BYTES;
X				} while (--inloops > 0);
X			}
X			from = (char *)fromlump;
X			to = (char *)tolump;
X		}
X	}
X	/*
X	 * This code uses Duff's Device (tm Tom Duff)
X	 * to unroll the copying loop the last count%8 times:
X	 * while (count-- > 0)
X	 *	*to++ = *from++;
X	 * Sorry the code is so ugly.
X	 */
X	if (count > 0) {
X		switch (count&(8-1)) {	/* %8 */
X		case 0:
X#define COPYBYTE *to++ = *from++
X				COPYBYTE;
X			case 7:	COPYBYTE;
X			case 6:	COPYBYTE;
X			case 5:	COPYBYTE;
X			case 4:	COPYBYTE;
X			case 3:	COPYBYTE;
X			case 2:	COPYBYTE;
X			case 1:	COPYBYTE;
X		}
X	}
X}
END_OF_FILE
if test 1420 -ne `wc -c <'libc/memcpy.fast/src/duff.longs.c'`; then
    echo shar: \"'libc/memcpy.fast/src/duff.longs.c'\" unpacked with wrong size!
fi
# end of 'libc/memcpy.fast/src/duff.longs.c'
fi
if test -f 'libc/standard.3' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'libc/standard.3'\"
else
echo shar: Extracting \"'libc/standard.3'\" \(1641 characters\)
sed "s/^X//" >'libc/standard.3' <<'END_OF_FILE'
X.TH STANDARD 3 local
X.DA 9 Feb 1982
X.SH NAME
Xstandard, safe \- standardize conditions in preparation for exec
X.SH SYNOPSIS
X.B standard()
X.PP
X.B safe()
X.SH DESCRIPTION
X.I Standard
Xalters a process's environment to make it relatively safe to do
X.IR execvp ,
X.IR system ,
X.IR popen ,
Xetc.
XIt closes all descriptors except
Xthe standard ones and supplies a standard set of environment variables
Xthat ensure a standard interpretation of shell commands and a
Xstandard search path for programs.
X.PP
X.I Safe
Xis similar, but is intended for use in shell escapes and suchlike.
XIt leaves the environment variables untouched but turns off
Xsetuid and setgid permissions.
X.PP
XUse of either one permits a setuid/setgid program to
Xrun other programs without inadvertently bestowing special powers
Xon nonstandard programs.
XCare must still be exercised as to what the standard descriptors
Xrefer to,
Xand it is still possible for
Xprograms executed after use of
X.I standard
X(as opposed to
X.IR safe )
Xto give away special powers through
X.I their
Xcarelessness.
X.SH SEE ALSO
Xenviron(3), closeall(3)
X.SH HISTORY
XLocal products.
X.SH BUGS
X.I Standard
Xmust necessarily supply standard values for some environment variables,
Xbut it is not clear whether it should pass other variables
Xthrough or eliminate them.
XThe current implementation eliminates them, which is safer but sometimes
Xinconvenient.
X.PP
XOne can construct elaborate scenarios in which a setuid
Xprogram employing
X.I safe
Xcould be duped into
Xexecuting a user-supplied program in a current directory
Xthe user ordinarily could not have reached.
X.PP
XPossibly
Xone or both should standardize the
X.I umask
Xsetting.
END_OF_FILE
if test 1641 -ne `wc -c <'libc/standard.3'`; then
    echo shar: \"'libc/standard.3'\" unpacked with wrong size!
fi
# end of 'libc/standard.3'
fi
if test -f 'libc/strings/string.h.proto' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'libc/strings/string.h.proto'\"
else
echo shar: Extracting \"'libc/strings/string.h.proto'\" \(1489 characters\)
sed "s/^X//" >'libc/strings/string.h.proto' <<'END_OF_FILE'
X/*
X * String functions.
X */
X
XVOIDSTAR memcpy(/*VOIDSTAR dst, const VOIDSTAR src, SIZET size*/);
XVOIDSTAR memccpy(/*VOIDSTAR dst, const VOIDSTAR src, int ucharstop, SIZET size*/);
Xchar *strcpy(/*char *dst, const char *src*/);
Xchar *strncpy(/*char *dst, const char *src, SIZET size*/);
Xchar *strcat(/*char *dst, const char *src*/);
Xchar *strncat(/*char *dst, const char *src, SIZET size*/);
Xint memcmp(/*const VOIDSTAR s1, const VOIDSTAR s2, SIZET size*/);
Xint strcmp(/*const char *s1, const char *s2*/);
Xint strncmp(/*const char *s1, const char *s2, SIZET size*/);
XVOIDSTAR memchr(/*const VOIDSTAR s, int ucharwanted, SIZET size*/);
Xchar *strchr(/*const char *s, int charwanted*/);
XSIZET strcspn(/*const char *s, const char *reject*/);
Xchar *strpbrk(/*const char *s, const char *breakat*/);
Xchar *strrchr(/*const char *s, int charwanted*/);
XSIZET strspn(/*const char *s, const char *accept*/);
Xchar *strstr(/*const char *s, const char *wanted*/);
Xchar *strtok(/*char *s, const char *delim*/);
XVOIDSTAR memset(/*VOIDSTAR s, int ucharfill, SIZET size*/);
XSIZET strlen(/*const char *s*/);
X
X/*
X * V7 and Berklix compatibility.
X */
Xchar *index(/*const char *s, int charwanted*/);
Xchar *rindex(/*const char *s, int charwanted*/);
Xint bcopy(/*const char *src, char *dst, int length*/);
Xint bcmp(/*const char *s1, const char *s2, int length*/);
Xint bzero(/*char *dst, int length*/);
X
X/*
X * Putting this in here is really silly, but who am I to argue with X3J11?
X */
Xchar *strerror(/*int errnum*/);
END_OF_FILE
if test 1489 -ne `wc -c <'libc/strings/string.h.proto'`; then
    echo shar: \"'libc/strings/string.h.proto'\" unpacked with wrong size!
fi
# end of 'libc/strings/string.h.proto'
fi
if test -f 'libcnews/lock.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'libcnews/lock.c'\"
else
echo shar: Extracting \"'libcnews/lock.c'\" \(1717 characters\)
sed "s/^X//" >'libcnews/lock.c' <<'END_OF_FILE'
X/*
X * C news system locking.
X * It's compatible with B 2.10.1 news, except that locks are never
X * declared stale (blow 'em away in /etc/rc).
X * Only permit rnews to run on a file server to make this sane.
X */
X
X#include <stdio.h>
X#include <errno.h>
X#include <sys/types.h>
X#include "news.h"
X
X#define LOCKNAME "LOCK"
X#define LOCKTEMP "LOCKTMXXXXXX"
X#define INTERVAL 25		/* seconds to sleep on a busy lock */
X
Xstatic int debug = NO;
Xstatic int mylock = NO;
X
Xlockdebug(state)
Xint state;
X{
X	debug = state;
X}
X
Xnewslock()
X{
X	int locktries = 0;
X	char tempnm[MAXFILE], lockfile[MAXFILE];
X	FILE *tempfp;
X	extern int errno;
X	char *libfile();
X	char *strcpy(), *mktemp();
X
X	/* create temporary name for linking; store my pid in it */
X	(void) strcpy(tempnm, libfile(LOCKTEMP));
X	(void) mktemp(tempnm);
X	tempfp = fopen(tempnm, "w");
X	if (tempfp == NULL)
X		error("can't create lock temporary `%s'", tempnm);
X	(void) fprintf(tempfp, "%d\n", getpid());
X	(void) fclose(tempfp);
X
X	/* repeatedly try to link the temporary name to LOCKNAME */
X	(void) strcpy(lockfile, libfile(LOCKNAME));
X	while (link(tempnm, lockfile) < 0) {
X		extern char *progname;
X
X		if (errno != EEXIST)
X			error("can't link `%s' to LOCK", tempnm);
X		/*
X		 * Decide here if lock is stale.
X		 * If so, remove it and try again to lock.
X		 */
X		/* process still alive */
X		if (debug && ++locktries == 1)
X			(void) printf("%s: sleeping on LOCK\n", progname);
X		sleep(INTERVAL);
X	}
X	(void) unlink(tempnm);
X	mylock = YES;
X}
X
Xnewsunlock()
X{
X	char *libfile();
X
X	if (mylock) {
X		(void) unlink(libfile(LOCKNAME));
X		mylock = NO;
X	}
X}
X
Xerrunlock(fmt, s)		/* like error(3), but unlock before exit */
Xchar *fmt, *s;
X{
X	warning(fmt, s);
X	newsunlock();
X	exit(1);
X	/* NOTREACHED */
X}
END_OF_FILE
if test 1717 -ne `wc -c <'libcnews/lock.c'`; then
    echo shar: \"'libcnews/lock.c'\" unpacked with wrong size!
fi
# end of 'libcnews/lock.c'
fi
if test -f 'libcnews/readline.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'libcnews/readline.c'\"
else
echo shar: Extracting \"'libcnews/readline.c'\" \(1904 characters\)
sed "s/^X//" >'libcnews/readline.c' <<'END_OF_FILE'
X/*
X * readline - like fgets, but newslock at first EOF
X */
X
X#include <stdio.h>
X#include <signal.h>
X#include <sys/types.h>
X#include "news.h"
X
Xvoid complain();
X
X/* How to get an unsigned char. */
X#ifdef CHARBITS
X#define	UCHARAT(p)	(*(p)&CHARBITS)
X#else
X#define	UCHARAT(p)	((int)*(unsigned char *)(p))
X#endif
X
Xint nlocked = 0;		/* newslock() done? read by the caller */
X
X/* Buffer etc. for readline and friends. */
Xstatic char buf[BUFSIZ];
Xstatic int nleft = 0;
Xstatic char *rest;
X
X/*
X - readline - read a line (sans newline), with locking when we hit EOF
X *
X * Minor flaw:  will lose a last line which lacks a newline.
X */
Xint				/* 0 success, -1 final EOF */
Xreadline(s, n, fd)
Xchar *s;
Xint n;
Xint fd;				/* Note descriptor, not FILE *. */
X{
X	register char *dst;
X	register int ndst;
X	register int c;
X	extern void refill();
X	extern int errno;
X
X	dst = s;
X	for (ndst = n-1; ndst > 0; ndst--) {	/* -1 for NUL */
X		if (nleft <= 0) {
X			refill(fd);
X			if (nleft <= 0)	/* refill gave up. */
X				return -1;
X		}
X		c = UCHARAT(rest);
X		rest++;
X		nleft--;
X
X		if (c == '\n') {
X			*dst++ = '\0';
X			return 0;
X		} else
X			*dst++ = c;
X	}
X
X	*dst++ = '\0';
X	errno = 0;
X	complain("over-long history line `%s'", s);
X	return 0;
X}
X
X/*
X - refill - refill readline's buffer, with locking on EOF
X */
Xvoid
Xrefill(fd)
Xint fd;
X{
X	register int ret;
X
X	/* Just in case... */
X	if (nleft > 0)
X		return;
X
X	/* Try ordinary read. */
X	ret = read(fd, buf, (int)sizeof(buf));
X	if (ret < 0) {
X		complain("read error in history", "");
X		return;
X	}
X	if (ret > 0) {
X		nleft = ret;
X		rest = buf;
X		return;
X	}
X
X	/* EOF. */
X	if (nlocked)
X		return;		/* We're really done. */
X
X	/* EOF but we haven't locked yet.  Lock and try again. */
X	(void) signal(SIGINT, (sigarg_t)SIG_IGN);
X	(void) signal(SIGQUIT, (sigarg_t)SIG_IGN);
X	(void) signal(SIGHUP, (sigarg_t)SIG_IGN);
X	(void) signal(SIGTERM, (sigarg_t)SIG_IGN);
X	newslock();
X	nlocked = 1;
X	refill(fd);
X}
END_OF_FILE
if test 1904 -ne `wc -c <'libcnews/readline.c'`; then
    echo shar: \"'libcnews/readline.c'\" unpacked with wrong size!
fi
# end of 'libcnews/readline.c'
fi
if test -f 'mail/coder/uuencode.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'mail/coder/uuencode.c'\"
else
echo shar: Extracting \"'mail/coder/uuencode.c'\" \(1989 characters\)
sed "s/^X//" >'mail/coder/uuencode.c' <<'END_OF_FILE'
X/* based on 5.1 (Berkeley) 7/2/83 */
X
X/*
X * uuencode [input] output
X *
X * Encode a file so it can be mailed to a remote system.
X */
X#include <stdio.h>
X#include <sys/types.h>
X#include <sys/stat.h>
X
Xmain(argc, argv)
Xchar **argv;
X{
X	FILE *in;
X	struct stat sbuf;
X	int mode;
X
X	/* optional 1st argument */
X	if (argc > 2) {
X		if ((in = fopen(argv[1], "r")) == NULL) {
X			perror(argv[1]);
X			exit(1);
X		}
X		argv++; argc--;
X	} else
X		in = stdin;
X
X	if (argc != 2) {
X		(void) fprintf(stderr, "Usage: uuencode [infile] remotefile\n");
X		exit(2);
X	}
X
X	/* figure out the input file mode */
X	(void) fstat(fileno(in), &sbuf);
X	mode = sbuf.st_mode & 0777;
X	(void) printf("begin %o %s\n", mode, argv[1]);
X
X	encode(in, stdout);
X
X	(void) printf("end\n");
X	exit(0);
X}
X
X/*
X * copy from in to out, encoding as you go along.
X */
Xencode(in, out)
XFILE *in;
XFILE *out;
X{
X	register char *ibp, *obp;
X	register int inbyte, outbyte;
X	register char *ibufend;
X	register int incount;
X	char inbuf[45+1+3];		/* +3 is due to sloppy for test */
X	char outbuf[1+60+1+1];		/* len+text+newline */
X
X/* ENC is the basic 1 character encoding function to make a char printing */
X#define ENC(c) (((c) & 077) + ' ')	/* N.B.: c is evaluated exactly once. */
X
X	do {
X		incount = fread(inbuf, 1, 45, in);
X		ibp = inbuf;
X		obp = outbuf;
X		*obp++ = ENC(incount);
X		for (ibufend = inbuf + incount; ibp < ibufend; ) {
X			/*
X			 * Encode (as 4 bytes pointed at by obp) one group
X			 * of 3 bytes pointed at by ibp.
X			 * Code is obscure to make it blaze along (sorry).
X			 * Each "*obp++ = ENC(...)" emits the next 6 bits of
X			 * the input bytes.
X			 */
X			*obp++ = ENC((inbyte = *ibp++) >> 2);
X			outbyte = (inbyte << 4) /* & 060 */ ;
X			*obp++ = ENC(outbyte | (((inbyte = *ibp++) >> 4) & 017));
X			outbyte = (inbyte << 2) /* & 074 */ ;
X			*obp++ = ENC(outbyte | (((inbyte = *ibp++) >> 6) & 03));
X			*obp++ = ENC(inbyte /* & 077 */ );
X		}
X		*obp++ = '\n';
X		*obp = '\0';
X		(void) fwrite(outbuf, 1, obp - outbuf, out);
X	} while (incount > 0);
X}
END_OF_FILE
if test 1989 -ne `wc -c <'mail/coder/uuencode.c'`; then
    echo shar: \"'mail/coder/uuencode.c'\" unpacked with wrong size!
fi
# end of 'mail/coder/uuencode.c'
fi
if test -f 'newsbin.proto/control/newgroup' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'newsbin.proto/control/newgroup'\"
else
echo shar: Extracting \"'newsbin.proto/control/newgroup'\" \(1152 characters\)
sed "s/^X//" >'newsbin.proto/control/newgroup' <<'END_OF_FILE'
X#! /bin/sh
X# newgroup group - create group (4-field version: B-2.10.3 and later compatible)
X#	subject to our sys file group pattern
X# B 2.11 requires an Approved: header; someday.
XNEWSCTL=${NEWSCTL-/usr/lib/news}; export NEWSCTL
XNEWSBIN=${NEWSBIN-/usr/lib/newsbin}; export NEWSBIN
XNEWSARTS=${NEWSARTS-/usr/spool/news}; export NEWSARTS
XPATH=/bin:/usr/bin:/usr/ucb:$NEWSCTL:$NEWSBIN; export PATH	# must find mkpdir
XF=/tmp/nc$$
Xadmin=usenet
X
Xcat >$F
XSENDER="`grep '^Sender:' $F | sed 's/^[^:]*: *//'`"
Xcase "$SENDER" in
X"")
X	SENDER="`grep '^From:' $F | sed 's/^[^:]*: *//'`"
X	;;
Xesac
X
Xif grep -s "^`echo $1 | sed 's/\./\\\\./g'` " $NEWSCTL/active; then	# group exists
X	: do nothing
Xelif gngp -a `
X    egrep "^(\`hostname\`|ME):" $NEWSCTL/sys | awk -F: '{print $2; exit}'
X    ` >/dev/null <<!
X$1
X!
Xthen			# no group in active, but sys file likes it: make it
X	case "$2" in
X	moderated)	flag=m ;;
X	*)	flag=y ;;
X	esac
X	echo "$1 00000 00000 $flag" >>$NEWSCTL/active
X	# TODO: is it worth making the directory now? maybe, rn bitches otherwise
X	mkpdir $NEWSARTS/`echo $1 | sed 's/\./\//g' `
X	echo "newsgroup $1 was created by $SENDER." | mail $admin
Xfi
X
Xrm -f $F*
END_OF_FILE
if test 1152 -ne `wc -c <'newsbin.proto/control/newgroup'`; then
    echo shar: \"'newsbin.proto/control/newgroup'\" unpacked with wrong size!
fi
# end of 'newsbin.proto/control/newgroup'
fi
if test -f 'newsbin.proto/control/newgroup.4' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'newsbin.proto/control/newgroup.4'\"
else
echo shar: Extracting \"'newsbin.proto/control/newgroup.4'\" \(1152 characters\)
sed "s/^X//" >'newsbin.proto/control/newgroup.4' <<'END_OF_FILE'
X#! /bin/sh
X# newgroup group - create group (4-field version: B-2.10.3 and later compatible)
X#	subject to our sys file group pattern
X# B 2.11 requires an Approved: header; someday.
XNEWSCTL=${NEWSCTL-/usr/lib/news}; export NEWSCTL
XNEWSBIN=${NEWSBIN-/usr/lib/newsbin}; export NEWSBIN
XNEWSARTS=${NEWSARTS-/usr/spool/news}; export NEWSARTS
XPATH=/bin:/usr/bin:/usr/ucb:$NEWSCTL:$NEWSBIN; export PATH	# must find mkpdir
XF=/tmp/nc$$
Xadmin=usenet
X
Xcat >$F
XSENDER="`grep '^Sender:' $F | sed 's/^[^:]*: *//'`"
Xcase "$SENDER" in
X"")
X	SENDER="`grep '^From:' $F | sed 's/^[^:]*: *//'`"
X	;;
Xesac
X
Xif grep -s "^`echo $1 | sed 's/\./\\\\./g'` " $NEWSCTL/active; then	# group exists
X	: do nothing
Xelif gngp -a `
X    egrep "^(\`hostname\`|ME):" $NEWSCTL/sys | awk -F: '{print $2; exit}'
X    ` >/dev/null <<!
X$1
X!
Xthen			# no group in active, but sys file likes it: make it
X	case "$2" in
X	moderated)	flag=m ;;
X	*)	flag=y ;;
X	esac
X	echo "$1 00000 00000 $flag" >>$NEWSCTL/active
X	# TODO: is it worth making the directory now? maybe, rn bitches otherwise
X	mkpdir $NEWSARTS/`echo $1 | sed 's/\./\//g' `
X	echo "newsgroup $1 was created by $SENDER." | mail $admin
Xfi
X
Xrm -f $F*
END_OF_FILE
if test 1152 -ne `wc -c <'newsbin.proto/control/newgroup.4'`; then
    echo shar: \"'newsbin.proto/control/newgroup.4'\" unpacked with wrong size!
fi
# end of 'newsbin.proto/control/newgroup.4'
fi
if test -f 'newshist/newshist.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'newshist/newshist.c'\"
else
echo shar: Extracting \"'newshist/newshist.c'\" \(1312 characters\)
sed "s/^X//" >'newshist/newshist.c' <<'END_OF_FILE'
X/*
X * newshist msgids - print history lines corresponding to msgids
X */
X
X#include <stdio.h>
X#include "history.h"
X
Xchar *progname;
Xint debug;
Xstatic char *history;		/* unused */
Xint remote;			/* to satisfy rnews code */
X
X/*
X * main - parse arguments and handle options
X */
Xmain(argc, argv)
Xint argc;
Xchar *argv[];
X{
X	int c;
X	int errflg = 0;
X	extern int optind;
X	extern char *optarg;
X
X	progname = argv[0];
X	while ((c = getopt(argc, argv, "df:")) != EOF)
X		switch (c) {
X		case 'd':
X			++debug;
X			break;
X		case 'f':
X			history = optarg;
X			break;
X		default:
X			errflg++;
X			break;
X		}
X	if (optind == argc || errflg) {
X		fprintf(stderr, "usage: %s [-df file]\n", progname);
X		exit(2);
X	}
X
X	for (; optind < argc; optind++)
X		process(argv[optind]);
X	exit(0);
X}
X
X/*
X * process - message-id argument
X */
Xprocess(msgid)
Xchar *msgid;
X{
X	char *histent;
X
X	if (msgid == NULL)
X		return;		
X	histent = gethistory(msgid);
X	if (histent == NULL) {
X		char newmsgid[1000];
X		extern char *strcpy(), *strcat();
X
X		(void) strcpy(newmsgid, "<");
X		(void) strcat(newmsgid, msgid);
X		(void) strcat(newmsgid, ">");
X		histent = gethistory(newmsgid);
X	}
X	if (histent == NULL)
X		fprintf(stderr, "%s: no history entry for %s nor <%s>\n",
X			progname, msgid, msgid);
X	else
X		fputs(histent, stdout);
X	(void) fflush(stdout);
X}
X
Xunprivileged()
X{
X}
END_OF_FILE
if test 1312 -ne `wc -c <'newshist/newshist.c'`; then
    echo shar: \"'newshist/newshist.c'\" unpacked with wrong size!
fi
# end of 'newshist/newshist.c'
fi
if test -f 'rna/makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'rna/makefile'\"
else
echo shar: Extracting \"'rna/makefile'\" \(2018 characters\)
sed "s/^X//" >'rna/makefile' <<'END_OF_FILE'
XDEFINES=-Dstrchr=index -Dstrrchr=rindex
XCFLAGS=-O $(DEFINES) # -s is a stupid idea
XINSTALL=:# install bigpdp
XNFLAG =
XI=/usr/include
XC=/lib/libc.a
XLIBS=lib/*.a
XLIBDIR=/usr/lib/news
XBINDIR=/bin
XCOMMANDS = postnews uurec readnews uusend expire postgroup
XFILES = help
XLCOMMANDS = postnews.lint uurec.lint readnews.lint uusend.lint expire.lint
XPFILES = header.c postnews.c funcs.c active.c history.c maketime.c mtempnam.c
XRFILES = header.c readnews.c funcs.c active.c newsrc.c history.c maketime.c
XROFILES= header.o readnews.o funcs.o active.o newsrc.o history.o maketime.o
XEFILES = expire.c funcs.c active.c
XLINT = lint -ha $(DEFINES)
X
X.c.lint:
X	$(LINT) $< > $@
X
X.c:
X	$(CC) $(CFLAGS) $*.c $(NFLAG) -o $(@F)
X	$(INSTALL) $* bin 711 $@
X
X.sh:
X	$(INSTALL) -c $*.sh bin 755 $@
X
Xall: defs.h $(LIBDIR) $(COMMANDS) $(FILES)
X
Xdefs.h:	at.h $C
X	touch defs.h
X
X$(LIBDIR):
X	mkdir $(LIBDIR)
X	chown news $(LIBDIR)
X	chmod 755 $(LIBDIR)
X
Xlint: $(LCOMMANDS)
X
Xhelp: $(LIBDIR)/help
X$(LIBDIR)/help: news.help
X	$(INSTALL) -c news.help news 644 $(LIBDIR)/help
X
Xpostnews: $(BINDIR)/postnews
X$(BINDIR)/postnews: $(PFILES) defs.h
X	$(CC) $(CFLAGS) $(PFILES) -o postnews
X	$(INSTALL) - postnews news 6711 $(BINDIR)/postnews
X
Xpostgroup: $(BINDIR)/postgroup
X$(BINDIR)/postgroup: postgroup.sh
X
Xuurec: $(LIBDIR)/uurec
X$(LIBDIR)/uurec: uurec.c defs.h
X
Xreadnews: $(BINDIR)/readnews
X$(BINDIR)/readnews: $(ROFILES) defs.h
X	$(CC) $(CFLAGS) $(ROFILES) $(LIBS) -o readnews
X	$(INSTALL) - readnews bin 711 $(BINDIR)/readnews $(BINDIR)/news
X$(ROFILES): defs.h
X
Xuusend: $(LIBDIR)/uusend
X$(LIBDIR)/uusend: defs.h uusend.c
X
Xexpire: $(LIBDIR)/expire
X$(LIBDIR)/expire: $(EFILES) defs.h
X	$(CC) $(CFLAGS) $(EFILES) $(NFLAG) -o expire
X	$(INSTALL) expire news 700 $(LIBDIR)/expire
X
Xpostnews.lint: $(PFILES)
X	$(LINT) $(PFILES) > postnews.lint
X
Xreadnews.lint: $(RFILES)
X	$(LINT) $(RFILES) > readnews.lint
X
Xexpire.lint: $(EFILES)
X	$(LINT) $(EFILES) > expire.lint
X
Xuurec.lint: uurec.c defs.h
Xuusend.lint: uusend.c defs.h
X
X.FINISH:
X	rm -s *.o
Xclean:
X	rm -f *.o core a.out readnews
END_OF_FILE
if test 2018 -ne `wc -c <'rna/makefile'`; then
    echo shar: \"'rna/makefile'\" unpacked with wrong size!
fi
# end of 'rna/makefile'
fi
if test -f 'rna/mtempnam.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'rna/mtempnam.c'\"
else
echo shar: Extracting \"'rna/mtempnam.c'\" \(1295 characters\)
sed "s/^X//" >'rna/mtempnam.c' <<'END_OF_FILE'
X/*
X * same as usual tempnam.c except force placement in the directory
X * we ask for
X */
X#include <stdio.h>
X
X#ifndef P_tmpdir
X#define P_tmpdir	"/tmp/"
X#define L_tmpnam	(sizeof(P_tmpdir) + 15)
X#endif
X
X#define max(A,B) (((A)<(B))?(B):(A))
X
Xextern char *malloc(), *getenv(), *mktemp();
Xextern char *strncat(), *strcat(), *strcpy();
Xextern int access();
X
Xstatic char *pcopy(), *seed = "AAA";
X
Xchar *
Xmtempnam(dir, pfx)
Xchar *dir;		/* use this directory please (if non-NULL) */
Xchar *pfx;		/* use this (if non-NULL) as filename prefix */
X{
X	register char *p, *q;
X	int x = 0, y = 0, z;
X
X	z = strlen(P_tmpdir);
X	if (dir != NULL) {
X		y = strlen(dir);
X	}
X	if ((p = malloc((unsigned)(max(max(x, y), z) + 16))) == NULL)
X		return(NULL);
X	if (y > 0 && pcopy(p, dir))
X		goto OK;
X	if (access(pcopy(p, P_tmpdir), 3) == 0)
X		goto OK;
X	if (access(pcopy(p, "/tmp"), 3) != 0)
X		return(NULL);
XOK:
X	strcat(p, "/");
X	if (pfx) {
X		*(p + strlen(p) + 5) = '\0';
X		strncat(p, pfx, 5);
X	}
X	strcat(p, seed);
X	strcat(p, "XXXXXX");
X	q = seed;
X	while (*q == 'Z')
X		*q++ = 'A';
X	++ * q;
X	if (*mktemp(p) == '\0')
X		return(NULL);
X	return(p);
X}
X
X
Xstatic char *
Xpcopy(space, arg)
Xchar *space, *arg;
X{
X	char *p;
X
X	if (arg) {
X		strcpy(space, arg);
X		p = space - 1 + strlen(space);
X		if (*p == '/')
X			*p = '\0';
X	}
X	return(space);
X}
X
X
END_OF_FILE
if test 1295 -ne `wc -c <'rna/mtempnam.c'`; then
    echo shar: \"'rna/mtempnam.c'\" unpacked with wrong size!
fi
# end of 'rna/mtempnam.c'
fi
if test -f 'rna/rnews.sh' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'rna/rnews.sh'\"
else
echo shar: Extracting \"'rna/rnews.sh'\" \(1301 characters\)
sed "s/^X//" >'rna/rnews.sh' <<'END_OF_FILE'
X#
X# rnews  (M. J. Liebelt, University of Adelaide, May 1984)
X#
X# netgets files sent to "news" as "newsitem"s and pipes them into
X# postnews, then reads any mail sent to "news" and pipes that into
X# $LIBDIR/uurec, which passes the news portions onto postnews.
X#
X# It should be run as "/etc/su news rnews " (i.e. with uid = news)
X#
X# News should be sent to news at this host from remote hosts thus:
X#      ... | /usr/lib/news/uusend news:thishost   (to send by mail, or)
X#      ... | net -hthishost -nnews -f -Nnewsitem -M
X#
X#    where "thishost" is the NETID of this host.
X#
X# LIBDIR - same as LIBDIR in Makefile
X# BINDIR - same as BINDIR in Makefile
X# NETDIR - where netget lives
XLIBDIR=/usr/lib/news
XBINDIR=/bin
XNETDIR=/bin
X
Xcd %news
X
Xwhile $NETDIR/netget newsitem > /dev/null 2>&1
Xdo
X        $BINDIR/postnews -p < newsitem > rnews.errors 2>&1
X        if [ -s rnews.errors ]
X        then
X               cat $LIBDIR/rnews.mail1 rnews.errors $LIBDIR/rnews.mail2 newsitem | mail root
X        fi
Xdone
X
Xif [ -r .mail ]
Xthen {
X        mv .mail newsmail
X        $LIBDIR/uurec < newsmail > rnews.errors 2>&1
X        if [ -s rnews.errors ]
X        then
X                cat $LIBDIR/rnews.mail1 rnews.errors $LIBDIR/rnews.mail2 newsmail | mail root
X        fi
X        }
Xfi
X
Xrm -f newsitem newsmail rnews.errors
END_OF_FILE
if test 1301 -ne `wc -c <'rna/rnews.sh'`; then
    echo shar: \"'rna/rnews.sh'\" unpacked with wrong size!
fi
# end of 'rna/rnews.sh'
fi
if test -f 'rnews/headers.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'rnews/headers.h'\"
else
echo shar: Extracting \"'rnews/headers.h'\" \(1551 characters\)
sed "s/^X//" >'rnews/headers.h' <<'END_OF_FILE'
X/*
X * All the article header values worth retaining.
X *
X * All members of hdrs must point at malloced memory so that freeheaders
X * can free it without knowledge of what's malloced and what's static.
X * Furthermore, each member of hdrs must point at its own private copy
X * of its value string, for the above reason, and no other part of inews
X * may copy any member nor a modified copy of any member.
X * Perhaps C++ will allow this to be enforced by a strings class.
X */
Xstruct headers {
X	char *h_subj;		/* subject - only needed for controls */
X	char *h_ngs;		/* newsgroups */
X	char h_files[MAXLINE];	/* file names for history */
X	char *h_distr;		/* distribution for transmit */
X	char *h_ctlcmd;		/* control command */
X	char *h_approved;	/* needed for acceptance in moderated groups */
X	char *h_msgid;		/* needed for history & rejection */
X	char *h_artid;		/* needed for history & rejection (obs.) */
X	char *h_expiry;		/* needed for history */
X	char *h_path;		/* needed for transmit - must munge */
X	char h_tmpf[MAXFILE];	/* temp link name or first spool dir link */
X	char h_unlink;		/* flag: true iff h_tmpf should be unlinked */
X	char h_filed;		/* flag: true iff article has been filed */
X	char h_xref;		/* flag: true iff Xref: header generated yet */
X	char h_octlchked;	/* flag: true iff ngs checked for all.all.ctl */
X	char h_oldctl;		/* flag: true iff ngs were all.all.ctl when checked */
X	char *h_accum;		/* accumulated headers, if any */
X	unsigned h_bytesleft;	/* in h_accum */
X	long h_charswritten;	/* into spool directory, for batcher */
X};
END_OF_FILE
if test 1551 -ne `wc -c <'rnews/headers.h'`; then
    echo shar: \"'rnews/headers.h'\" unpacked with wrong size!
fi
# end of 'rnews/headers.h'
fi
if test -f 'rnews/man/rnews.1' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'rnews/man/rnews.1'\"
else
echo shar: Extracting \"'rnews/man/rnews.1'\" \(1506 characters\)
sed "s/^X//" >'rnews/man/rnews.1' <<'END_OF_FILE'
X.TH RNEWS 1 Usenet "Public Domain"
X.DA 22 Aug 1987
X.SH NAME
Xrnews, cunbatch \- receive `remote' news articles
X.SH SYNOPSIS
X.B rnews
X.SH DESCRIPTION
X.I Rnews
Xbroadcasts (network) news articles
X(receives `\fIr\fPemote'
X.IR news )
Xfrom its standard input.
X.I Cunbatch
Xis just a link to
X.IR rnews .
XTypically the articles will be in a batch
X(see
X.IR news (5)),
Xwhich may be compressed
X(see
X.IR compress (1)).
X.PP
XTypically articles are stored locally
Xand queued for transmission to one's netnews neighbours via
X.IR newsbatch (1)
Xand thence via
X.IR uux (1)
Xor
X.IR mail (1).
X.SH FILES
X.PD 0
X.TP 1.5i
X.I $NEWSARTS
Xnetnews article tree
X.TP 1.5i
X.IB $NEWSCTL /sys
Xdetermines who receives broadcast netnews articles
X.TP 1.5i
X.IB $NEWSCTL /active
Xcontains locally-legal newsgroups and (un)moderated flag
X.TP 1.5i
X.IB $NEWSCTL /log
Xlog of incoming articles
X.TP 1.5i
X.IB $NEWSCTL /errlog
Xlog of errors, should be empty
X.PD
X.SH "SEE ALSO"
X.IR compress (1),
X.IR mail (1),
X.IR newsbatch (1),
X.IR uux (1),
X.IR news (5)
X.SH DIAGNOSTICS
XBatches which generate
X.I rnews
Xerrors will be mailed to
X.IR usenet ,
Xwho should rerun them by hand after fixing the problem.
X.br
XIf
X.I compress
Xis not found by the standard PATH,
Xcompressed news batches may be mailed to
X.IR usenet .
X.SH HISTORY
XWritten by Geoff Collyer
Xat the University of Toronto
Xas part of the C news project.
X.SH BUGS
X.I Rnews
Xcould run much faster if
X.I Control:
Xwere required to be the first header,
Xif present,
Xand if
X.I Newsgroups:
Xwere required to be the next.
END_OF_FILE
if test 1506 -ne `wc -c <'rnews/man/rnews.1'`; then
    echo shar: \"'rnews/man/rnews.1'\" unpacked with wrong size!
fi
# end of 'rnews/man/rnews.1'
fi
if test -f 'rnews/realrnews' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'rnews/realrnews'\"
else
echo shar: Extracting \"'rnews/realrnews'\" \(1318 characters\)
sed "s/^X//" >'rnews/realrnews' <<'END_OF_FILE'
X#! /bin/sh
X# realrnews - receive remote news & relay: feeds incoming news to C news serverrnews
XNEWSCTL=${NEWSCTL-/usr/lib/news}	# export NEWSCTL
XNEWSBIN=${NEWSBIN-/usr/lib/newsbin}	# export NEWSBIN
XNEWSARTS=${NEWSARTS-/usr/spool/news}	# export NEWSARTS
XPATH=$NEWSCTL:$NEWSBIN:$NEWSBIN/relay:/bin:/usr/bin:/usr/local; export PATH
XNOTIFY=usenet
XF=/tmp/rnews$$			# should be lots of room here
XDEBUG=''
X
Xumask 2
Xtrap '' 1 2 15			# ignore signals to avoid losing articles
X
X# don't allow options
Xcase "$1" in
X-*)
X	echo "usage: $0" >&2
X	exit 1
X	;;
Xesac
X
X# capture incoming news in case serverrnews fails
Xif cat $* >$F; then
X	if uncompress <$F >$F.un; then
X		mv $F.un $F	# $F was compressed
X	else
X		rm $F.un	# $F was uncompressed already
X	fi
X	# -p redirects stdout & stderr into log files
X	if serverrnews -p -d "$DEBUG" <$F # -s $NEWSARTS -l $NEWSCTL
X	then
X		rm -f $F	# far out, it worked
X	else
X		status=$?
X		FAIL=$F.m
X		(cat <<!; sed 's/^/X/' $F; echo ---) >$FAIL
Xsubject: failed news; serverrnews status $status
X
X---
X!
X		if mail $NOTIFY <$FAIL; then
X			rm -f $FAIL	# $NOTIFY got told about the failure
X		else
X			# leave $FAIL and $F around to be seen
X			mail $NOTIFY <<!
Xlook at $FAIL and $F, they are lost news.
X!
X		fi
X	fi
Xelse
X	status=$?
X	(echo "subject: lost news; cat status $status"; echo; cat $F) |
X		mail $NOTIFY
Xfi
END_OF_FILE
if test 1318 -ne `wc -c <'rnews/realrnews'`; then
    echo shar: \"'rnews/realrnews'\" unpacked with wrong size!
fi
# end of 'rnews/realrnews'
fi
if test -f 'rnews/setnewsids/setnewsids.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'rnews/setnewsids/setnewsids.c'\"
else
echo shar: Extracting \"'rnews/setnewsids/setnewsids.c'\" \(2009 characters\)
sed "s/^X//" >'rnews/setnewsids/setnewsids.c' <<'END_OF_FILE'
X/*
X * setnewsids - sets ids to news/news, execs relay/relaynews.  Should be setuid-root.
X *	also add NEWSPERMS to the environment.
X */
X
X#include <stdio.h>
X#include <errno.h>
X#include <pwd.h>
X#include <grp.h>
X#include <sys/types.h>
X
X#include "news.h"
X#include "newspaths.h"
X
X#ifndef NEWSUSER
X#define NEWSUSER "news"
X#endif
X#ifndef NEWSGROUP
X#define NEWSGROUP "news"
X#endif
X
Xchar *progname;
X
Xstatic int userealids = NO;
X
X/*
X * main - parse arguments and handle options
X */
Xmain(argc, argv)
Xint argc;
Xchar *argv[];
X{
X	extern int optind;
X	extern char *optarg;
X
X	progname = argv[0];
X
X	/* setuid daemon prelude; various precautions */
X	(void) umask(newsumask());	/* undo silly umasks */
X	(void) alarm(0);		/* cancel any pending alarm */
X	/*
X	 * Reset certain environment variables to sane values.
X	 */
X	if (!putenv("PATH=/bin:/usr/bin") ||
X	    !putenv("IFS= \t\n"))
X		exit(1);
X	closeall(1);			/* closes all but std descriptors */
X	stdfdopen();			/* ensure standard descriptors are open */
X
X	setids();			/* change of real and effective ids */
X	/* we are now running as news, so you can all relax */
X
X	if (!putenv("NEWSPERMS="))	/* avoid loops with this marker */
X		exit(1);
X	execv(binfile("relay/relaynews"), argv);	/* re-run relay/relaynews */
X	error("can't exec %s", binfile("relay/relaynews"));
X}
X
Xsetids()				/* change of real and effective ids */
X{
X	int newsuid = getuid(), newsgid = getgid();	/* default to real ids */
X
X	(void) ctlfile((char *)NULL);	/* trigger unprivileged(), set userealids */
X	if (!userealids) {
X		register struct passwd *pwp;
X		register struct group *grp;
X
X		pwp = getpwnam(NEWSUSER);
X		if (pwp != NULL) {
X			newsuid = pwp->pw_uid;
X			newsgid = pwp->pw_gid;
X		}
X		(void) endpwent();
X		grp = getgrnam(NEWSGROUP);
X		if (grp != NULL)
X			newsgid = grp->gr_gid;
X		(void) endgrent();
X	}
X	(void) setgid(newsgid);
X	(void) setuid(newsuid);
X	/* we are now running as news, so you can all relax */
X}
X
Xvoid
Xunprivileged()			/* called if NEWSARTS, NEWSCTL or NEWSBIN present */
X{
X	userealids = YES;
X}
END_OF_FILE
if test 2009 -ne `wc -c <'rnews/setnewsids/setnewsids.c'`; then
    echo shar: \"'rnews/setnewsids/setnewsids.c'\" unpacked with wrong size!
fi
# end of 'rnews/setnewsids/setnewsids.c'
fi
if test -f 'rnews/sh/realrnews' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'rnews/sh/realrnews'\"
else
echo shar: Extracting \"'rnews/sh/realrnews'\" \(1318 characters\)
sed "s/^X//" >'rnews/sh/realrnews' <<'END_OF_FILE'
X#! /bin/sh
X# realrnews - receive remote news & relay: feeds incoming news to C news serverrnews
XNEWSCTL=${NEWSCTL-/usr/lib/news}	# export NEWSCTL
XNEWSBIN=${NEWSBIN-/usr/lib/newsbin}	# export NEWSBIN
XNEWSARTS=${NEWSARTS-/usr/spool/news}	# export NEWSARTS
XPATH=$NEWSCTL:$NEWSBIN:$NEWSBIN/relay:/bin:/usr/bin:/usr/local; export PATH
XNOTIFY=usenet
XF=/tmp/rnews$$			# should be lots of room here
XDEBUG=''
X
Xumask 2
Xtrap '' 1 2 15			# ignore signals to avoid losing articles
X
X# don't allow options
Xcase "$1" in
X-*)
X	echo "usage: $0" >&2
X	exit 1
X	;;
Xesac
X
X# capture incoming news in case serverrnews fails
Xif cat $* >$F; then
X	if uncompress <$F >$F.un; then
X		mv $F.un $F	# $F was compressed
X	else
X		rm $F.un	# $F was uncompressed already
X	fi
X	# -p redirects stdout & stderr into log files
X	if serverrnews -p -d "$DEBUG" <$F # -s $NEWSARTS -l $NEWSCTL
X	then
X		rm -f $F	# far out, it worked
X	else
X		status=$?
X		FAIL=$F.m
X		(cat <<!; sed 's/^/X/' $F; echo ---) >$FAIL
Xsubject: failed news; serverrnews status $status
X
X---
X!
X		if mail $NOTIFY <$FAIL; then
X			rm -f $FAIL	# $NOTIFY got told about the failure
X		else
X			# leave $FAIL and $F around to be seen
X			mail $NOTIFY <<!
Xlook at $FAIL and $F, they are lost news.
X!
X		fi
X	fi
Xelse
X	status=$?
X	(echo "subject: lost news; cat status $status"; echo; cat $F) |
X		mail $NOTIFY
Xfi
END_OF_FILE
if test 1318 -ne `wc -c <'rnews/sh/realrnews'`; then
    echo shar: \"'rnews/sh/realrnews'\" unpacked with wrong size!
fi
# end of 'rnews/sh/realrnews'
fi
if test -f 'rnews/speed/disk/active.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'rnews/speed/disk/active.c'\"
else
echo shar: Extracting \"'rnews/speed/disk/active.c'\" \(1426 characters\)
sed "s/^X//" >'rnews/speed/disk/active.c' <<'END_OF_FILE'
X/*
X * active file access functions (on-disk version)
X */
X
X#include <stdio.h>
X#include "inews.h"
X
Xstatic FILE *fp = NULL;
X
Xlong
Xnxtartnum(ng)
Xchar *ng;
X{
X	return incartnum(ng, 1);
X}
X
Xlong
Xprevartnum(ng)
Xchar *ng;
X{
X	return incartnum(ng, -1);
X}
X
Xstatic long
Xincartnum(ng, inc)
Xchar *ng;
Xint inc;
X{
X	register int nglen = strlen(ng);
X	register long pos, nextart = -1;
X	char line[MAXLINE];
X	extern char ldzeropad[];
X	long atol();
X
X	if (artload() != ST_OKAY)
X		return nextart;
X#ifdef MICROLOCKING
X	filelock(libfile("active"));
X#endif
X	(void) fseek(fp, 0L, 0);	/* start at the start */
X	for (pos = ftell(fp); fgets(line, sizeof line, fp) != NULL;
X	     pos = ftell(fp))
X		if (strncmp(line, ng, nglen) == 0 &&
X		    line[nglen] == ' ') {
X			nextart = atol(&line[nglen + 1]) + inc;
X			(void) fseek(fp, pos, 0);	/* back up */
X			(void) fprintf(fp, "%s ", ng);
X			(void) fprintf(fp, ldzeropad,
X				ARTNUMWIDTH, ARTNUMWIDTH, nextart);
X			(void) fflush(fp);
X			break;
X		}
X#ifdef MICROLOCKING
X	fileunlock(libfile("active"));
X#endif
X	return nextart;
X}
X
Xint
Xartload()				/* reload any cached data */
X{
X	int status = 0;
X	char *libfile();
X	FILE *fopenwclex();
X
X	if (fp == NULL)
X		if ((fp = fopenwclex(libfile("active"), "r+")) == NULL)
X			status |= ST_DROPPED;
X	return status;
X}
X
Xint
Xartsync()				/* sync to disk any cached data */
X{
X	int status = 0;
X
X	if (fp != NULL && fclose(fp) == EOF)
X		status |= ST_DROPPED;
X	fp = NULL;
X	return status;
X}
END_OF_FILE
if test 1426 -ne `wc -c <'rnews/speed/disk/active.c'`; then
    echo shar: \"'rnews/speed/disk/active.c'\" unpacked with wrong size!
fi
# end of 'rnews/speed/disk/active.c'
fi
if test -f 'rnews/speed/disk/sys.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'rnews/speed/disk/sys.c'\"
else
echo shar: Extracting \"'rnews/speed/disk/sys.c'\" \(1710 characters\)
sed "s/^X//" >'rnews/speed/disk/sys.c' <<'END_OF_FILE'
X/*
X * inews sys file reading functions (on-disk version)
X */
X
X#include <stdio.h>
X#include "inews.h"
X#include "system.h"
X
Xstatic FILE *fp = NULL;		/* descriptor for libfile("sys") */
X
Xstruct system *
Xoursys()			/* return our sys entry */
X{
X	register struct system *sys;
X	static struct system fakesys;
X	char *rindex();
X	char *hostname();
X	struct system *nextsys();
X
X	rewsys();
X	while ((sys = nextsys()) != NULL &&
X	    strcmp(sys->sy_name, hostname()) != 0)
X		;
X	if (sys == NULL) {		/* no entry; cook one up */
X		fakesys.sy_name = hostname();
X		fakesys.sy_ngs = "all";
X		fakesys.sy_flags = "";
X		fakesys.sy_cmd = "";
X		sys = &fakesys;
X	}
X	return sys;
X}
X
X/*
X * Returned pointer points at a static struct whose members
X * point at static storage.
X */
Xstruct system *
Xnextsys()			/* return next sys entry */
X{
X	register char *s;
X	register char **sp;
X	static char sysent[MAXLINE];
X	static struct system sys;	/* pointers into sysent */
X	char *strcpy(), *strcat(), *rindex();
X	char *hostname(), *libfile();
X	FILE *fopenwclex();
X
X	if (fp == NULL)
X		if ((fp = fopenwclex(libfile("sys"), "r")) == NULL)
X			return NULL;
X	while ((s = fgets(sysent, sizeof sysent, fp)) != NULL)
X		if (s[0] != '#')		/* not a comment */
X			break;
X	if (s == NULL)
X		return NULL;
X
X	s = rindex(sysent, '\n');
X	if (s != NULL)
X		*s = '\0';		/* trim newline */
X	sp = &sys.sy_name;		/* point at string pointers */
X	*sp++ = sysent;
X	for (s = sysent; *s != '\0'; s++)
X		if (*s == ':') {
X			*s = '\0';	/* turn colons into NULs */
X			if (sp <= &sys.sy_cmd)
X				*sp++ = s + 1;	/* point at next field */
X		}
X	for (; sp <= &sys.sy_cmd; sp++)
X		*sp = "";		/* fill remaining fields */
X	return &sys;
X}
X
Xrewsys()
X{
X	if (fp != NULL)
X		(void) fseek(fp, 0L, 0);
X}
END_OF_FILE
if test 1710 -ne `wc -c <'rnews/speed/disk/sys.c'`; then
    echo shar: \"'rnews/speed/disk/sys.c'\" unpacked with wrong size!
fi
# end of 'rnews/speed/disk/sys.c'
fi
if test -f 'rnews/test/lib/sys' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'rnews/test/lib/sys'\"
else
echo shar: Extracting \"'rnews/test/lib/sys'\" \(1751 characters\)
sed "s/^X//" >'rnews/test/lib/sys' <<'END_OF_FILE'
X# ourselves: accept everything but noise and ut.stardate from U. Texas
Xutcs:all,!ut.stardate,!net.philosophy,!net.politics,!net.religion,!net.flame,!net.bizarre,net.music.synth,!net.music,!net.audio,!net.abortion,!net.movies,!net.women,!net.sf-lovers,!net.origins
X# our news feed: send everything & locally-written articles go direct
Xutzoo:net,comp,news,sci,rec,misc,soc,talk,mod,world,na,can,ont,tor,ut,to.utzoo:F:/usr/src/cmd/news/rnews/test/newsbatch/utzoo
X# sites we feed (no outstanding requests)
X#	utfyzx gets everything we get
Xutfyzx:net,comp,news,sci,rec,misc,soc,talk,mod,world,na,can,ont,tor,ut,to.utfyzx:F:/usr/src/cmd/news/rnews/test/newsbatch/utfyzx
X#	ryesone gets everything we get.
Xryesone:net,comp,news,sci,rec,misc,soc,talk,mod,world,na,can,ont,tor,ut,to.ryesone:F:/usr/src/cmd/news/rnews/test/newsbatch/ryesone
X#	bnr-vpa gets everything we get except ut and tor
Xbnr-vpa:net,comp,news,sci,rec,misc,soc,talk,mod,world,na,can,ont,to.bnr-vpa:F:/usr/src/cmd/news/rnews/test/newsbatch/bnr-vpa
X#	utcsstat gets a few net groups and local groups
Xutcsstat:all.sources,mod.computers.sun,mod.computers.ibm-pc,net.unix-wizards,net.announce,net.math,net.physics,net.micro,net.news.config,world,can,ont,tor,ut,to.utcsstat:F:/usr/src/cmd/news/rnews/test/newsbatch/utcsstat
X#	utcsscb gets a few net groups plus local groups
Xutcsscb:net.announce,net.micro,net.unix,net.math,net.news.config,world,can,ont,tor,ut,to.utcsscb:F:/usr/src/cmd/news/rnews/test/newsbatch/utcsscb
X#	lsuc gets ont and net.news.config only.	their primary feed is mnetor.
Xlsuc:world,ont,net.news.config,to.lsuc:F:/usr/src/cmd/news/rnews/test/newsbatch/lsuc
X#	mnetor gets everything we post locally except ut
X#	utcsri gets just articles in local groups or locally-written articles
END_OF_FILE
if test 1751 -ne `wc -c <'rnews/test/lib/sys'`; then
    echo shar: \"'rnews/test/lib/sys'\" unpacked with wrong size!
fi
# end of 'rnews/test/lib/sys'
fi
if test -f 'rnews/vers/v7/gethostname.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'rnews/vers/v7/gethostname.c'\"
else
echo shar: Extracting \"'rnews/vers/v7/gethostname.c'\" \(1379 characters\)
sed "s/^X//" >'rnews/vers/v7/gethostname.c' <<'END_OF_FILE'
X/*
X * v7 gethostname simulation
X *	taken from pathalias and cleaned up.  Thanks, peter.
X */
X
X#include <stdio.h>
X
X#define MAXLINE 256
X#define min(a,b) ((a) < (b)? (a): (b))
X
Xstatic char defhost[] = "INSERT-YOUR-HOST-NAME-HERE";
X
Xint
Xgethostname(hostname, size)
Xchar *hostname;
Xint size;
X{
X	char *ptr;
X	FILE *whoami;
X	char *index(), *strncpy();
X	FILE *fopen(), *popen();
X
X	*hostname = '\0';
X	/* try /etc/whoami */
X	if ((whoami = fopen("/etc/whoami", "r")) != NULL) {
X		(void) fgets(hostname, size, whoami);
X		(void) fclose(whoami);
X		if ((ptr = index(hostname, '\n')) != NULL)
X			*ptr = '\0';
X	}
X	if (*hostname != '\0')
X		return 0;
X	/* try /usr/include/whoami.h */
X	if ((whoami = fopen("/usr/include/whoami.h", "r")) != NULL) {
X		while (!feof(whoami)) {
X			char sysname[MAXLINE];
X
X			if (fgets(sysname, MAXLINE, whoami) == NULL)
X				break;
X			if (sscanf(sysname, "#define sysname \"%[^\"]\"",
X			    hostname) > 0)
X				break;
X		}
X		(void) fclose(whoami);
X		if (*hostname != '\0')
X			return 0;
X	}
X	/* ask uucp */
X	if ((whoami = popen("PATH=/bin:/usr/bin:/usr/ucb uuname -l", "r")) != NULL) {
X		(void) fgets(hostname, size, whoami);
X		(void) pclose(whoami);
X		if ((ptr = index(hostname, '\n')) != NULL)
X			*ptr = '\0';
X	}
X	if (*hostname != '\0')
X		return 0;
X	/* aw hell, i give up!  is this a real unix? */
X	(void) strncpy(hostname, defhost, min(sizeof defhost, size));
X	return 0;
X}
END_OF_FILE
if test 1379 -ne `wc -c <'rnews/vers/v7/gethostname.c'`; then
    echo shar: \"'rnews/vers/v7/gethostname.c'\" unpacked with wrong size!
fi
# end of 'rnews/vers/v7/gethostname.c'
fi
if test -f 'time/getdate.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'time/getdate.c'\"
else
echo shar: Extracting \"'time/getdate.c'\" \(1241 characters\)
sed "s/^X//" >'time/getdate.c' <<'END_OF_FILE'
X/*
X * getdate ascii_time ... - print the time_t of ascii_time(s)
X */
X
X#include <stdio.h>
X#include <ctype.h>
X#include <time.h>
X#include <sys/types.h>
X#include <sys/timeb.h>
X
X#define	DAY	(24L*60L*60L)
X
Xstruct timeb ftnow;
X
Xchar *progname;
X
Xextern int errno;
Xextern char *strcpy();
Xextern char *strncpy();
Xextern char *strcat();
Xextern char *strchr();
Xextern char *strtok();
Xextern long atol();
Xextern char *malloc();
Xextern struct tm *gmtime();
Xextern time_t time();
X
Xextern time_t getdate();
X
X/* Forwards. */
Xextern void process();
X
X/*
X - main - parse arguments and handle options
X */
Xmain(argc, argv)
Xint argc;
Xchar *argv[];
X{
X	register int c;
X	register int errflg = 0;
X	extern int optind;
X	extern char *optarg;
X
X	progname = argv[0];
X	ftime(&ftnow);
X
X	while ((c = getopt(argc, argv, "")) != EOF)
X		switch (c) {
X		case '?':
X		default:
X			errflg++;
X			break;
X		}
X	if (errflg || optind == argc) {
X		(void) fprintf(stderr, "Usage: %s ascii_time ...\n", progname);
X		exit(2);
X	}
X
X	for (; optind < argc; optind++)
X		process(argv[optind]);
X	exit(0);
X}
X
X/*
X * process - print time_t of tm
X */
Xvoid
Xprocess(tm)
Xchar *tm;
X{
X	time_t it;
X
X	it = getdate(tm, &ftnow);
X	if (it < 0)
X		error("`%s' not valid date", tm);
X	else
X		(void) printf("%ld\n", it);
X}
END_OF_FILE
if test 1241 -ne `wc -c <'time/getdate.c'`; then
    echo shar: \"'time/getdate.c'\" unpacked with wrong size!
fi
# end of 'time/getdate.c'
fi
echo shar: End of archive 4 \(of 14\).
##  End of shell archive.
exit 0