[mod.sources] v07i055: 2.11 News Source, Part06/09

sources-request@mirror.TMC.COM (11/07/86)

Submitted by: seismo!rick (Rick Adams)
Mod.sources: Volume 7, Issue 55
Archive-name: 2.11news/Part06

# To extract, sh this file
#	news 2.11 source part 6 of 9
if test ! -d src
then
	mkdir src
fi
echo x - src/header.c 1>&2
sed 's/.//' >src/header.c <<'*-*-END-of-src/header.c-*-*'
-/*
- * This software is Copyright (c) 1986 by Rick Adams.
- *
- * Permission is hereby granted to copy, reproduce, redistribute or
- * otherwise use this software as long as: there is no monetary
- * profit gained specifically from the use or reproduction or this
- * software, it is not sold, rented, traded or otherwise marketed, and
- * this copyright notice is included prominently in any copy
- * made.
- *
- * The author make no claims as to the fitness or correctness of
- * this software for any use whatsoever, and it is provided as is. 
- * Any use of this software is at the user's own risk.
- *
- * header.c - header functions plus some other goodies
- */
-
-#ifdef SCCSID
-static char	*SccsId = "@(#)header.c	2.43	10/23/86";
-#endif /* SCCSID */
-
-#include <stdio.h>
-#include "params.h"
-
-char *hfgets();
-
-char *news_version = NEWS_VERSION;
-
-/*
- * Read header from file fp into *hp.  If wholething is FALSE,
- * it's an incremental read, otherwise start from scratch.
- * Return (FILE *) if header okay, else NULL.
- */
-FILE *
-hread(hp, fp, wholething)
-register struct hbuf *hp;
-FILE *fp;
-int wholething;
-{
-	register int	len;
-	register int	i;
-#ifdef OLD
-	char *p;
-#endif /* OLD */
-
-	if (wholething) {
-		for(i=0;i<NUNREC;i++)
-			if (hp->unrec[i] != NULL)
-				free(hp->unrec[i]);
-			else
-				break;
-		bzero((char *)hp, sizeof (*hp));
-		for (i=0;i<NUNREC;i++)
-			hp->unrec[i] = NULL;
-	}
-
-	/* Check that it's a B news style header. */
-	if (hfgets(bfr, PATHLEN, fp) != NULL && isalpha(bfr[0])
-	    && index(bfr, ':'))
-		if (frmread(fp, hp))
-			goto strip;
-
-	if (!nstrip(bfr+1))
-		return NULL;
-
-	/* It's not.  Try A news (begins with PROTO). */
-	if (bfr[0] != PROTO)
-		return NULL;
-#ifndef OLD
-	logerr("Can not process A news format article without OLD defined");
-#else /* OLD */
-	/* Read in an A news format article. */
-	p = index(bfr+1, '.');
-	if (p == NULL) {
-		(void) strcpy(hp->ident, bfr+1);
-		return NULL;
-	}
-	*p++ = '\0';
-	(void) sprintf(hp->ident, "<%s@%s%s>", p, bfr+1, ".UUCP");
-
-	/* Newsgroup List */
-	if (hfgets(hp->nbuf, BUFLEN, fp) == NULL || !nstrip(hp->nbuf))
-		return NULL;
-	/* source path */
-	if (hfgets(hp->path, PATHLEN, fp) == NULL || !nstrip(hp->path))
-		return NULL;
-	/* date */
-	if (hfgets(hp->subdate, DATELEN, fp) == NULL || !nstrip(hp->subdate))
-		return NULL;
-	/* title */
-	if (hfgets(hp->title, BUFLEN, fp) == NULL || !nstrip(hp->title))
-		return NULL;
-#endif /* OLD */
-
-strip:	/* strip off sys! from front of path. */
-	if (strncmp(FULLSYSNAME, hp->path, (len = strlen(FULLSYSNAME))) == 0
-		&& index(NETCHRS, hp->path[len]))
-		(void) strcpy(hp->path, &(hp->path[len+1]));
-	lcase(hp->nbuf);
-
-	/* Intuit the From: line if only a path was given. */
-	if (wholething) {
-#ifdef OLD
-		if (hp->from[0] == '\0')
-			intuitfrom(hp);
-		else
-#endif /* OLD */
-			fixfrom(hp);
-	}
-
-	return fp;
-}
-
-
-/*
- * Get header info from mail-format file.
- * Return non-zero on success.
- */
-#define FROM 		1
-#define NEWSGROUP 	2
-#define TITLE 		3
-#define SUBMIT		4
-#define RECEIVE		5
-#define EXPIRE		6
-#define ARTICLEID	7
-#define MESSAGEID	8
-#define REPLYTO		9
-#define FOLLOWID	10
-#define CONTROL		11
-#define SENDER		12
-#define FOLLOWTO	13
-#define PATH		14
-#define POSTVERSION	15
-#define RELAYVERSION	16
-#define DISTRIBUTION	17
-#define ORGANIZATION	18
-#define NUMLINES	19
-#define KEYWORDS	20
-#define APPROVED	21
-#define NFID		22
-#define NFFROM		23
-#define XREF		24
-#define SUMMARY		25
-#define XPATH		26
-#define OTHER		99
-
-char *malloc();
-
-frmread(fp, hp)
-register FILE *fp;
-register struct hbuf *hp;
-{
-	int	unreccnt = 0;
-	register int	i;
-	long	curpos;
-
-	i = type(bfr);
-	do {
-		curpos = ftell(fp);
-		switch (i) {
-		case PATH:
-			getfield(hp->path, sizeof(hp->path));
-			break;
-		case FROM:
-			getfield(hp->from, sizeof(hp->from));
-			break;
-		case NEWSGROUP:
-			getfield(hp->nbuf, sizeof(hp->nbuf));
-			break;
-		case TITLE:
-			getfield(hp->title, sizeof(hp->title));
-			break;
-		case SUBMIT:
-			getfield(hp->subdate, sizeof(hp->subdate));
-			break;
-		case EXPIRE:
-			getfield(hp->expdate, sizeof(hp->expdate));
-			break;
-#ifdef OLD
-		case ARTICLEID:
-			/* Believe Message-ID in preference to Article-ID */
-			if (hp->ident[0] == '\0') {
-				register char *p;
-				char msgb[NAMELEN];
-				getfield(msgb, sizeof msgb);
-				p = index(msgb, '.');
-				if (p == NULL) {
-					(void) strcpy(hp->ident, msgb);
-				} else {
-					*p++ = '\0';
-					(void) sprintf(hp->ident, "<%s@%s%s>", p, msgb, ".UUCP");
-				}
-			}
-			break;
-#endif /* OLD */
-		case MESSAGEID:
-			getfield(hp->ident, sizeof(hp->ident));
-			break;
-		case REPLYTO:
-			getfield(hp->replyto, sizeof(hp->replyto));
-			break;
-		case FOLLOWID:
-			getfield(hp->followid, sizeof(hp->followid));
-			break;
-		case SENDER:
-			getfield(hp->sender, sizeof(hp->sender));
-			break;
-		case FOLLOWTO:
-			getfield(hp->followto, sizeof(hp->followto));
-			break;
-		case CONTROL:
-			getfield(hp->ctlmsg, sizeof(hp->ctlmsg));
-			break;
-		case DISTRIBUTION:
-			getfield(hp->distribution, sizeof(hp->distribution));
-			break;
-		case ORGANIZATION:
-			getfield(hp->organization, sizeof(hp->organization));
-			break;
-		case NUMLINES:
-			getfield(hp->numlines, sizeof(hp->numlines));
-			hp->intnumlines = atoi(hp->numlines);
-			break;
-		case KEYWORDS:
-			getfield(hp->keywords, sizeof(hp->keywords));
-			break;
-		case APPROVED:
-			getfield(hp->approved, sizeof(hp->approved));
-			break;
-		case NFID:
-			getfield(hp->nf_id, sizeof(hp->nf_id));
-			break;
-		case NFFROM:
-			getfield(hp->nf_from, sizeof(hp->nf_from));
-			break;
-		/* discard these lines */
-		case XREF:
-		case XPATH:
-		case RELAYVERSION:
-		case POSTVERSION:
-		case RECEIVE:
-			break;
-		case SUMMARY:
-			getfield(hp->summary, sizeof(hp->summary));
-			break;
-		case OTHER:
-			if (unreccnt < NUNREC) {
-				if ((hp->unrec[unreccnt] = malloc((unsigned)(strlen(bfr) + 1))) != NULL ) {
-					(void) strcpy(hp->unrec[unreccnt], bfr);
-					(void) nstrip(hp->unrec[unreccnt]);
-					unreccnt++;
-				} else
-					xerror("frmread: out of memory");
-			}
-			break;
-		}
-	} while ((i = type(hfgets(bfr, LBUFLEN, fp))) > 0);
-
-	if (*bfr != '\n')
-		fseek(fp, curpos, 0);
-	if ((hp->from[0] || hp->path[0]) && hp->subdate[0] && hp->ident[0])
-		return TRUE;
-	return FALSE;
-}
-
-#ifdef OLD
-/*
- * There was no From: line in the message (because it was generated by
- * an old news program).  Guess what it should have been and create it.
- */
-intuitfrom(hp)
-register struct hbuf *hp;
-{
-	char *tp;
-	char *user, *host;
-	char *tailpath(), *rindex();
-	char *at, *dot;
-	char pathbuf[PATHLEN];
-	char fullname[BUFLEN];
-
-	tp = tailpath(hp);
-	user = rindex(tp, '!');
-	if (user == NULL)
-		user = tp;
-	else
-		*user++ = '\0';
-
-	/* Check for an existing Internet address on the end. */
-	at = index(user, '@');
-	if (at) {
-		dot = index(at, '.');
-		if (dot) {
-			(void) strcpy(hp->from, user);
-			return;
-		}
-		/* @ signs are illegal except for the biggie, so */
-		*at = '%';
-	}
-
-	if (tp[0] == '.')
-		host = index(tp, '!') + 1;
-	else if (user == tp)
-		host = FULLSYSNAME;
-	else
-		host = tp;
-
-	tp = index(host, '@');
-	if (tp != NULL)
-		*tp = 0;
-	(void) sprintf(hp->from, "%s@%s%s", user, host, MYDOMAIN);
-
-	skin(pathbuf, fullname, hp->path);	/* remove RFC822-style comments */
-	if (fullname[0] != '\0') {
-		strcat(hp->from, " (");
-		(void) strcat(hp->from, fullname);
-		strcat(hp->from, ")");
-	}
-	strcpy(hp->path, pathbuf);	/* and stick it back in */
-}
-#endif /* OLD */
-
-/*
- * Canonicalize the "From:" line into the form
- *
- * From: <mail-address> (full-name)
- *
- * RFC822 doesn't require the comment to be at the end of the string
- * like that.
- */
-fixfrom(hp)
-register struct hbuf *hp;
-{
-	char frombuf[PATHLEN];
-	char fullname[BUFLEN];
-
-	skin(frombuf, fullname, hp->from);	/* remove RFC822-style comments */
-	if (fullname[0] != '\0') {
-		strcat(frombuf, " (");
-		strcat(frombuf, fullname);
-		strcat(frombuf, ")");
-	}
-	strcpy(hp->from, frombuf);	/* stick the canonicalized "from" back in */
-}
-
-skin(name, fullname, hfield)
-char *name;
-char *fullname;
-char *hfield;
-{
-	register int c;
-	register char *cp, *cp2;
-	char *bufend;
-	int gotlt, parenlev, lastsp;
-	int seenfullname = FALSE;
-
-	*fullname = '\0';	/* no full name yet */
-	if (strpbrk(hfield, "(< ") == NULL) {		/* include ',' ?? */
-		strcpy(name, hfield);
-		return;
-	}
-	gotlt = 0;
-	parenlev = 0;
-	lastsp = 0;
-	bufend = name;
-	for (cp = hfield, cp2 = bufend; c = *cp++; ) {
-		switch (c) {
-		case '(':
-			/*
-			 * Start of a "comment".
-			 * Ignore it, or save it in "fullname" if we haven't
-			 * seen a comment yet.
-			 */
-			parenlev++;
-			while ((c = *cp) != 0) {
-				cp++;
-				switch (c) {
-				case '\\':
-					if ((c = *cp) == 0)
-						goto outcm;
-					cp++;
-					break;
-				case '(':
-					parenlev++;
-					break;
-				case ')':
-					parenlev--;
-					if (parenlev == 0)
-						goto outcm;
-					break;
-				}
-				if (!seenfullname)
-					*fullname++ = c;
-			}
-		outcm:
-			parenlev = 0;
-			lastsp = 0;
-			if (!seenfullname) {
-				*fullname = '\0';
-				seenfullname = TRUE;	/* only extract first comment */
-			}
-			break;
-
-		case '"':
-			/*
-			 * Start of a "quoted-string".
-			 * Copy it in its entirety.
-			 */
-			while ((c = *cp) != 0) {
-				cp++;
-				switch (c) {
-				case '\\':
-					if ((c = *cp) == 0)
-						goto outqs;
-					cp++;
-					break;
-				case '"':
-					goto outqs;
-				}
-				*cp2++ = c;
-			}
-		outqs:
-			lastsp = 0;
-			break;
-
-		case ' ':
-			if (cp[0] == 'a' && cp[1] == 't' && cp[2] == ' ')
-				cp += 3, *cp2++ = '@';
-			else
-			if (cp[0] == '@' && cp[1] == ' ')
-				cp += 2, *cp2++ = '@';
-			else
-				lastsp = 1;
-			break;
-
-		case '<':
-			if (!seenfullname) {
-				*cp2 = '\0';
-				strcpy(fullname, name);
-				seenfullname = TRUE;
-			}
-			cp2 = bufend;
-			gotlt++;
-			lastsp = 0;
-			break;
-
-		case '>':
-			if (gotlt) {
-				gotlt = 0;
-				/*
-				 * this doesn't seem reasonable, what about (,)
-				 * or "," ??
-				 */
-				while (*cp != ',' && *cp != 0)
-					cp++;
-				if (*cp == 0 )
-					goto done;
-				*cp2++ = ',';
-				*cp2++ = ' ';
-				bufend = cp2;
-				break;
-			}
-
-			/* Fall into . . . */
-
-		default:
-			if (lastsp) {
-				lastsp = 0;
-				*cp2++ = ' ';
-			}
-			*cp2++ = c;
-			break;
-		}
-	}
-done:
-	*cp2 = 0;
-}
-
-
-#ifdef OLD
-char *
-oident(ident)
-char *ident;
-{
-	char lbuf[BUFLEN];
-	static char oidbuf[BUFLEN];
-	register char *p, *q;
-
-	(void) strcpy(lbuf, ident);
-	p = index(lbuf, '@');
-	if (p == NULL)
-		return ident;
-	*p++ = '\0';
-	q = index(p, '.');
-	if (q == NULL)
-		q = index(p, '>');
-	if (q)
-		*q++ = '\0';
-	p[SNLN] = '\0';
-	(void) sprintf(oidbuf, "%s.%s", p, lbuf+1);
-	return oidbuf;
-}
-#endif /* OLD */
-
-/*
- * Get the given field of a header (char * parm) from bfr, but only
- * if there's something actually there (after the colon).  Don't
- * bother if we already have an entry for this field.
- */
-getfield(hpfield, size)
-char	*hpfield;
-int	size;
-{
-	register char	*ptr;
-
-	if (hpfield[0])
-		return;
-	for (ptr = index(bfr, ':'); isspace(*++ptr); )
-		;
-	if (*ptr != '\0') {
-		(void) strncpy(hpfield, ptr, size - 1);
-		(void) nstrip(hpfield);
-	}
-}
-
-
-#define its(type) (prefix(ptr, type))
-type(ptr)
-register char	*ptr;
-{
-	register char	*colon, *space;
-
-	if (ptr == NULL)
-		return FALSE;
-	if (its("From: "))
-		if (index(ptr, '@') || !index(ptr, '!'))
-			return FROM;
-		else
-			return PATH;
-	if (its("Path: "))
-		return PATH;
-	if (its("Newsgroups: "))
-		return NEWSGROUP;
-	if (its("Subject: "))
-		return TITLE;
-	if (its("Date: "))
-		return SUBMIT;
-	if (its("Date-Received: "))
-		return RECEIVE;
-#ifdef OLD
-	if (its("Title: "))
-		return TITLE;
-	if (its("Posted: "))
-		return SUBMIT;
-	if (its("Received: "))
-		return RECEIVE;
-#endif /* OLD */
-	if (its("Expires: "))
-		return EXPIRE;
-	if (its("Article-I.D.: "))
-		return ARTICLEID;
-	if (its("Message-ID: "))
-		return MESSAGEID;
-	if (its("Reply-To: "))
-		return REPLYTO;
-	if (its("References: "))
-		return FOLLOWID;
-	if (its("Control: "))
-		return CONTROL;
-	if (its("Sender: "))
-		return SENDER;
-	if (its("Followup-To: "))
-		return FOLLOWTO;
-	if (its("Posting-Version: "))
-		return POSTVERSION;
-	if (its("Relay-Version: "))
-		return RELAYVERSION;
-	if (its("Distribution: "))
-		return DISTRIBUTION;
-	if (its("Organization: "))
-		return ORGANIZATION;
-	if (its("Lines: "))
-		return NUMLINES;
-	if (its("Summary: "))
-		return SUMMARY;
-	if (its("Keywords: "))
-		return KEYWORDS;
-	if (its("Approved: "))
-		return APPROVED;
-	if (its("Nf-ID: "))
-		return NFID;
-	if (its("Nf-From: "))
-		return NFFROM;
-	if (its("Xref: "))
-		return XREF;
-	if (its("Xpath: "))
-		return XPATH;
-	if (!isalpha(*ptr))
-		return FALSE;
-	colon = index(ptr, ':');
-	space = index(ptr, ' ');
-	if (!colon || space && space < colon)
-		return FALSE;
-	return OTHER;
-}
-
-/*
- * Write header at 'hp' on stream 'fp' in B+ format.  Include received date
- * if wr is 1.  Leave off sysname if wr is 2.
- */
-ihwrite(hp, fp, wr)
-register struct hbuf *hp;
-register FILE *fp;
-int	wr;
-{
-	int iu;
-	time_t t;
-	time_t cgtdate();
-
-	/*
-	 * We're being tricky with Path/From because of upward compatibility
-	 * issues.  The new version considers From and Path to be separate.
-	 * The old one thinks they both mean "Path" but only believes the
-	 * first one it sees, so will ignore the second.
-	 */
-	if (prefix(hp->path, FULLSYSNAME) &&
-		index(NETCHRS, hp->path[strlen(FULLSYSNAME)]))
-		fprintf(fp, "Path: %s\n", hp->path);
-	else
-		fprintf(fp, "Path: %s!%s\n", FULLSYSNAME, hp->path);
-	if (hp->from[0])
-		fprintf(fp, "From: %s\n", hp->from);
-
-	fprintf(fp, "Newsgroups: %s\n", hp->nbuf);
-	fprintf(fp, "Subject: %s\n", hp->title);
-	if (*hp->summary)
-		fprintf(fp, "Summary: %s\n", hp->summary);
-	if (*hp->keywords)
-		fprintf(fp, "Keywords: %s\n", hp->keywords);
-	fprintf(fp, "Message-ID: %s\n", hp->ident);
-	t = cgtdate(hp->subdate);
-	fprintf(fp, "Date: %s\n", arpadate(&t));
-#ifdef OLD
-	fprintf(fp, "Article-I.D.: %s\n", oident(hp->ident));
-	fprintf(fp, "Posted: %s", ctime(&t));
-#endif /* OLD */
-	if (*hp->expdate)
-		fprintf(fp, "Expires: %s\n", hp->expdate);
-	if (*hp->followid) {
-		register char *dp, *cp;
-
-		dp = cp = hp->followid;
-		while (*cp != '\0')
-			if (*cp == '<' && *(cp + 1) == '>')
-				cp += 2;
-			else
-				*dp++ = *cp++;
-		*dp = '\0';
-		if (*hp->followid)
-			fprintf(fp, "References: %s\n", hp->followid);
-	}
-	if (*hp->ctlmsg)
-		fprintf(fp, "Control: %s\n", hp->ctlmsg);
-	if (*hp->sender)
-		fprintf(fp, "Sender: %s\n", hp->sender);
-	if (*hp->replyto)
-		fprintf(fp, "Reply-To: %s\n", hp->replyto);
-	if (*hp->followto)
-		fprintf(fp, "Followup-To: %s\n", hp->followto);
-	if (*hp->distribution)
-		fprintf(fp, "Distribution: %s\n", hp->distribution);
-	if (*hp->organization)
-		fprintf(fp, "Organization: %s\n", hp->organization);
-	if (*hp->numlines)
-		fprintf(fp, "Lines: %s\n", hp->numlines);
-	if (*hp->approved)
-		fprintf(fp, "Approved: %s\n", hp->approved);
-	if (*hp->nf_id)
-		fprintf(fp, "Nf-ID: %s\n", hp->nf_id);
-	if (*hp->nf_from)
-		fprintf(fp, "Nf-From: %s\n", hp->nf_from);
-#ifdef DOXREFS
-	if ( wr ==1 && *hp->xref)
-		fprintf(fp, "Xref: %s\n", hp->xref);
-#endif /* DOXREFS */
-	for (iu = 0; iu < NUNREC; iu++) {
-		if (hp->unrec[iu])
-			fprintf(fp, "%s\n", &hp->unrec[iu][0]);
-	}
-	putc('\n', fp);
-}
-
-
-#ifndef BSD4_2
-/*
- * Set nc bytes, starting at cp, to zero.
- */
-bzero(cp, nc)
-register char	*cp;
-register int	nc;
-{
-	if (nc > 0)
-		do {
-			*cp++ = 0;
-		} while (--nc);
-}
-#endif /* !BSD4_2 */
-
-/*
- * hfgets is like fgets, but deals with continuation lines.
- * It also ensures that even if a line that is too long is
- * received, the remainder of the line is thrown away
- * instead of treated like a second line.
- */
-char *
-hfgets(buf, len, fp)
-char *buf;
-int len;
-FILE *fp;
-{
-	register int c;
-	register int n = 0;
-	register char *cp;
-
-	cp = buf;
-	while (n < len && (c = getc(fp)) != EOF) {
-		if (c == '\n')
-			break;
-		if (isprint(c) || c == '\b' || c == ' ' || c == '\t') {
-			*cp++ = c;
-			n++;
-		}
-	}
-	if (c == EOF && cp == buf)
-		return NULL;
-	*cp = '\0';
-
-	if (c != '\n') {
-		/* Line too long - part read didn't fit into a newline */
-		while ((c = getc(fp)) != '\n' && c != EOF)
-			;
-	} else if (cp == buf) {
-		/* Don't look for continuation of blank lines */
-		*cp++ = '\n';
-		*cp = '\0';
-		return buf;
-	}
-
-	while ((c = getc(fp)) == ' ' || c == '\t') {	/* for each cont line */
-		/* Continuation line. */
-		if ((n += 2) < len) {
-			*cp++ = '\n';
-			*cp++ = c;
-		}
-		while ((c = getc(fp)) != '\n' && c != EOF)
-			if ((isprint(c) || c == '\b' || c == ' ' || c == '\t')
-				&& n++ < len)
-				*cp++ = c;
-	}
-	if (n >= len - 1)
-		cp = buf + len - 2;
-	*cp++ = '\n';
-	*cp = '\0';
-	if (c != EOF)
-		(void) ungetc(c, fp); /* push back first char of next header */
-	return buf;
-}
*-*-END-of-src/header.c-*-*
echo x - src/rfuncs.c 1>&2
sed 's/.//' >src/rfuncs.c <<'*-*-END-of-src/rfuncs.c-*-*'
-/*
- * This software is Copyright (c) 1986 by Rick Adams.
- *
- * Permission is hereby granted to copy, reproduce, redistribute or
- * otherwise use this software as long as: there is no monetary
- * profit gained specifically from the use or reproduction or this
- * software, it is not sold, rented, traded or otherwise marketed, and
- * this copyright notice is included prominently in any copy
- * made.
- *
- * The author make no claims as to the fitness or correctness of
- * this software for any use whatsoever, and it is provided as is. 
- * Any use of this software is at the user's own risk.
- *
- * rfuncs - functions for readnews.
- */
-
-#ifdef SCCSID
-static char	*SccsId = "@(#)rfuncs.c	2.31	10/23/86";
-#endif /* SCCSID */
-
-/*LINTLIBRARY*/
-
-#include "rparams.h"
-
-char lentab[LINES];	/* length of newsgroupname for each rcline */
-long nngsize;		/* The next upcoming value of ngsize. */
-long nminartno;		/* Smallest article number in this group */
-int BITMAPSIZE = 0;
-
-nextng()
-{
-	long	curpos;
-#ifdef DEBUG
-	fprintf(stderr, "nextng()\n");
-#endif
-	curpos = ftell(actfp);
-
-next:
-#ifdef DEBUG
-	fprintf(stderr, "next:\n");
-#endif
-	if (actdirect == BACKWARD) {
-		if (back()) {
-			(void) fseek(actfp, curpos, 0);
-			return 1;
-		}
-		if (back()) {
-			(void) fseek(actfp, curpos, 0);
-			return 1;
-		}
-	}
-	if (fgets(afline, BUFLEN, actfp) == NULL)
-		return 1;
-	if (sscanf(afline, "%s %ld %ld", bfr, &nngsize, &nminartno) < 3) {
-		bfr[0] = '\0';
-		nngsize = 0;
-		nminartno = 0;
-	}
-#ifdef DEBUG
-	fprintf(stderr, "bfr = '%s'\n", bfr);
-#endif
-
-	if (!ngmatch(bfr, header.nbuf))
-		goto next;
-	if (xflag)
-		readmode = SPEC;
-	else
-		readmode = NEXT;
-	if (selectng(bfr, TRUE, FALSE))
-		goto next;
-	return 0;
-}
-
-
-selectng(name, fastcheck, resubscribe)
-char	*name;
-{
-	register char	*ptr, punct = ',';
-	register int	i;
-	register char	*p;
-	register long	cur;
-	long	next = 0;
-	FILE *af;
-	long s, sm;
-	char buf[100], n[100];
-
-#ifdef DEBUG
-	fprintf(stderr,"selectng: groupdir = %s\n", groupdir);
-#endif /* DEBUG */
-	if (*groupdir)
-		updaterc();
-	last = 1;
-	if (strcmp(name, bfr)) {
-		af = xfopen(ACTIVE, "r");
-		while (fgets(buf, sizeof buf, af) != NULL) {
-			if (sscanf(buf, "%s %ld %ld", n, &s, &sm) == 3 &&
-			     strcmp(n, name) == 0) {
-				ngsize = s;
-				minartno = sm;
-				break;
-			}
-		}
-		(void) fclose(af);
-	} else {
-		ngsize = nngsize;
-		minartno = nminartno;
-	}
-#ifdef DEBUG
-	fprintf(stderr, "selectng(%s) sets ngsize to %ld, minartno to %ld\n",
-		name, ngsize, minartno);
-#endif
-	(void) strcpy(groupdir, name);
-	if (!xflag) {
-		i = findrcline(name);
-		if (i >= 0) {
-			if (p = index(rcline[i], '!')) {
-				switch (resubscribe) {
-				case FALSE:
-					groupdir[0] = 0;
-					return 1;
-				case TRUE:
-					*p = ':';
-					break;
-				case PERHAPS:
-					zapng = TRUE;
-					break;
-				}
-			} else
-				p = index(rcline[i], ':');
-			if (!p) /* shouldn't happen */
-				p = rcline[i];
-			while (*++p == ' ')
-				;
-			(void) sprintf(rcbuf, "%s%s%ld", rcline[i],
-				*p == '\0' ? " " : ",", ngsize+1);
-		}
-		else
-			(void) sprintf(rcbuf, "ng: %ld", ngsize+1);
-	} else
-		(void) sprintf(rcbuf, "ng: %ld", ngsize+1);
-#ifdef DEBUG
-	fprintf(stderr, "rcbuf set to %s\n", rcbuf);
-#endif /* DEBUG */
-
-	/*
-	 * Fast check for common case: 1-###
-	 */
-	if (fastcheck) {
-		p = rcbuf;
-		while (*p != ' ')
-			p++;
-		while (*p == ' ')
-			p++;
-		if (*p++ == '1' && *p++ == '-') {
-			cur = 0;
-			while (isdigit(*p))
-				cur = 10 * cur + *p++ - '0';
-			if (*p == ',' && cur == ngsize) {
-#ifdef DEBUG
-				fprintf(stderr, "Group: %s, all read\n", groupdir);
-#endif
-				groupdir[0] = 0;
-				return 1;
-			}
-			if (cur > ngsize) {
-				/*
-				 * Claim to have read articles
-				 * which "active" believes have
-				 * never existed - we believe "active"
-				 */
-				fprintf(stderr,
-					"%s %s...\r\n\t%s %ld to %ld\r\n",
-					"Warning: newsgroup", groupdir,
-					"last article claimed read reset from",
-					cur, ngsize);
-			}
-		}
-	}
-
-/*
- * The key to understanding this piece of code is that a bit is set iff
- * that article has NOT been read.  Thus, we fill in the holes when
- * commas are found (e.g. 1-20,30-35 will result in filling in the 21-29
- * holes), and so we assume the newsrc file is properly ordered, the way
- * we write it out.
- */
-	if ((ngsize-minartno) > BITMAPSIZE) {
-		/* This should never happen */
-		(void) xerror("Bitmap not large enough for newsgroup %s", groupdir);
-	}
-
-	cur = 0;
-	bzero(bitmap, (int) (ngsize-minartno)/8+1); /* 8 bits per character */
-
-	/* Decode the .newsrc line indicating what we have read. */
-	for (ptr = rcbuf; *ptr && *ptr != ':'; ptr++)
-		;
-	while (*ptr) {
-		while (!isdigit(*ptr) && *ptr)
-			ptr++;
-		if (!*ptr)
-			break;
-		(void) sscanf(ptr, "%ld", &next);
-		if (punct == ',') {
-			while (++cur < next) {
-				set(cur);
-			}
-		}
-		cur = next;
-		while (!ispunct(*ptr) && *ptr)
-			ptr++;
-		punct = *ptr;
-	}
-	if (rflag)
-		bit = ngsize+1;
-	else
-		bit = minartno -1;
-	nextbit();
-	ngrp = 1;
-	return 0;
-}
-
-#ifdef TMAIL
-catchterm()
-{
-	(void) unlink(infile);
-	(void) unlink(outfile);
-	xxit(0);
-}
-
-
-/*
- * The -M (Mail) interface.  This code is a reasonably simple model for
- * writing other interfaces.  We write out all relevant articles to
- * a temp file, then invoke Mail with an option to have it tell us which
- * articles it read.  Finally we count those articles as really read.
- */
-Mail()
-{
-	register FILE *fp = NULL, *ofp;
-	struct hbuf h;
-	register char	*ptr, *fname;
-	int	news = 0;
-	register int i;
-
-	for(i=0;i<NUNREC;i++)
-		h.unrec[i] = NULL;
-
-	ofp = xfopen(mktemp(outfile), "w");
-	if (aflag && *datebuf)
-		if ((atime = cgtdate(datebuf)) == -1)
-			xerror("Cannot parse date string");
-	while (!nextng())
-		while (bit <= ngsize) {
-			(void) sprintf(filename, "%s/%ld", dirname(groupdir), bit);
-			if (access(filename, 4)
-			|| ((fp = art_open (filename, "r")) == NULL)
-			|| (hread(&h, fp, TRUE) == NULL)
-			|| !aselect(&h, FALSE)) {
-#ifdef DEBUG
-				fprintf(stderr, "Bad article '%s'\n", filename);
-#endif
-				if (fp != NULL) {
-					(void) fclose(fp);
-					fp = NULL;
-				}
-				clear(bit);
-				nextbit();
-				continue;
-			}
-			fname = ptr = index(h.from, '(');
-			if (fname) {
-				while (ptr && ptr[-1] == ' ')
-					ptr--;
-				if (ptr)
-					*ptr = 0;
-				fname++;
-				ptr = fname + strlen(fname) - 1;
-				if (*ptr == ')')
-					*ptr = 0;
-			}
-			h.subtime = cgtdate(h.subdate);
-			fprintf(ofp, "From %s %s",
-#ifdef INTERNET
-			    h.from[0] ? h.from :
-#endif
-			    h.path, ctime(&h.subtime));
-			if (fname)
-				fprintf(ofp, "Full-Name: %s\n", fname);
-			fprintf(ofp, "Newsgroups: %s\n", h.nbuf);
-			fprintf(ofp, "Subject: %s\n", h.title);
-			fprintf(ofp, "Article-ID: %s/%ld\n\n", groupdir, bit);
-			tprint(fp, ofp, TRUE);
-			putc('\n', ofp);
-			news = TRUE;
-			(void) fclose(fp);
-			fp = NULL;
-			nextbit();
-		}
-	updaterc();
-	(void) fclose(ofp);
-	if (!news) {
-		fprintf(stderr, "No news.\n");
-		(void) unlink(outfile);
-		return;
-	}
-	(void) signal(SIGHUP, catchterm);
-	(void) signal(SIGTERM, catchterm);
-	(void) sprintf(bfr, "%s -f %s -T %s", TMAIL, outfile, mktemp(infile));
-	fwait(fsubr(ushell, bfr, (char *)NULL));
-	ofp = xfopen(infile, "r");
-	(void) fseek(actfp, 0L, 0);
-	while (fgets(afline, BUFLEN, actfp) != NULL) {
-		last = 0;
-		if (sscanf(afline, "%s %ld", bfr, &nngsize) < 2) {
-			bfr[0] = '\0';
-			nngsize = 0;
-		}
-		if (!ngmatch(bfr, header.nbuf))
-			continue;
-		*groupdir = 0;
-		if (selectng(bfr, TRUE, FALSE))
-			continue;
-		(void) fseek(ofp, 0L, 0);
-		while (fgets(groupdir, BUFLEN, ofp) != NULL) {
-			(void) nstrip(groupdir);
-			ptr = index(groupdir, '/');
-			*ptr = 0;
-			if (strcmp(bfr, groupdir))
-				continue;
-			(void) sscanf(++ptr, "%ld", &last);
-			clear(last);
-		}
-		if (last) {
-			(void) strcpy(groupdir, bfr);
-			updaterc();
-		}
-	}
-	(void) unlink(infile);
-	(void) unlink(outfile);
-}
-#endif
-
-updaterc()
-{
-	register long	cur = 1, next = 1;
-	register int i;
-	register char	*ptr;
-	char	oldptr;
-
-	sprintf(rcbuf, "%s%c ", groupdir, zapng ? '!' : ':');
-
-	zapng = FALSE;
-again:
-	ptr = &rcbuf[strlen(rcbuf)];
-	while (get(next) && next <= ngsize)
-		next++;
-	cur = next;
-	while (!(get(next)) && next <= ngsize)
-		next++;
-	if (cur == next) {
-		next = ngsize + 1;
-		goto skip;
-	}
-	if (ptr[-1] != ' ')
-		*ptr++ = ',';
-	if (cur + 1 == next)
-		(void) sprintf(ptr, "%ld", cur);
-	else
-		(void) sprintf(ptr, "%ld-%ld", cur, next - 1);
-skip:
-	if ((long) next > ngsize) {
-		if (strpbrk(rcbuf, ":!") == NULL)	/* bad line, huh?? */
-			return;
-		ptr = index(rcbuf, ' ');
-		if (ptr == NULL)			/* impossible */
-			return;
-		ptr--;
-		oldptr = *ptr;
-		ptr[0] = ':';
-		ptr[1] = '\0';
-		i = findrcline(groupdir);
-		if (i >= 0) {
-			ptr[0] = oldptr;
-			ptr[1] = ' ';
-			rcline[i] = realloc(rcline[i], (unsigned)(strlen(rcbuf) + 1));
-			if (rcline[i] == NULL)
-				xerror("Cannot realloc");
-			(void) strcpy(rcline[i], rcbuf);
-#ifdef DEBUG
-			fprintf(stderr," new rcline = %s\n", rcline[i]);
-#endif /* DEBUG */
-			return;
-		}
-		if (++line > LINES)
-			xerror("Too many newsgroups");
-		ptr[0] = oldptr;
-		ptr[1] = ' ';
-		if ((rcline[line] = malloc((unsigned)(strlen(rcbuf) + 1))) == NULL)
-			xerror("Not enough memory");
-		(void) strcpy(rcline[line], rcbuf);
-#ifdef DEBUG
-		fprintf(stderr," new rcline2 = %s\n", rcline[line]);
-#endif /* DEBUG */
-		return;
-	}
-	cur = next;
-	goto again;
-}
-
-newrc(rcname)
-char *rcname;
-{
-	register FILE *fp;
-
-	if (close(creat(rcname, 0666))) {
-		(void) sprintf(bfr, "Cannot create %s", newsrc);
-		xerror(bfr);
-	}
-
-	sprintf(bfr, "%s/users", LIB);
-	if ((fp = fopen(bfr, "a")) != NULL) {
-		fprintf(fp, "%s\n", username);
-		(void) fclose(fp);
-		(void) chmod(bfr, 0666);
-	}
-}
-
-nextbit()
-{
-#ifdef DEBUG
-	fprintf(stderr,"nextbit() bit = %ld\n", bit);
-#endif /* DEBUG */
-	last = bit;
-	if (readmode == SPEC || xflag) {
-		if (rflag)
-			bit--;
-		else
-			bit++;
-		return;
-	}
-	if (rflag)
-		while (--bit, !get(bit) && bit > minartno)
-			;
-	else
-		while (++bit, !get(bit) && bit <= ngsize)
-			;
-#ifdef DEBUG
-	fprintf(stderr,"nextng leaves bit as %ld\n", bit);
-#endif /* DEBUG */
-}
-
-/*
- * Return TRUE if the user has not ruled out this article.
- */
-aselect(hp, insist)
-register struct hbuf *hp;
-int	insist;
-{
-	if (insist)
-		return TRUE;
-	if (tflag && !titmat(hp, header.title))
-		return FALSE;
-	if (aflag && cgtdate(hp->subdate) < atime)
-		return FALSE;
-	if (index(hp->nbuf, ',') && !rightgroup(hp))
-		return FALSE;
-	if (fflag && (hp->followid[0] || prefix(hp->title, "Re:")))
-		return FALSE;
-	return TRUE;
-}
-
-/*
- * Code to avoid showing multiple articles for news.
- * Works even if you exit news.
- * Returns nonzero if we should show this article.
- */
-rightgroup(hp)
-struct hbuf *hp;
-{
-	char ng[BUFLEN];
-	register char *p, *g;
-	int i, flag;
-
-	strcpy(ng, hp->nbuf);
-	g = ng;
-	flag = 1;
-	while (g != NULL) {
-		p = index(g, ',');
-		if (p != NULL) {
-			*p++ = '\0';
-			while (*p == ' ')
-				p++;
-		}
-		if (strcmp(g, groupdir) == 0)
-			return flag;
-		if (ngmatch(g, header.nbuf)
-		    && ((i = findrcline(g)) >= 0
-		    && index(rcline[i], '!') == NULL))
-			flag = 0;
-		g = p;
-	}
-	/* we must be in "junk" or "control" */
-	return TRUE;
-}
-
-back()
-{
-	while (fseek(actfp, -2L, 1) != -1 && ftell(actfp) > 0L) {
-		if (getc(actfp) == '\n')
-			return 0;
-	}
-	if (ftell(actfp) == 0L)
-		return 0;
-	return 1;
-}
-
-/*
- * Trap interrupts.
- */
-onsig(n)
-int	n;
-{
-	(void) signal(n, onsig);
-	SigTrap = n;
-	if (rcreadok < 2) {
-		fprintf(stderr, "Aborted early\n");
-		xxit(0);
-	}
-}
-
-/*
- * finds the line in your .newsrc file (actually the in-core "rcline"
- * copy of it) and returns the index into the array where it was found.
- * -1 means it didn't find it.
- *
- * We play clever games here to make this faster.  It's inherently
- * quadratic - we spend lots of CPU time here because we search through
- * the whole .newsrc for each line.  The "prev" variable remembers where
- * the last match was found; we start the search there and loop around
- * to the beginning, in the hopes that the calls will be roughly in order.
- */
-int
-findrcline(name)
-register char *name;
-{
-	register char *	p;
-	register int	i;
-	register int	top;
-	register int	len;
-	static int	prev;
-	static int	didthru;
-
-	for ( ; didthru <= line; ++didthru)
-		if ((p = index(rcline[didthru], '!')) != 0 ||
-			(p = index(rcline[didthru], ':')) != 0) {
-				lentab[didthru] = (int)(p - rcline[didthru]);
-		}
-	len = strlen(name);
-	top = line;
-	i = prev;
-loop:
-	for ( ; i <= top; ++i)
-		if (lentab[i] == len && rcline[i] != NULL &&
-			strncmp(name, rcline[i], len) == 0)
-			return prev = i;
-	if (i > line && line > prev - 1) {
-		i = 0;
-		top = prev - 1;
-		goto loop;
-	}
-	return -1;
-}
-
-/*
- * sortactive - make a local copy of the active file, sorted according
- *   to the user's preferences, according to his .newsrc file.
- */
-
-struct table_elt {
-	int	rcindex;
-	long	maxart, minart;
-	char	yn;
-};
-
-#ifdef SORTACTIVE
-static int
-rcsort(a, b)
-char *a, *b;
-{
-	return(((struct table_elt *)a)->rcindex -
-	       ((struct table_elt *)b)->rcindex);
-}
-
-static char *newactivename = "/tmp/newsaXXXXXX";
-#endif /* SORTACTIVE */
-
-sortactive()
-{
-	register struct table_elt *tp;
-	register char *p;
-	register FILE *nfp, *afp;
-	char aline[BUFLEN], ngname[BUFLEN];
-	struct table_elt table[LINES];
-	int nlines = 0, i, delta, lastline;
-
-#ifdef SORTACTIVE
-	/* make a new sorted copy of ACTIVE */
-	nfp = fopen(mktemp(newactivename), "w");
-	(void) chmod(newactivename, 0600);
-	if (nfp == NULL) {
-		perror(newactivename);
-		return;
-	}
-
-	/* look up all the lines in ACTIVE, finding their positions in .newsrc */
-	p = ACTIVE;
-	ACTIVE = newactivename;
-	afp = xfopen(p, "r");
-	tp = table;
-#else /* !SORTACTIVE */
-	afp = xfopen(ACTIVE, "r");
-#endif /* !SORTACTIVE */
-	while (fgets(aline, sizeof aline, afp) != NULL) {
-		if (sscanf(aline,"%s %ld %ld %c", ngname, &tp->maxart,
-		    &tp->minart, &tp->yn) != 4) 
-			xerror("Active file corrupt");
-		delta = tp->maxart - tp->minart;
-		if (delta >= BITMAPSIZE)
-			BITMAPSIZE = delta + 1;
-		if (Kflag && tp->maxart > 0 && ngmatch(ngname, header.nbuf)) {
-			int j;
-
-			j = findrcline(ngname);
-			if (j >= 0 && index(rcline[j], '!') == NULL) {
-				char rbuf[BUFLEN];
-				if (tp->maxart == 1)
-					sprintf(rbuf, "%s: 1", ngname);
-				else
-					sprintf(rbuf, "%s: 1-%ld", ngname, tp->maxart);
-				rcline[j] = realloc(rcline[j],
-					(unsigned)(strlen(rbuf)+1));
-				if (rcline[j] == NULL)
-					xerror("Not enough memory");
-				strcpy(rcline[j], rbuf);
-			}
-		}
-#ifdef SORTACTIVE
-		tp->rcindex = findrcline(ngname);
-		if (tp->rcindex < 0) {
-			if (++line > LINES)
-				xerror("Too many newsgroups");
-			strcat(ngname, ":");
-			rcline[line] = malloc((unsigned)(strlen(ngname) + 1));
-			if (rcline[line] == NULL)
-				xerror("Not enough memory");
-			strcpy(rcline[line], ngname);
-			tp->rcindex = line;
-		}
-		tp++;
-#endif /* SORTACTIVE */
-	}
-	(void) fclose(afp);
-	BITMAPSIZE =  8 * ((BITMAPSIZE+7) / 8);
-	bitmap = malloc((unsigned)BITMAPSIZE/8);
-	if (bitmap == NULL)
-		xerror("Can't malloc bitmap");
-
-#ifdef SORTACTIVE
-	/* sort by position in user's .newsrc file (new groups come up last) */
-	nlines = tp - table;
-	qsort((char *)table, nlines, sizeof table[0], rcsort);
-
-	tp = table;
-	lastline = tp->rcindex - 1;
-	/* copy active to newactive, in the new order */
-	for (i = 0; i < nlines; i++) {
-		while (++lastline < tp->rcindex) {
-			if (strncmp(rcline[lastline], "options ", 8) == 0) {
-				fprintf(nfp, "%s\n", rcline[lastline]);
-			} else {
-				fprintf(stderr, "Duplicate .newsrc line or bad group %s\n",
-					rcline[lastline]);
-				lentab[lastline] = 0;
-				free(rcline[lastline]);
-				rcline[lastline] = NULL;
-			}
-		}
-		if (rcline[tp->rcindex] == NULL)
-			continue;
-		p = rcline[tp->rcindex];
-		while (*p != ':' && *p != '!')
-			fputc(*p++, nfp);
-		(void) fprintf(nfp, " %ld %ld %c\n", tp->maxart, tp->minart,
-			tp->yn);
-		tp++;
-	}
-	(void) fclose(nfp);
-#endif /* SORTACTIVE */
-}
*-*-END-of-src/rfuncs.c-*-*
echo x - src/makeactive.sh 1>&2
sed 's/.//' >src/makeactive.sh <<'*-*-END-of-src/makeactive.sh-*-*'
-: "Create active file and newsgroup hierarchy for new machine"
-: "Usage: sh makeactive.sh LIBDIR SPOOLDIR NEWSUSR NEWSGRP"
-: '@(#)makeactive	1.22	10/29/86'
-LIBDIR=$1
-SPOOLDIR=$2
-NEWSUSR=$3
-NEWSGRP=$4
-cat <<"E_O_F" > /tmp/$$groups
-general	Articles that should be read by everyone on your local system
-net.ai			Artificial intelligence discussions.
-net.announce.arpa-internet	Announcements from the Arpa world
-net.arch		Computer architecture.
-net.audio		High fidelity audio.
-net.auto		Automobiles, automotive products and laws.
-net.auto.tech		Technical aspects of automobiles, et. al.
-net.aviation		Aviation rules, means, and methods.
-net.bicycle		Bicycles, related products and laws.
-net.books		Books of all genres, shapes, and sizes.
-net.bugs		General bug reports and fixes.
-net.bugs.2bsd		Reports of UNIX* version 2BSD related bugs.
-net.bugs.4bsd		Reports of UNIX version 4BSD related bugs.
-net.bugs.usg		Reports of USG (System III, V, etc.) bugs.
-net.bugs.uucp		Reports of UUCP related bugs.
-net.bugs.v7		Reports of UNIX V7 related bugs.
-net.cog-eng		Cognitive engineering.
-net.comics		The funnies, old and new.
-net.cooks		Food, cooking, cookbooks, and recipes.
-net.cse			Computer science education.
-net.cycle		Motorcycles and related products and laws.
-net.database		Database and data management issues and theory.
-net.dcom		Data communications hardware and software.
-net.decus		DEC* Users' Society newsgroup.
-net.emacs		EMACS editors of different flavors.
-net.eunice		The SRI Eunice system.
-net.games		Games and computer games.
-net.games.board		Discussion and hints on board games.
-net.games.chess		Chess & computer chess.
-net.games.emp		Discussion and hints about Empire.
-net.games.frp		Discussion about Fantasy Role Playing games.
-net.games.go		Discussion about Go.
-net.games.hack		Discussion, hints, etc. about the Hack game.
-net.games.pbm		Discussion about Play by Mail games.
-net.games.rogue		Discussion and hints about Rogue.
-net.games.trivia	Discussion about trivia.
-net.games.video		Discussion about video games.
-net.garden		Gardening, methods and results.
-net.graphics		Computer graphics, art, animation, image processing,
-net.ham-radio		Amateur Radio practices, contests, events, rules, etc.
-net.ham-radio.packet	Discussion about packet radio setups.
-net.info-terms		All sorts of terminals.
-net.internat		Discussion about international standards
-net.jokes		Jokes and the like.  May be somewhat offensive.
-net.jokes.d		Discussions on the content of net.jokes articles
-net.lan			Local area network hardware and software.
-net.lang		Different computer languages.
-net.lang.ada		Discussion about Ada*.
-net.lang.apl		Discussion about APL.
-net.lang.c		Discussion about C.
-net.lang.c++		The object-oriented C++ language.
-net.lang.f77		Discussion about FORTRAN.
-net.lang.forth		Discussion about Forth.
-net.lang.lisp		Discussion about LISP.
-net.lang.mod2		Discussion about Modula-2.
-net.lang.pascal		Discussion about Pascal.
-net.lang.prolog		Discussion about PROLOG.
-net.lang.st80		Discussion about Smalltalk 80.
-net.lsi			Large scale integrated circuits.
-net.mag			Magazine summaries, tables of contents, etc.
-net.mail		Proposed new mail/network standards.
-net.mail.headers	Gatewayed from the ARPA header-people list.
-net.micro		Micro computers of all kinds.
-net.micro.6809		Discussion about 6809's.
-net.micro.68k		Discussion about 68k's.
-net.micro.apple		Discussion about Apple micros.
-net.micro.amiga		Talk about the new Amiga micro.
-net.micro.atari8	Discussion about 8 bit Atari micros.
-net.micro.atari16	Discussion about 16 bit Atari micros.
-net.micro.att		Discussions about AT&T microcomputers 
-net.micro.cbm		Discussion about Commodore micros.
-net.micro.cpm		Discussion about the CP/M operating system.
-net.micro.hp		Discussion about Hewlett/Packard's.
-net.micro.mac		Material about the Apple Macintosh & Lisa
-net.micro.ns32k		National Semiconductor 32000 series chips
-net.micro.pc		Discussion about IBM personal computers.
-net.micro.ti		Discussion about Texas Instruments.
-net.micro.trs-80	Discussion about TRS-80's.
-net.movies		Reviews and discussions of movies.
-net.music		Music lovers' group.
-net.music.classical	Discussion about classical music.
-net.music.folk		Folks discussing folk music of various sorts
-net.music.gdead		A group for (Grateful) Dead-heads
-net.music.makers	For performers and their discussions.
-net.music.synth		Synthesizers and computer music
-net.news		Discussions of USENET itself.
-net.news.adm		Comments directed to news administrators.
-net.news.b		Discussion about B news software.
-net.news.config		Postings of system down times and interruptions.
-net.news.group		Discussions and lists of newsgroups
-net.news.newsite	Postings of new site announcements.
-net.news.notes		Notesfile software from the Univ. of Illinois.
-net.news.sa		Comments directed to system administrators.
-net.news.stargate	Discussion about satellite transmission of news.
-net.periphs		Peripheral devices.
-net.pets		Pets, pet care, and household animals in general.
-net.poems		For the posting of poems.
-net.puzzle		Puzzles, problems, and quizzes.
-net.railroad		Real and model train fans' newsgroup.
-net.rec			Recreational/participant sports.
-net.rec.birds		Hobbyists interested in bird watching.
-net.rec.boat		Hobbyists interested in boating.
-net.rec.bridge		Hobbyists interested in bridge.
-net.rec.nude		Hobbyists interested in naturist/nudist activities.
-net.rec.photo		Hobbyists interested in photography.
-net.rec.scuba		Hobbyists interested in SCUBA diving.
-net.rec.ski		Hobbyists interested in skiing.
-net.rec.skydive		Hobbyists interested in skydiving.
-net.rec.wood		Hobbyists interested in woodworking.
-net.sf-lovers		Science fiction lovers' newsgroup.
-net.sources		For the posting of software packages & documentation.
-net.sources.bugs	For bug fixes and features discussion
-net.sources.d		For any discussion on net.sources postings.
-net.sources.games	Postings of recreational software
-net.sources.mac		Software for the Apple Macintosh
-net.sport		Spectator sports.
-net.sport.baseball	Discussion about baseball.
-net.sport.football	Discussion about football.
-net.sport.hockey	Discussion about hockey.
-net.sport.hoops		Discussion about basketball.
-net.startrek		Star Trek, the TV show and the movies.
-net.text		Text processing.
-net.travel		Traveling all over the world.
-net.tv			The boob tube, its history, and past and current shows.
-net.tv.drwho		Discussion about Dr. Who.
-net.tv.soaps		Postings about soap operas.
-net.unix		UNIX neophytes group.
-net.unix-wizards	Discussions, bug reports, and fixes on and for UNIX.
-net.usenix		USENIX Association events and announcements.
-net.veg			Vegetarians.
-net.video		Video and video components.
-net.wines		Wines and spirits.
-net.wobegon		"A Prairie Home Companion" radio show discussion.
-mod.announce		General announcements of interest to all. (Moderated)
-mod.announce.newusers	Explanatory postings for new users. (Moderated)
-mod.ai			Discussions about Artificial Intelligence (Moderated)
-mod.amiga		Commodore Amiga micros -- info, uses, but no programs. (Moderated)
-mod.amiga.binaries	Encoded public domain programs in binary form. (Moderated)
-mod.amiga.sources	Public domain software in source code format. (Moderated)
-mod.compilers		Discussion about compiler construction, theory, etc. (Moderated)
-mod.computers		Discussion about various computers and related. (Moderated)
-mod.computers.68k		68000-based systems. (Moderated)
-mod.computers.apollo		Apollo computer systems. (Moderated)
-mod.computers.masscomp		The Masscomp line of computers. (Moderated)
-mod.computers.ibm-pc		The IBM PC, PC-XT, and PC-AT. (Moderated)
-mod.computers.laser-printers	Laser printers, hardware and software. (Moderated)
-mod.computers.pyramid		Pyramid 90x computers. (Moderated)
-mod.computers.ridge		Ridge 32 computers and ROS. (Moderated)
-mod.computers.sequent		Sequent systems, (esp. Balance 8000). (Moderated)
-mod.computers.sun		Sun "workstation" computers (Moderated)
-mod.computers.vax		DEC's VAX* line of computers & VMS. (Moderated)
-mod.computers.workstations	Various workstation-type computers. (Moderated)
-mod.conferences		Calls for papers and conference announcements. (Moderated)
-mod.comp-soc		Discussion on the impact of technology on society. (Moderated)
-mod.graphics		Graphics software, hardware, theory, etc. (Moderated)
-mod.human-nets		Computer aided communications digest. (Moderated)
-mod.legal		Discussions of computers and the law. (Moderated)
-mod.mac			Apple Macintosh micros -- info, uses, but no programs. (Moderated)
-mod.mac.binaries	Encoded public domain programs in binary form. (Moderated)
-mod.mac.sources		Public domain software in source code format. (Moderated)
-mod.mag			Discussions on electronicly published "magazines" (Moderated)
-mod.mag.otherrealms	Edited science fiction and fantasy "magazine". (Moderated)
-mod.map			Various maps, including UUCP maps (Moderated)
-mod.movies		Reviews and discussion of movies (Moderated)
-mod.music		Reviews and discussion of things musical (Moderated)
-mod.music.gaffa		Progressive music discussions (e.g., Kate Bush). (Moderated)
-mod.newprod		Announcements of new products of interest to readers (Moderated)
-mod.newslists		Postings of news-related statistics and lists (Moderated)
-mod.os			Disussions about operating systems and related areas. (Moderated)
-mod.os.os9		Discussions about the os9 operating system. (Moderated)
-mod.os.unix		Discussion of UNIX* features and bugs. (Moderated)
-mod.philosophy		Discussion of philosphical issues and concepts. (Moderated)
-mod.philosophy.tech	Technical philosophy: math, science, logic, etc (Moderated)
-mod.politics		Discussions on political problems, systems, solutions. (Moderated)
-mod.politics.arms-d		Arms discussion digest. (Moderated)
-mod.protocols		Various forms and types of FTP protocol discussions. (Moderated)
-mod.protocols.appletalk		Applebus hardware & software discussion. (Moderated)
-mod.protocols.kermit		Information about the Kermit package. (Moderated)
-mod.protocols.tcp-ip		TCP and IP network protocols. (Moderated)
-mod.psi			Discussion of paranormal abilities and experiences. (Moderated)
-mod.rec			Discussions on pastimes (not currently active) (Moderated)
-mod.rec.guns		Discussions about firearms (Moderated)
-mod.recipes		A "distributed cookbook" of screened recipes. (Moderated)
-mod.religion		Top-level group with no moderator (as of yet). (Moderated)
-mod.religion.christian	Discussions on Christianity and related topics. (Moderated)
-mod.risks		Risks to the public from computers & users. (Moderated)
-mod.sources		postings of public-domain sources. (Moderated)
-mod.sources.doc		Archived public-domain documentation. (Moderated)
-mod.sources.games	Postings of public-domain game sources (Moderated)
-mod.std			Discussion about various standards (Moderated)
-mod.std.c		Discussion about C language standards (Moderated)
-mod.std.mumps		Discussion for the X11.1 committee on Mumps (Moderated)
-mod.std.unix		Discussion for the P1003 committee on UNIX (Moderated)
-mod.techreports		Announcements and lists of technical reports. (Moderated)
-mod.telecom		Telecommunications digest. (Moderated)
-mod.test		Testing of moderated newsgroups -- no moderator (Moderated)
-mod.vlsi		Very large scale integrated circuits. (Moderated)
-misc.consumers		Consumer interests, product reviews, etc.
-misc.consumers.house	Discussion about owning and maintaining a house.
-misc.forsale		Items for sale.
-misc.headlines		Current interest: drug testing, terrorism, etc.
-misc.invest		Investments and the handling of money.
-misc.jobs		Job announcements, requests, etc.
-misc.kids		Children, their behavior and activities.
-misc.legal		Legalities and the ethics of law.
-misc.misc		Various discussions not fitting in any other group.
-misc.taxes		Tax laws and advice.
-misc.test		For testing of network software.  Very boring.
-misc.wanted		Requests for things that are needed (NOT software).
-sci.astro		Astronomy discussions and information.
-sci.bio			Biology and related sciences.
-sci.crypt		Different methods of data en/decryption.
-sci.electronics		Circuits, theory, electrons and discussions.
-sci.lang		Natural languages, communication, etc.
-sci.math		Mathematical discussions and pursuits
-sci.math.stat		Statistics discussion.
-sci.math.symbolic	Symbolic algebra discussion.
-sci.med			Medicine and its related products and regulations.
-sci.misc		Short-lived discussions on subjects in the sciences.
-sci.physics		Physical laws, properties, etc.
-sci.research		Research methods, funding, ethics, and whatever.
-sci.space		Space, space programs, space related research, etc.
-sci.space.shuttle	The space shuttle and the STS program.
-soc.college		College, college activities, campus life, etc.
-soc.culture.african	Discussions about Africa & things African
-soc.culture.celtic	Group about Celtics (*not* basketball!)
-soc.culture.greek	Group about Greeks.
-soc.culture.indian	Group for discussion about India & things Indian
-soc.culture.jewish	Group for discussion about Jewish culture
-soc.culture.misc	Group for discussion about other cultures
-soc.misc		Socially-oriented topics not in other groups.
-soc.motss		Issues pertaining to homosexuality.
-soc.roots		Genealogical matters.
-soc.singles		Newsgroup for single people, their activities, etc.
-soc.net-people		Announcements, requests, etc. about people on the net.
-soc.women		Women's rights, discrimination, etc.
-talk.abortion		All sorts of discussions and arguments on abortion.
-talk.bizarre		The unusual, bizarre, curious, and often stupid.
-talk.origins		Evolution versus creationism (sometimes hot!).
-talk.philosophy.misc	Philosophical musings on all topics.
-talk.politics.misc	Political discussions and ravings of all kinds.
-talk.politics.theory	Theory of politics and political systems.
-talk.religion.misc	Religious, ethical, & moral implications.
-talk.rumors		For the posting of rumors.
-E_O_F
-: if active file is empty, create it
-if test ! -s $LIBDIR/active
-then
-	sed 's/[ 	].*/ 00000 00001/' /tmp/$$groups > $LIBDIR/active
-	cat <<'E_O_F' >>$LIBDIR/active
-control 00000 00001
-junk 00000 00001
-E_O_F
-	set - group 0 1
-else
-: make sure it is in the new format
-	set - `sed 1q $LIBDIR/active`
-	case $# in
-	4)	ed - $LIBDIR/active << 'EOF'
-g/^mod\./s/y$/m/
-w
-q
-EOF
-		;;
-	3)	;;
-	2)	ed - $LIBDIR/active << 'EOF'
-1,$s/$/ 00001/
-w
-q
-EOF
-		echo
-		echo Active file updated to new format.
-		echo You must run expire immediately after this install
-		echo is done to properly update the tables.;;
-	*) echo Active file is in unrecognized format. Not upgraded.;;
-	esac
-fi
-if test $# -eq 3 -o $# -eq 2
-then
-	(sed '/^!net/!d
-s/^!//
-s!^!/!
-s!$! /s/$/ n/!
-' $LIBDIR/ngfile
-	echo '/ n$/!s/$/ y/') >/tmp/$$sed
-	mv $LIBDIR/active $LIBDIR/oactive
-	sed -f /tmp/$$sed $LIBDIR/oactive >$LIBDIR/active
-	chown $NEWSUSR $LIBDIR/active
-	chgrp $NEWSGRP $LIBDIR/active
-	chmod 644 $LIBDIR/active
-fi
-sort /tmp/$$groups | $LIBDIR/checkgroups | tee /tmp/checkgroups.out
-echo the output of checkgroups has been copied into /tmp/checkgroups.out
-rm -f /tmp/$$*
*-*-END-of-src/makeactive.sh-*-*
echo x - src/rfuncs2.c 1>&2
sed 's/.//' >src/rfuncs2.c <<'*-*-END-of-src/rfuncs2.c-*-*'
-/*
- * This software is Copyright 1986 by Rick Adams.
- *
- * Permission is hereby granted to copy, reproduce, redistribute or
- * otherwise use this software as long as: there is no monetary
- * profit gained specifically from the use or reproduction or this
- * software, it is not sold, rented, traded or otherwise marketed, and
- * this copyright notice is included prominently in any copy
- * made.
- *
- * The author make no claims as to the fitness or correctness of
- * this software for any use whatsoever, and it is provided as is. 
- * Any use of this software is at the user's own risk.
- *
- * rfuncs2 - more routines needed by readr.
- */
-
-#ifdef SCCSID
-static char	*SccsId = "@(#)rfuncs2.c	1.32	10/23/86";
-#endif /* SCCSID */
-
-/*LINTLIBRARY*/
-
-#include "rparams.h"
-
-static char	lbuf[LBUFLEN];
-
-FILE *popen();
-
-/*
- * Match title.
- */
-titmat(h, titlist)
-register struct hbuf *h;
-register char	*titlist;
-{
-	register char	*p;
-
-	while (*titlist != '\0') {
-
-		if (strcmp(titlist, h->ident) == 0)
-			return TRUE;
-		for (p = h->title; *p != '\0'; p++)
-			if (prefix(p, titlist)) {
-				return TRUE;
-			}
-		while (*titlist++ != '\0')
-			;
-	}
-	return FALSE;
-}
-
-
-/*
- * Save the news item in the user's file.
- *	Allow files with first character as '|' to write article
- *	to program across a pipe.
- */
-
-#define PIPECHAR '|'
-
-save(file, to)
-register char	*file, *to;
-{
-	register FILE *ufp, *hfp;
-#ifdef u370
-	static struct hbuf hh;
-#else /* !u370 */
-	struct hbuf hh;
-#endif /* !u370 */
-	int	isprogram = 0;
-	int	isnew = 1;
-	register int i;
-
-	for(i=0;i<NUNREC;i++)
-		hh.unrec[i] = NULL;
-
-	if ((hfp = art_open(file, "r")) == NULL) {
-		fprintf(stderr, "Can't get article.\n");
-		return;
-	}
-	if (hread(&hh, hfp, TRUE) == NULL) {
-		fprintf(stderr, "Article is garbled.\n");
-		return;
-	}
-	ufp = fopen(to, "r");
-	if (ufp != NULL) {
-		(void) fclose(ufp);
-		isnew = 0;
-	}
-	(void) setgid(gid);
-	(void) setuid(uid);
-	(void) umask(savmask);
-
-	if (*to == PIPECHAR) {
-		if ((ufp = popen (&to[1], "w")) == NULL) {
-			fprintf(stderr,"Cannot execute %s\n", &to[1]);
-			return;
-		}
-		isprogram++;
-	} else if ((ufp = fopen(to, "a")) == NULL) {
-		fprintf(stderr,"Cannot append to %s.\n", to);
-		return;
-	}
-	/*
-	 * V7MAIL code is here to conform to V7 mail format.
-	 * If you need a different format to be able to
-	 * use your local mail command (such as four ^A's
-	 * on the end of articles) substitute it here.
-	 */
-#ifdef MMDF
-	if (!isprogram)
-		fprintf(ufp, "\001\001\001\001\n");  /* MMDF message header */
-#endif /* MMDF */
-#ifdef V7MAIL
-	hh.subtime = cgtdate(hh.subdate);
-	fprintf(ufp, "From %s %s", replyname(&hh), ctime(&hh.subtime));
-#endif
-	hprint(&hh, ufp, 2);
-#ifdef V7MAIL
-	tprint(hfp, ufp, TRUE);
-	putc('\n', ufp);	/* force blank line at end (ugh) */
-#else
-	tprint(hfp, ufp, FALSE);
-#endif
-	(void) fclose(hfp);
-#ifdef MMDF
-	if (!isprogram)
-		fprintf(ufp, "\001\001\001\001\n");  /* MMDF message header */
-#endif /* MMDF */
-	if (isprogram)
-		(void) pclose (ufp);
-	else
-		(void) fclose(ufp);
-	if (!isprogram)
-		printf("%s: %s\n", to, isnew ? "New file" : "Appended");
-}
-
-
-/*
- * Print out the rest of the article.
- */
-tprint(ifp, ofp, checkfrom)
-register FILE *ifp, *ofp;
-int checkfrom;
-{
-	while ((fgets(bfr, sizeof bfr, ifp)) != NULL && !SigTrap) {
-		if (checkfrom && strncmp(bfr, "From ", 5) == 0)
-			putc('>', ofp);
-		(void) fputs(bfr, ofp);
-	}
-	if (SigTrap)
-		qfflush(ofp);
-	(void) fflush(ofp);
-	fprintf(ofp, (SigTrap ? "\n\n" : "\n"));
-	SigTrap = FALSE;
-}
-
-
-/*
- * Print the file header.
- */
-hprint(hp, ofp, verbose)
-register struct hbuf *hp;
-int	verbose;
-register FILE *ofp;
-{
-	register char	*p1, *p2;
-	char	fname[BUFLEN];
-	char *tailpath();
-
-	fname[0] = '\0';		/* init name holder */
-
-	if (verbose == 2) {
-		lhwrite(hp, ofp);
-		return;
-	}
-
-	if (lflag || eflag) {
-		char buf1[80], buf2[200];
-		char *cp;
-
-		(void) strcpy(bfr, groupdir);
-		for (cp=bfr; *cp; cp++)
-			if (*cp == '/')
-				*cp = '.';
-		(void) sprintf(buf1, "%s/%ld", bfr, bit);
-		(void) sprintf(buf2, "%-20s %s", buf1, hp->title);
-		fprintf(ofp, "%.76s\n", buf2);
-		return;
-	}
-
-	p1 = index(hp->from, '(');	/* Find the sender's full name. */
-	if (p1 == NULL && hp->path[0])
-		p1 = index(hp->path, '(');
-	if (p1 != NULL) {
-		strcpy(fname, p1+1);
-		p2 = index(fname, ')');
-		if (p2 != NULL)
-			*p2 = '\0';
-	}
-
-	fprintf(ofp, "Subject: %s\n", hp->title);
-	if (!hflag && hp->summary[0])
-		fprintf(ofp, "Summary: %s\n", hp->summary);
-	if (!hflag && hp->keywords[0])
-		fprintf(ofp, "Keywords: %s\n", hp->keywords);
-	if (verbose) {
-		fprintf(ofp, "From: %s\n", hp->from);
-		fprintf(ofp, "Path: %s\n", hp->path);
-		if (hp->organization[0])
-			fprintf(ofp, "Organization: %s\n", hp->organization);
-	}
-	else {
-		if (p1 != NULL)
-			*--p1 = '\0';		/* bump over the '(' */
-#ifdef INTERNET
-		/*
-		 * Prefer Path line if it's in internet format, or if we don't
-		 * understand internet format here, or if there is no reply-to.
-		 */
-		fprintf(ofp, "From: %s", hp->from);
-#else
-		fprintf(ofp, "Path: %s", tailpath(hp));
-#endif
-		if (fname[0] || hp->organization[0]) {
-			if (fname[0] == '\0') {
-				(void) strcpy(fname,hp->from);
-				p2 = index(fname,'@');
-				if (p2)
-					*p2 = '\0';
-			}
-			fprintf(ofp, " (%s", fname);
-			if (hp->organization[0] && !hflag)
-				fprintf(ofp, " @ %s", hp->organization);
-			fprintf(ofp, ")");
-		}
-		fprintf(ofp, "\n");
-		if (p1 != NULL)
-			*p1 = ' ';
-	}
-
-	if (verbose) {
-		fprintf(ofp, "Newsgroups: %s\n", hp->nbuf);
-		fprintf(ofp, "Date: %s\n", hp->subdate);
-		if (hp->sender[0])
-			fprintf(ofp, "Sender: %s\n", hp->sender);
-		if (hp->replyto[0])
-			fprintf(ofp, "Reply-To: %s\n", hp->replyto);
-		if (hp->followto[0])
-			fprintf(ofp, "Followup-To: %s\n", hp->followto);
-	}
-	else if (index(hp->nbuf, ',') || strcmp(groupdir, "junk") == 0)
-		fprintf(ofp, "Newsgroups: %s\n", hp->nbuf);
-
-	if (pflag || ofp != stdout)
-		putc('\n', ofp);
-}
-
-
-/*
- * If ofp != stdout, close it and run the script in coptbuf.
- */
-cout(ofp)
-FILE *ofp;
-{
-	register char	*p, *q, *r;
-
-	if (ofp == stdout || ofp == NULL)
-		return;
-	(void) fclose(ofp);
-	p = coptbuf;
-	q = lbuf;
-	while ((*q = *p++) != '\0')
-		if (*q++ == FMETA) {
-			q--;
-			r = outfile;
-			while ((*q++ = *r++) != '\0')
-				;
-			q--;
-		}
-	fwait(fsubr(ushell, lbuf, (char *)NULL));
-	(void) unlink(outfile);
-}
-
-
-cdump(ofp)
-register FILE *ofp;
-{
-	if (ofp == stdout)
-		return;
-	fclose(ofp);
-	unlink(outfile);
-}
-
-
-/*
- * Quiet 'flush'.
- * Empty (without fflush()) the buffer for stream fp.
- */
-/* ARGSUSED */
-qfflush(fp)
-FILE *fp;
-{
-	/* Alas, stdio does not permit this */
-}
-
-
-/*
- * Count the number of remaining lines in file fp.
- * Do not move the file pointer.
- */
-linecnt(fp)
-FILE *fp;
-{
-	long	curpos;
-	register int	nlines = 0;
-	register int	c;
-
-	if (fp == NULL)
-		return 0;
-	curpos = ftell(fp);
-	while ((c = getc(fp)) != EOF)
-		if (c == '\n')
-			nlines++;
-	(void) fseek(fp, curpos, 0);
-	return nlines;
-}
-
-
-/*
- * Transmit file to system.
- */
-transmit(sp, file)
-register struct srec *sp;
-char	*file;
-{
-	register FILE *ifp, *ofp;
-	register int	c, i;
-#ifdef u370
-	static struct hbuf hh;
-#else /* !u370 */
-	struct hbuf hh;
-#endif /* !u370 */
-	char	TRANS[BUFLEN];
-
-#ifdef DEBUG
-	fprintf(stderr, "xmit %s to %s using %s\n", file, sp->s_name, sp->s_xmit);
-#endif
-	bzero((char *)&hh, sizeof hh);
-	ifp = xart_open(file, "r");
-	if (hread(&hh, ifp, TRUE) == NULL)
-		return;
-	strcpy(TRANS, "/tmp/trXXXXXX");
-	ofp = xfopen(mktemp(TRANS), "w");
-	if (index(sp->s_flags, 'A') == NULL)
-		hwrite(&hh, ofp);
-	else {
-#ifdef OLD
-			fprintf(ofp, "A%s\n%s\n%s!%s\n%s\n%s\n", oident(hh.ident), hh.nbuf, FULLSYSNAME,
-				hh.path, hh.subdate, hh.title);
-#else /* !OLD */
-			logerr("Must have OLD defined to use A flag for xmit");
-			unlink(TRANS);
-			return;
-#endif /* !OLD */
-	}
-	while ((c = getc(ifp)) != EOF)
-		putc(c, ofp);
-	(void) fclose(ifp);
-	(void) fclose(ofp);
-	for (i=0;i<NUNREC;i++)
-		if (hh.unrec[i] != NULL)
-			free(hh.unrec[i]);
-	if (*sp->s_xmit == '\0' || strpbrk(sp->s_flags, "FUMH"))
-		(void) sprintf(bfr, DFTXMIT, sp->s_name, TRANS);
-	else
-		(void) sprintf(bfr, "(%s) < %s", sp->s_xmit, TRANS);
-#ifdef DEBUG
-	fprintf(stderr, "%s\n", bfr);
-#endif
-	(void) system(bfr);
-	(void) unlink(TRANS);
-}
-
-
-/*
- * Cancel the article whose header is in hp, by posting a control message
- * to cancel it.  The scope of the control message depends on who would
- * really be willing to cancel it.  It is sent as far as it will do any good.
- * notauthor is true iff the person posting this article is not the
- * real author of the article being cancelled.
- */
-cancel(ofp, hp, notauthor)
-FILE *ofp;
-struct hbuf *hp;
-int	notauthor;
-{
-	int	pid;
-
-	fflush(ofp);
-	pid = vfork();
-	if (pid < 0) {
-		perror("readnews: cancel");
-		return 0;
-	}
-	if (pid > 0)
-		return 0;
-	if (notauthor)
-		(void) sprintf(bfr, "%s/%s -c 'cancel %s' -n %s -d local < /dev/null",
-		    LIB, "inews", hp->ident, hp->nbuf);
-	else {
-		if (hp->distribution[0] == '\0')
-			(void) sprintf(bfr, "%s/%s -c 'cancel %s' -n %s < /dev/null",
-			    LIB, "inews", hp->ident, hp->nbuf);
-		else
-			(void) sprintf(bfr, "%s/%s -c 'cancel %s' -n %s -d %s < /dev/null",
-			    LIB, "inews", hp->ident, hp->nbuf, hp->distribution);
-	}
-	execl("/bin/sh", "sh", "-c", bfr, (char *) 0);
-	perror(bfr);
-	for ( ; ; )
-		exit(1);
-}
-
-
-dash(num, ofp)
-register int	num;
-register FILE *ofp;
-{
-	register int	i;
-
-	for (i = 0; i < num; i++)
-		putc('-', ofp);
-	putc('\n', ofp);
-}
-
-
-help(ofp)
-register FILE *ofp;
-{
-	register FILE *fp;
-	register int	c;
-	char temp[BUFLEN];
-
-	if (cflag) {
-oneline:
-		fprintf(ofp, "(n)ext re(p)rint (w)rite (q)uit (r)eply\
- (c)ancel -[n] +[n] (f)ollowup (N)ext (U)nsubscribe (v)ersion\n");
-		return;
-	}
-	(void) sprintf(temp, "%s/%s", LIB, "help");
-	if ((fp = fopen(temp, "r")) == NULL) {
-		fprintf(ofp, "No help file.\n");
-		goto oneline;
-	}
-	while ((c = getc(fp)) != EOF && !SigTrap)
-		putc(c, ofp);
-	(void) fclose(fp);
-}
-
-
-pout(ofp)
-FILE *ofp;
-{
-	register char	*p, *q, *r;
-
-	p = PAGER;
-	q = lbuf;
-	while ((*q = *p++) != '\0')
-		if (*q++ == FMETA) {
-			q--;
-			r = filename;
-			while ((*q++ = *r++) != '\0')
-				;
-			q--;
-		}
-	fwait(fsubr(ushell, lbuf, (char *)NULL));
-	fprintf(ofp, "\n");
-}
-
-/*
- * Print a very brief version of the date in question.
- */
-char *
-briefdate(datestr)
-char *datestr;
-{
-	time_t dt, now;
-	char *tmstr;
-	char *wkday, *monthdate, *timeofday;
-	static char rbuf[20];
-
-	dt = cgtdate(datestr);
-	tmstr = ctime(&dt);
-
-	wkday = tmstr; tmstr[3] = '\0';
-	monthdate = tmstr+4; tmstr[10] = '\0';
-	timeofday = tmstr+11; tmstr[16] = '\0';
-
-	(void) time(&now);
-	if (now - dt < WEEKS)
-		(void) strcpy(rbuf, wkday);
-	else
-		(void) strcpy(rbuf, monthdate);
-	(void) strcat(rbuf, " ");
-	(void) strcat(rbuf, timeofday);
-	return rbuf;
-}
-
-/*
- * Return TRUE iff stdout is /dev/null.
- */
-ignoring()
-{
-	struct stat ss, ns;
-
-	if (fstat(1, &ss) < 0)
-		return FALSE;
-	if (stat("/dev/null", &ns) < 0)
-		return FALSE;
-	if (ss.st_dev == ns.st_dev && ss.st_rdev == ns.st_rdev)
-		return TRUE;
-	return FALSE;
-}
*-*-END-of-src/rfuncs2.c-*-*
echo x - src/iextern.c 1>&2
sed 's/.//' >src/iextern.c <<'*-*-END-of-src/iextern.c-*-*'
-/*
- * iextern - external definitions for inews.
- */
-
-#ifdef SCCSID
-static char	*SccsId = "@(#)iextern.c	2.17	9/19/86";
-#endif /* SCCSID */
-
-#include "iparams.h"
-
-int	uid, gid;			/* real user/group I.D. */
-int	duid, dgid;			/* effective user/group I.D. */
-int	SigTrap;			/* set if signal trapped */
-int	savmask;			/* old umask */
-int	mode;				/* mode of news program */
-struct hbuf header;			/* general-use header structure */
-char	bfr[LBUFLEN];			/* general-use scratch area */
-char	nbuf[LBUFLEN];			/* local newsgroup buffer */
-char	filename[BUFLEN];		/* general-use file name */
-char	not_here[SBUFLEN];		/* name of system not to xmit to */
-
-#ifndef ROOTID
-int	ROOTID;				/* special users id # */
-#endif
-
-char	*DFLTNG = "general";		/* default newsgroup */
-FILE	*infp;				/* input file-pointer */
-FILE	*actfp;				/* active newsgroups file pointer */
-int	tty;				/* set if infp is a tty */
-char	*PARTIAL = "dead.article";	/* place to save partial news */
-char	*SHELL = "/bin/sh";		/* shell for inews to use	*/
-int	is_ctl;				/* true for a control message */
-char	is_mod[NAMELEN];		/* contains newsgroup if moderated */
*-*-END-of-src/iextern.c-*-*
exit