[net.sources] 2.6-2.7.e right shifted

ARPAVAX:usenet (06/08/82)

	ed - man/checknews.1 << '-*-END-*-'
	55,56c
	inews(1),
	postnews(1),
	readnews(1)
	.
	51,52d
	48a
	~/.newsrc
	.
	40c
	.IR readnews (1)
	.
	5c
	.BR checknews " [ " ynqevv " ]  [ "
	.IR "readnews options" " ] "
	.
	w
	q
	-*-END-*-
	ed - man/expire.8 << '-*-END-*-'
	83c
	possible to do
	.I "uux \-c".
	.
	80c
	(by adding a
	.B \-e
	option to expire and having different invocations)
	.
	76c
	recnews(8),
	sendnews(8),
	uurec(8)
	.
	73,74d
	71a
	checknews(1),
	.
	31c
	.BR all .
	.
	28,29c
	is normally started up by
	.IR cron (8)
	every night to remove all expired news.
	.
	5,24c
	.BR /usr/lib/news/expire " [ " \-n
	.IR newsgroups " ] [ "
	.BR \-i " ] [ " \-I " ] [ " \-v " [ "
	.IR level " ] ] [ "
	.BI \-e days
	" ] "
	.
	w
	q
	-*-END-*-
	ed - man/inews.1 << '-*-END-*-'
	90,91d
	88a
	uucp(1),
	.
	86a
	news(5),
	newsrc(5)
	readnews(1),
	.
	82,84c
	Mail(1),
	binmail(1),
	.
	56a
	(This happens on ours.)
	.LP
	If the file /usr/lib/news/recording is present, it is taken as a list of
	"recordings" to be shown to users posting news.
	(This is by analogy to the recording you hear when you dial information
	in some parts of the country, asking you if you really wanted to do this.)
	The file contains lines of the form:
	.br
		newsgroups <tab> filename
	.br
	for example:
	.br
		net.all	/usr/lib/news/net.recording
		fa.all	/usr/lib/news/fa.recording
	.br
	Any user posting an article to a newsgroup matching the pattern on
	the left will be shown the contents of the file on the right.
	The user is then told to hit DEL to abort or RETURN to proceed.
	The intent of this feature is to help companies keep proprietary
	information from accidently leaking out.
	.
	34c
	will default to something line 
	.IR general .
	(On ours, it is 
	.IR general .)
	If you wish to submit
	.
	31,32c
	belongs to a list of newsgroups.  If the
	.B \-n
	.
	28,29c
	input.  A
	.I title
	.
	20,22c
	.BI "inews \-C " newsgroup
	.
	15,18c
	.B "inews \-p"
	.RI " [ " filename " ] "
	.
	5,13c
	.B "inews \-t "
	.IR title " [ "
	.B \-n 
	.IR newsgroups " ] [ "
	.B \-e 
	.IR "expiration date" " ]"
	.
	w
	q
	-*-END-*-
	ed - man/news.5 << '-*-END-*-'
	110,113c
	are a set of keys describing how the article should be transmitted.
	The default is no flags.
	.
	w
	q
	-*-END-*-
	ed - man/newsrc.5 << '-*-END-*-'
	25a
	.br
	.B fa.info-vax! 1-5
	.br
	.LP
	If the : is replaced with an ! (as in info-vax above) the newsgroup
	is not subscribed to and will not be shown to the user.
	.
	w
	q
	-*-END-*-
	ed - man/postnews.1 << '-*-END-*-'
	66c
	uucp(1),
	.
	63a
	readnews(1),
	.
	61,62c
	expire(8),
	inews(1),
	mail(1),
	.
	57,59c
	Mail(1),
	.
	53c
	.IR inews (1).
	.
	39a
	(Our local set of newsgroups is
	.IR megatest.all .)
	.
	38c
	(In this case, 
	.I ucb
	newsgroups circulate among machines at the
	.
	36c
	.IR ucb.all ,
	.
	33c
	.IR net.news ,
	.
	30c
	.IR net.general ,
	.
	28c
	.IR btl.general ,
	.
	25c
	.I general
	.
	23c
	.IR general .
	.
	14c
	.IR inews (1)
	.
	6,10c
	.BR postnews " [ "
	.IR article " ]"
	.
	w
	q
	-*-END-*-
	ed - man/readnews.1 << '-*-END-*-'
	268d
	253c
	.IR msgs (1)
	.
	248,250d
	229c
	.IR Mail (1)
	.
	219c
	.IR ed (1)
	.
	212c
	.IR msgs (1)
	.
	186a
	.IP u
	Unsubscribe from this newsgroup.
	Also goes on to the next newsgroup.
	.IP v
	Print the current version of the news software.
	.
	163c
	Cancel the article.  Only the author or the super user can do this.
	.
	160c
	Quit.  The .newsrc
	.
	151c
	.ta 2.5i
	.
	142c
	Paging may be disabled by setting
	.B PAGER
	to a null value.
	.
	137c
	for articles.  The environment parameter
	.B PAGER
	should be set to
	.
	130c
	.IR msgs "(1) or " /bin/mail (1)
	.
	97a
	If the environment variable NEWSRC is present, it should be the path
	name of a file to be used in place of .newsrc.
	.
	83d
	81c
	.IR getdate (3)
	.
	77c
	.BI "\-a " "\fR[\fP date \fR]\fP"
	.
	63a
	.B \-f
	flag prevents any followup articles from being printed.  The
	.
	49,50c
	invoked.  The name of the temporary file is referenced with a ``%''.
	Thus, ``mail \-f %'' will invoke mail on a temporary file consisting of all
	.
	44c
	.IR /bin/mail (1)\-like
	.
	40c
	.IR Mail (1).
	.
	35c
	.IR msgs (1)
	.
	23,24c
	.B "readnews \-s"
	.
	14,21c
	.IR titles " ] [ "
	.BR \-lprxhf " ] [ "
	.BR \-c " [ "
	.IR mailer " ] ]"
	.
	11,12c
	.IR newsgroups " ] [ "
	.
	5,9c
	.BR readnews " [ " \-a
	.IR date " ] [ "
	.
	w
	q
	-*-END-*-
	ed - misc/spool << '-*-END-*-'
	46c
		for file in `ls -rt`
	.
	w
	q
	-*-END-*-
	ed - src/Makefile.usg << '-*-END-*-'
	41c
		rm -f core index all errs getdate.c
	.
	1c
	# @(#) Makefile.usg	2.4	6/1/82
	.
	w
	q
	-*-END-*-
	ed - src/Makefile.v7 << '-*-END-*-'
	40c
		rm -f core index errs getdate.c
	.
	1c
	# @(#) Makefile.v7	2.4	6/1/82
	.
	w
	q
	-*-END-*-
	ed - src/checknews.c << '-*-END-*-'
	306a
	contin:;
	.
	270a
						if (saveptr == '!')
							goto contin;
	.
	268a
					saveptr = *ptr;
	.
	266c
				while (*ptr != ':' && *ptr != '!' && *ptr)
	.
	245a
		char saveptr;
	.
	221c
		while (fgets(rcbuf, LBUFLEN, rcfp) != NULL) {
	.
	155c
			while (fgets(rcbuf, LBUFLEN, rcfp) != NULL) {
	.
	5c
	static char *SccsId = "@(#) checknews.c	2.8	6/1/82";
	.
	w
	q
	-*-END-*-
	ed - src/control.c << '-*-END-*-'
	628a
		if (sendto[0] <= ' ') {
			log("nasty mail name %s from %s", sendto, header.path);
			xxit(1);
		}
	.
	420c
		fprintf(f, "Currently running news B version %s.\n\n", news_version);
	.
	404c
		fprintf(f, "Currently running news B version %s.\n\n", news_version);
	.
	390a
	 * Send the version number to the right person.
	 */
	c_version(h, ctlmsgtext)
	struct hbuf *h;
	char *ctlmsgtext;
	{
		FILE *f;

		f = mailhdr(h->path, "Our news version");
		if (f == NULL)
			xerror("Cannot send back error message");
		fprintf(f, "Sent-by: USENET Site %s\n\n", SYSNAME);
		fprintf(f, "Currently running news B version %s.\n\n", news_version);
		fprintf(f, "The header of the message follows:\n");
		hwrite(h, f);
		mclose(f);
	}

	/*
	.
	295a
			ss = index(s, ' ');
			if (ss)
				*ss = 0;
	.
	286a
			rr = index(r, ' ');
			if (rr)
				*rr = 0;
	.
	261a
			return;
		}
	.
	260c
		else {
	.
	247c
		char *line, *p, *q, *r, *s, *rr, *ss;
	.
	216c
		if (groupname[0] == '.' || groupname[0] <= ' ')
	.
	53a
		else if (eq("version"))
			c_version(cargc, cargv);
	.
	6c
	static char *SccsId = "@(#) control.c	2.8	6/5/82 (this is NOT the netnews version!)";
	.
	3a
	 *
	 * See defs.h "news_version" for the real version of netnews.
	.
	w
	q
	-*-END-*-
	ed - src/defs.h << '-*-END-*-'
	28c
					/* Default xmit command - remove -z if	*/
	#define DFTXMIT	"uux - -z -r %s\\!rnews < %s" /* your uux can't do it	*/
	.
	13c
	static char *news_version = "@(#) defs.h	2.7	6/7/82";
	.
	10c
	 * to be news_version below.
	.
	w
	q
	-*-END-*-
	ed - src/expire.c << '-*-END-*-'
	188c
			if (verbose > 1)
				printf("link %s to %s\n", newname, filename);
	.
	180a
			p = index(artlist, ',');
		}
		if (p == 0) {
			last = 1;
	.
	170c
		while (*artlist == ' ' || *artlist == '\n' || *artlist == ',')
	.
	135c
			if (h.expdate[0])
				h.exptime = cgtdate(h.expdate);
			newtime = cgtdate(h.recdate) + expincr;
	.
	110,111d
	94c
			if (verbose > 2)
	.
	83d
	64c
					while (argc > 1 && argv[1][0] != '-') {
	.
	20a
	time_t	cgtdate(), time();
	.
	15c
	extern char	filename[];
	.
	6c
	static char *SccsId = "@(#) expire.c	2.9	6/1/82";
	.
	w
	q
	-*-END-*-
	ed - src/funcs.c << '-*-END-*-'
	486a
	}

	static int hascaught = 0;
	static catchintr()
	{
		hascaught = 1;
		printf("\n");
		fflush(stdout);
	}

	/*
	 * Print a recorded message warning the poor luser what he is doing
	 * and demand that he understands it before proceeding.  Only do
	 * this for newsgroups listed in LIBDIR/recording.
	 */
	recording(ngrps)
	char *ngrps;
	{
		char recbuf[100];
		FILE *fd;
		char nglist[100], fname[100];
		char lngrps[100];
		char *oldsig;
		int  c, n, yes;

		sprintf(recbuf, "%s/%s", LIB, "recording");
		fd = fopen(recbuf, "r");
		if (fd == NULL)
			return 0;
		strcpy(lngrps, ngrps);
		ngcat(lngrps);
		while ((fgets(recbuf, sizeof recbuf, fd)) != NULL) {
			sscanf(recbuf, "%s %s", nglist, fname);
			ngcat(nglist);
			if (ngmatch(lngrps, nglist)) {
				fclose(fd);
				fd = fopen(fname, "r");
				while ((c = getc(fd)) != EOF)
					putc(c, stderr);
				hascaught = 0;
				oldsig = (char *) signal(SIGINT, catchintr);
				fprintf(stderr, "Do you understand this?  Hit <return> to proceed, <DEL> to abort: ");
				n = read(2, recbuf, 100);
				c = recbuf[0];
				yes = (c=='y' || c=='Y' || c=='\n' || c=='\n' || c==0);
				signal(SIGINT, oldsig);
				if (hascaught || n <= 0 || !yes)
					return -1;
			}
		}
		return 0;
	.
	373c
		if (fgets(p, LBUFLEN, sysfile) == NULL)
	.
	42,88d
	5c
	static char *SccsId = "@(#) funcs.c	2.5	6/1/82";
	.
	w
	q
	-*-END-*-
	ed - src/header.c << '-*-END-*-'
	250a
		for (iu=0; iu<NUNREC; iu++) {
			if (hp->unrec[iu][0])
				fprintf(fp, "%s", &hp->unrec[iu][0]);
		}
	.
	233a
		int iu;

	.
	199c
		if (!strncmp(ptr, "Control: ", 9))
	.
	134a
					if (unreccnt < NUNREC) {
						strcpy(&hp->unrec[unreccnt][0], bfr);
						unreccnt++;
					}
	.
	94a
	#else
						getfield(&fromflag, hp->path);
	#endif
	.
	92c
							sprintf(hp->path, "%s@%s",
								uname, site);
	.
	90c
	#ifdef ATSIGN
					/*
					 * This old code understood the "user at site"
					 * notation but threw away all but the first
					 * word of names (like your full name) so has
					 * been taken out.
					 */
						sscanf(bfr, "%s %s %s %s",
							wordfrom, uname, at, site);
	.
	86c
			curpos = ftell(fp);
	.
	80a
		int unreccnt = 0;
	.
	45c
		fgets(hp->title, BUFLEN, fp);		/* title */
	.
	39c
		fgets(hp->path, BUFLEN, fp);		/* source path */
	.
	35c
		fgets(hp->nbuf, BUFLEN, fp);		/* newsgroup list */
	.
	27c
		if (((fgets(bfr, PATHLEN, fp) != NULL &&
			*bfr >= 'A' && *bfr <= 'Z') && index(bfr, ':')) ||
			!strncmp(bfr, "From ", 5))
	.
	5c
	static char *SccsId = "@(#) header.c	2.9	6/5/82";
	.
	w
	q
	-*-END-*-
	ed - src/header.h << '-*-END-*-'
	21a
		char	unrec[NUNREC][BUFLEN];	/* unrecognized lines	*/
	.
	6a
	#define NUNREC 10

	.
	5c
	static char *Header = "@(#) header.h	2.5	6/5/82";
	.
	w
	q
	-*-END-*-
	ed - src/iextern.c << '-*-END-*-'
	39c
	char	bfr[LBUFLEN];			/* general-use scratch area */
	.
	5c
	static char *SccsId = "@(#) iextern.c	2.2	6/1/82";
	.
	w
	q
	-*-END-*-
	ed - src/ifuncs.c << '-*-END-*-'
	388a
	}

	/*
	 * Figure out who is sending the message and sign it.
	 * We attempt to look up the user in the gecos field of /etc/passwd.
	 * The Berkeley conventions (name first, & expands to login name) are
	 * assumed.  If a site stores weird stuff in gecos, like some account
	 * number, too bad - local mods may be in order.
	 */
	char *
	gensender(un)
	char *un;
	{
		static char outbuf[100];
		char inbuf[100];
		struct passwd *pw;

		pw = getpwnam(un);
		if (pw == NULL)
			return un;
		buildfname(pw->pw_gecos, un, inbuf);
		if (inbuf[0] == 0)
			return un;
		sprintf(outbuf, "%s (%s)", un, inbuf);
		return outbuf;
	}

	/*
	**  BUILDFNAME -- build full name from gecos style entry.
	**	(routine lifted from sendmail)
	**
	**	This routine interprets the strange entry that would appear
	**	in the GECOS field of the password file.
	**
	**	Parameters:
	**		p -- name to build.
	**		login -- the login name of this user (for &).
	**		buf -- place to put the result.
	**
	**	Returns:
	**		none.
	**
	**	Side Effects:
	**		none.
	*/

	buildfname(p, login, buf)
		register char *p;
		char *login;
		char *buf;
	{
		register char *bp = buf;

		if (*p == '*')
			p++;
		while (*p != '\0' && *p != ',' && *p != ';' && *p != ':')
		{
			if (*p == '&')
			{
				strcpy(bp, login);
				*bp = toupper(*bp);
				while (*bp != '\0')
					bp++;
				p++;
			}
			else
				*bp++ = *p++;
		}
		*bp = '\0';
	}

	/*
	 * Check if header.nbuf contains only valid newsgroup names;
	 * exit with error if not valid.
	 *
	 * a == TRUE means header.nbuf is subscription list
	 * a == FALSE means header.nbuf is newsgroup list
	 */

	ngfcheck(a)
	int a;
	{
		char ngcheck[NGFSIZ];	/* Hold NGFILE newsgroups */
		char tbuf[BUFLEN];	/* hold single header.nbuf news group */
		register char *s1, *s2;
		register FILE *f;

		s1 = ngcheck;
		f = xfopen(NGFILE, "r");
		while (fgets(bfr, BUFLEN, f) != NULL) {
			for (s2 = bfr; *s2 != '\0' &&
			    *s2 != ' ' && *s2 != '\t' &&
			    *s2 != ':' && *s2 != '\n';) {
				if (s1 >= &ngcheck[NGFSIZ-2])
					xerror("NGFILE too long");
				*s1++ = *s2++;
			}
			*s1++ = NGDELIM;
		}
		*s1 = '\0';
		fclose(f);
		for (s1 = header.nbuf; *s1 != '\0';) {
			if (*s1 == NEGCHAR)
				s1++;
			s2 = tbuf;
			while ((*s2++ = *s1++) != NGDELIM)
				if (s1[-1] == ':')
					xerror("Newsgroup cannot contain ':'");
			*s2 = '\0';
			s2 = tbuf;
			if (!ngmatch(s2, ngcheck) && (!a || !ngmatch(ngcheck, s2))) {
				ngdel(s2);
				sprintf(bfr, "Bad news group \"%s\"", s2);
				newssave(stdin, NULL);
				xerror(bfr);
			}
		}
	.
	380a
		if (access(logfname, 0)) {
			unlock(0);
			return;
		}
	.
	321a
	char lockname[80];
	idlock(str)
	char *str;
	{
		register int i;
		char tempname[80];
		long now;
		struct stat sbuf;

		sprintf(tempname, "/tmp/LTMP.%d", getpid());
		sprintf(lockname, "/tmp/L%s", str);
		close(creat(tempname, 0666));
		i = 10*60;	/* Keep trying for 10 minutes */
		while (link(tempname, lockname)) {
			if (--i < 0) {
				unlink(tempname);
				sprintf(tempname, "Article %s locked up", str);
				xerror(tempname);
			}
			time(&now);
			i = stat(lockname, &sbuf);
			if (i < 0) {
				xerror("Directory permission problem in /tmp");
			}
			if (sbuf.st_mtime + 10*60 < now)
				unlink(lockname);
			sleep((unsigned)60);
		}
		unlink(tempname);
	}

	idunlock()
	{
		unlink(lockname);
	}

	.
	226c
		if (fd == NULL)
			from = xfopen(INFILE, "r");
		else
			from = fd;
	.
	217,218c
	newssave(fd, dummy)
	FILE *fd, *dummy;
	.
	211a
		idunlock();
	.
	190a
		idlock(file);
	.
	130,134c
			sprintf(bfr, DFTXMIT, sp->s_name, TRANS);
	.
	112a
			if (ptr == 0)
				ptr = h.path-1;
	.
	110d
	5c
	static char *SccsId = "@(#) ifuncs.c	2.10	6/8/82";
	.
	w
	q
	-*-END-*-
	ed - src/inews.c << '-*-END-*-'
	505a
		setuid(duid);
	#endif
	.
	503a
		setuid(getuid());
	.
	502c
		 * to the setuid call above.  The directories we just made are owned
		 * by our real uid, so we have to temporarily set our effective uid
		 * the same to allow the chown.  Fortunately, USG lets us setuid back.
	.
	498a
	#ifdef USG
	.
	435c
					if (isprint(*cp) || isspace(*cp) || *cp=='\b')
	.
	292,296c
			if (i == 0)
				exit(0);
		}

		/* Do the actual insertion. */
		insert();
	.
	289d
	208c
		strcpy(header.path, gensender(username));
	.
	200c
			if (strncmp(whatever, header.path, strlen(whatever)) && uid != ROOTID && uid != geteuid() && uid)
	.
	198a
		if (!Dflag) {
			if (recording(header.nbuf)) {
				if (!tty)
					fwait(fsubr(newssave, stdin, NULL));
				xerror("aborted due to recording");
			}
		}

		if (!tty && mode != PROC) {
			i = fork();
			if (i == 0)
				exit(0);
		}

	.
	40a
	#define Dflag	options[8].flag
	'D',	'\0',		FALSE,	UNPROC,	UNKNOWN,	filename,
	.
	5c
	static char *SccsId = "@(#) inews.c	2.9	6/1/82";
	.
	w
	q
	-*-END-*-
	ed - src/params.h << '-*-END-*-'
	48c
	extern	char	bfr[LBUFLEN],username[BUFLEN],userhome[BUFLEN];
	.
	5c
	static char *Params = "@(#) params.h	2.2	6/1/82";
	.
	w
	q
	-*-END-*-
	ed - src/postnews.usg << '-*-END-*-'
	25c
			trap "sleep 1; rm -f $t; exit" 0 1 2
	.
	19c
		if test x$EDITOR = x 
	.
	14c
	if test x$ng = x ; then
	.
	6c
	if test $# -eq 1 -a ! -r "$1" ; then
	.
	1,2c
	: '@(#) postnews.usg	2.4	6/1/82'
	if test $# -gt 1 ; then
	.
	w
	q
	-*-END-*-
	ed - src/postnews.v7 << '-*-END-*-'
	31c
		inews -t "$title" -n $ng < $1
	.
	27c
			inews -t "$title" -n $ng <$t
	.
	25c
			trap "sleep 1; rm -f $t; exit" 0 1 2
	.
	19c
		if test x$EDITOR = x 
	.
	14c
	if test x$ng = x ; then
	.
	6c
	if test $# -eq 1 -a ! -r "$1" ; then
	.
	1,2c
	: '@(#) postnews.v7	2.4	6/1/82'
	if test $# -gt 1 ; then
	.
	w
	q
	-*-END-*-
	ed - src/process.c << '-*-END-*-'
	69c
				len = LBUFLEN;
	.
	53c
				fprintf(stderr, "Usage: readnews [ -a [ date ]] [ -n newsgroups ] [ -t titles ] [ -lprxhfM ]\n");
	.
	26c
	'f',	'\0',	FALSE,	OPTION,	ANY,		UNKNOWN,(char *)NULL,
	.
	24d
	5c
	static char *SccsId = "@(#) process.c	2.4	6/7/82";
	.
	w
	q
	-*-END-*-
	ed - src/readnews.c << '-*-END-*-'
	194c
			while (!sigtrap && fgets(rcbuf, LBUFLEN, rcfp) != NULL) {
	.
	151a
			rcreadok = TRUE;
	.
	117c
			rcreadok = FALSE;
			while (fgets(rcbuf, LBUFLEN, rcfp) != NULL) {
	.
	115c
		myrc = getenv("NEWSRC");
		if (myrc == NULL)
			myrc = NEWSRC;
		sprintf(newsrc, "%s/%s", userhome, myrc);
	.
	37a
		char *myrc;
	.
	5c
	static char *SccsId = "@(#) readnews.c	2.5	6/1/82";
	.
	w
	q
	-*-END-*-
	ed - src/readr.c << '-*-END-*-'
	928c
			sprintf(bfr, DFTXMIT, sp->s_name, TRANS);
	.
	796c
		if (!isprogram)
	.
	679c
	 (c)ancel -[n] +[n] (f)ollowup (N)ext (u)nsubscribe (v)ersion\n");
	.
	606a
				if (recording(hptr->nbuf, 0))
					break;
	.
	604c
				signal(SIGINT, oldsig);
	.
	600c
				oldsig = (char *) signal(SIGINT, catchintr);
	.
	578c
					sprintf(bfr, "%s -D -F '%s' -n %s -t \'", INEWS, folbuf, ptr2);
	.
	570a
				tfilename = hptr->title;
				ptr2 = hptr->nbuf;
				folbuf[0] = 0;
				if (hptr->followid) {
					strcpy(folbuf, hptr->followid);
					strcat(folbuf, " ");
				}
				strcat(folbuf, hptr->ident);
	.
	564,568c
					hptr = &hbuf1;
	.
	560,562c
				hptr = &h;
	.
	449c
				sprintf(rcbuf, MAILER, hptr->title);
				sprintf(bfr, "%s %s", rcbuf, address);
	.
	439a
					/* Strip off all but first word, to avoid
					 * the full name (Joe Blow). */
					ptr = index(rcbuf, ' ');
					if (ptr)
						*ptr = 0;
	.
	420a
					/*
					 * Play games stripping off multiple berknet
					 * addresses (: or .) here.  Should also strip
					 * off multiple @ arpanet addresses, but I
					 * think we should just wait for the sane world
					 * of internet absolute addreses.
					 */
	.
	416a
					*curberk = '\0';
	.
	410a
				tfilename = hptr->path;
	.
	408,409d
	406a
					hptr = &hbuf1;
	.
	405c
				hptr = &h;
	.
	380c
				strcpy(rcbuf, hptr->path);
				ptr1 = index(rcbuf, ' ');
				if (ptr1)
					*ptr1 = 0;
				i = strcmp(username, rcbuf);
	.
	254a
			/*
			 * Unsubscribe to the newsgroup and go on to next group
			 */
			case 'u':
				obit = -1;
				if (fp != NULL) {
					fclose(fp);
					fp = NULL;
				}
				if (cflag)
					clear(bit);
				else
					putc('\n', ofp);
				rfq = 0;
				zapng = TRUE;
				saveart;
				if (nextng()) {
					if (actdirect == BACKWARD)
						fprintf(ofp, "Can't back up.\n");
					else
						goto getout;
				}
				break;

			/* Print the current version of news */
			case 'v':
				fprintf(ofp, "News version: %s\n", news_version);
				break;

	.
	252a
					fflush(ofp);
				}
	.
	251c
				if (hflag) {
	.
	143c
				if (access(filename, 4) || ((fp = fopen(filename, "r")) == NULL) || (hread(&h, fp) == NULL) || (!rfq && !select(&h))) {
	.
	132a
					if (!rcreadok)
						xxit(0);
	.
	41a
		char *oldsig;
	.
	36c
		char folbuf[160];
	.
	5c
	static char *SccsId = "@(#) readr.c	2.10	6/8/82";
	.
	w
	q
	-*-END-*-
	ed - src/rextern.c << '-*-END-*-'
	65a
	int	rcreadok = FALSE;	/* NEWSRC has been read OK */
	int	zapng = FALSE;		/* ! out this newsgroup on next updaterc */
	.
	38c
	char	bfr[LBUFLEN];			/* general-use scratch area	*/
	.
	5c
	static char *SccsId = "@(#) rextern.c	2.2	6/1/82";
	.
	w
	q
	-*-END-*-
	ed - src/rfuncs.c << '-*-END-*-'
	306a
	}

	/*
	 * Return TRUE if this article is a followup to something.
	 */
	isfol(hp)
	register struct hbuf *hp;
	{
		if (hp->followid[0])
			return TRUE;
		if (strncmp(hp->title, "Re:", 3) == 0)
			return TRUE;
		return FALSE;
	.
	305a
		if (fflag && isfol(hp))
			return FALSE;
	.
	296a
	/*
	 * Return TRUE if the user has not ruled out this article.
	 */
	.
	232c
			ptr[0] = oldptr;
			ptr[1] = ' ';
	.
	223c
					ptr[0] = oldptr;
					ptr[1] = ' ';
	.
	220c
			ptr--;
			oldptr = *ptr;
			ptr[0] = ':';
			ptr[1] = '\0';
	.
	218d
	216c
			if (index(rcbuf, ',') != NULL)
				ngdel(rcbuf);
			else if (index(rcbuf, '!') == NULL)
	.
	198c
		sprintf(rcbuf, "%s%c ", groupdir, zapng ? '!' : ':');

		zapng = FALSE;
	.
	196a
		char oldptr;
	.
	194c
	updaterc()
	{
	.
	116c
	Mail()
	{
	.
	72a
					if (oldptr == '!') {
						groupdir[0] = 0;
						return 1;
					}
	.
	70a
				oldptr = *ptr;
	.
	68c
			while (*ptr != ':' && *ptr != '!' && *ptr)
	.
	62a
		}
	.
	61c
		if (stat(groupdir, &statbuf)) {
			groupdir[0] = 0;
	.
	56a
		char oldptr;
	.
	5c
	static char *SccsId = "@(#) rfuncs.c	2.6	6/1/82";
	.
	w
	q
	-*-END-*-
	ed - src/rparams.h << '-*-END-*-'
	52c
	extern int	actdirect, rcreadok, zapng;
	.
	20a
	#define fflag	options[11].flag
	.
	5c
	static char *Rparams = "@(#) rparams.h	2.2	6/1/82";
	.
	w
	q
	-*-END-*-