[unix-pc.sources] Patch #18 to B News 2.11

arnold@skeeve.UUCP (Arnold D. Robbins) (09/17/89)

Well, believe it or not, B News is NOT dead! (Merely on heavy life support.)
Despite the release of C News and the imminent release of B News 3.0
(TMN-Netnews), Rick Adams has released the following patch to B News.

Skeeve is still at 2.11.14.  I haven't decide yet which news I'm going
to switch to, or when.  At the moment, it ain't broke so I ain't fixing it.
-------------------------------
Path: emory!gatech!udel!wuarchive!cs.utexas.edu!uunet!rick
From: rick@uunet.UU.NET (Rick Adams)
Newsgroups: news.software.b
Subject: patch 18 for B news 2.11
Message-ID: <67503@uunet.UU.NET>
Date: 12 Sep 89 23:10:59 GMT
Organization: UUNET Communications Services, Falls Church, VA
Lines: 2232

Description:
	This is patch 18 for news 2.11. It addresses the following problems:

	Small changes to work around various compiler bugs.
	fixed batch to return to BATCHDIR before renaming work file.
	checkgroups no longer mails you a message if everything's ok
	Fixed active file to handle a maximum  of 9,999,999 messages
		to avoid wraparound problem at current 99,999
	Better mail notifcation of newgroup/rmgroup
	Fixed problem with control messages not allowing "local" distribution
		unless ORGDISTRIB was defined.
	Allow "sendsys sitename" control message, which only returns the
		part of the sysfile relevant to "sitename" instead of the
		entire file.
	checkgroups now requires a Approved line before executing.
	expire  and inews/rnews now read and write a "C news" style history ile.
		The intent is to allow people to run the C news expire
		with instead of the B news expire. This is untested.
	getdate now better handles some "english" dates.
	inews now changes illegal non-printing or space characters with ?
	rnews/inews noww support truly private newsgroups. If the last
	field of the active file is a filename, then posting (including 
	via rnews) is restricted to sites in that list.
	worked around a standard i/o bug in some old unix ports.
	NICENESS not attempts to nice to an absolute value instead of
		relative to the current niceness
	Specifying both I and F in the sys file will result in both the
		pathname and the message-id of the file being written out.
		This is NOT backwards compatible. For the old behavior,
		specify only "I" and not both "I" and "F"
	make update now checks to see if you have defined LINES large
		enough to support your existing active file

Fix:
	cd src and make install;make update

	YOU MUST "make update" or your active file will be in the wrong
	format

Index: Makefile.dst
Prereq: 1.33
diff -c1 onews/Makefile.dst news/Makefile.dst
*** onews/Makefile.dst	Thu Jan 19 00:04:22 1989
--- news/Makefile.dst	Thu Sep  7 17:54:28 1989
***************
*** 1,2
! # '@(#)Makefile.dst	1.33	1/19/89'
  # Generic Makefile.

--- 1,2 -----
! # '@(#)Makefile.dst	1.35	9/7/89'
  # Generic Makefile.
***************
*** 202,204
  	@echo Localize has been run. Restart the make.
! 	@exit 1
  

--- 202,204 -----
  	@echo Localize has been run. Restart the make.
! 	@exit 1;
  
***************
*** 207,209
  	@echo Localize has been run. Restart the make.
! 	@exit 1
  

--- 207,209 -----
  	@echo Localize has been run. Restart the make.
! 	@exit 1;
  
***************
*** 265,267
  getdate.o:  getdate.y defs.h
! 	@echo "expect 5 shift/reduce conflicts"
  	yacc getdate.y

--- 265,267 -----
  getdate.o:  getdate.y defs.h
! 	@echo "expect 8 shift/reduce conflicts"
  	yacc getdate.y

Index: batch.c
Prereq: 1.23
diff -c1 onews/batch.c news/batch.c
*** onews/batch.c	Wed Jan 18 14:28:51 1989
--- news/batch.c	Tue Sep  5 15:19:39 1989
***************
*** 33,35
  #ifdef SCCSID
! static char	*SccsId = "@(#)batch.c	1.23	1/18/89";
  #endif /* SCCSID */

--- 33,35 -----
  #ifdef SCCSID
! static char	*SccsId = "@(#)batch.c	1.25	9/5/89";
  #endif /* SCCSID */
***************
*** 95,97
  	if (chdir(SPOOLDIR) < 0) {
! 		logerror("chdir(%s): %s", workfile, sys_errlist[errno]);
  		exit(1);

--- 95,97 -----
  	if (chdir(SPOOLDIR) < 0) {
! 		logerror("chdir(%s): %s", SPOOLDIR, sys_errlist[errno]);
  		exit(1);
***************
*** 151,152
  		}
  	}

--- 151,156 -----
  		}
+ 	}
+ 	if (chdir(BATCHDIR) < 0) {
+ 		logerror("chdir(%s): %s", BATCHDIR, sys_errlist[errno]);
+ 		exit(1);
  	}

Index: checkgroups.sh
Prereq: 1.25
diff -c1 onews/checkgroups.sh news/checkgroups.sh
*** onews/checkgroups.sh	Sun Jan 15 19:48:29 1989
--- news/checkgroups.sh	Fri Sep  1 18:23:00 1989
***************
*** 1,3
  : check active file for missing or extra newsgroups
! : '@(#)checkgroups	1.25	1/15/89'
  

--- 1,3 -----
  : check active file for missing or extra newsgroups
! : '@(#)checkgroups	1.26	9/1/89'
  
***************
*** 7,9
  fi
! echo "" >/tmp/$$out
  # Read first line of stdin.  If of the form "-n group", then only check

--- 7,9 -----
  fi
! cp /dev/null /tmp/$$out
  # Read first line of stdin.  If of the form "-n group", then only check
***************
*** 67,69
  
- echo "" >>/tmp/$$out
  if test -s /tmp/$$remove

--- 67,68 -----
  
  if test -s /tmp/$$remove

Index: control.c
Prereq: 2.58
diff -c1 onews/control.c news/control.c
*** onews/control.c	Sun Jan 15 19:48:55 1989
--- news/control.c	Tue Sep  5 15:19:40 1989
***************
*** 21,23
  #ifdef SCCSID
! static char	*SccsId = "@(#)control.c	2.58	1/15/89";
  #endif /* SCCSID */

--- 21,23 -----
  #ifdef SCCSID
! static char	*SccsId = "@(#)control.c	2.60	9/5/89";
  #endif /* SCCSID */
***************
*** 355,358
  # ifdef NONEWGROUPS
! #  ifdef ORGDISTRIB
! 	/* local or ORGDISTRIB */
  	int can_change = (STRCMP(header.distribution, "local") == 0)

--- 355,357 -----
  # ifdef NONEWGROUPS
! 	/* local allowed */
  	int can_change = (STRCMP(header.distribution, "local") == 0)
***************
*** 358,359
  	int can_change = (STRCMP(header.distribution, "local") == 0)
  			   ||  (STRCMP(header.distribution, ORGDISTRIB) == 0)

--- 357,360 -----
  	int can_change = (STRCMP(header.distribution, "local") == 0)
+ #  ifdef ORGDISTRIB
+ 	/* or ORGDISTRIB */
  			   ||  (STRCMP(header.distribution, ORGDISTRIB) == 0)
***************
*** 359,364
  			   ||  (STRCMP(header.distribution, ORGDISTRIB) == 0)
- 			   || !ngmatch(argv[1], NONEWGROUPS);
- #  else /* ! ORGDISTRIB */
- 	/* local only */
- 	int can_change = STRCMP(header.distribution, "local") == 0;
  #  endif /* ORGDISTRIB */

--- 360,361 -----
  			   ||  (STRCMP(header.distribution, ORGDISTRIB) == 0)
  #  endif /* ORGDISTRIB */
***************
*** 364,365
  #  endif /* ORGDISTRIB */
  # else /* ! NONEWGROUPS */

--- 361,363 -----
  #  endif /* ORGDISTRIB */
+ 			   || !ngmatch(argv[1], NONEWGROUPS);
  # else /* ! NONEWGROUPS */
***************
*** 386,390
  			/* Now check if it's correctly moderated/unmoderated */
! 			while (*p++)
! 				;
! 			p -= 3;
  			if (argc > 2 && STRCMP(argv[2], "moderated") == 0) {

--- 384,388 -----
  			/* Now check if it's correctly moderated/unmoderated */
! 			/* name 0000000 0000000 X */
! 			/*      12345678901234567 */
! 			p += 17;
  			if (argc > 2 && STRCMP(argv[2], "moderated") == 0) {
***************
*** 403,405
  # ifdef NOTIFY
! 			(void) sprintf(subjline,
  			"Newsgroup %s changed from %smoderated to %smoderated",

--- 401,404 -----
  # ifdef NOTIFY
! 			if (can_change)
! 				(void) sprintf(subjline,
  			"Newsgroup %s changed from %smoderated to %smoderated",
***************
*** 407,408
  				*p=='y' ? "un" : "");
  			fd = mailhdr((struct hbuf *)NULL, subjline);

--- 406,412 -----
  				*p=='y' ? "un" : "");
+ 			else
+ 				(void) sprintf(subjline,
+ 			"Change newsgroup %s from %smoderated to %smoderated",
+ 				argv[1], *p=='y' ? "" : "un",
+ 				*p=='y' ? "un" : "");
  			fd = mailhdr((struct hbuf *)NULL, subjline);
***************
*** 472,474
  		(void) fseek(actfp, 0L, 2); clearerr(actfp);
! 		fprintf(actfp, "%s 00000 00001 %c\n", argv[1],
  			(argc > 2 && STRCMP(argv[2], "moderated") == 0) 

--- 476,478 -----
  		(void) fseek(actfp, 0L, 2); clearerr(actfp);
! 		fprintf(actfp, "%s 0000000 0000000 %c\n", argv[1],
  			(argc > 2 && STRCMP(argv[2], "moderated") == 0) 
***************
*** 495,497
  # ifdef NOTIFY
! 	(void) sprintf(subjline, "Newsgroup %s created", argv[1]);
  	fd = mailhdr((struct hbuf *)NULL, subjline);

--- 499,504 -----
  # ifdef NOTIFY
! 	if (didcreate)
! 		(void) sprintf(subjline, "Newsgroup %s created", argv[1]);
! 	else
! 		(void) sprintf(subjline, "Create newsgroup %s", argv[1]);
  	fd = mailhdr((struct hbuf *)NULL, subjline);
***************
*** 554,555
  #ifdef NORMGROUPS
  #ifdef ORGDISTRIB

--- 561,564 -----
  #ifdef NORMGROUPS
+ 	/* Allow local removals */
+ 	if (!STRCMP("local", header.distribution)
  #ifdef ORGDISTRIB
***************
*** 555,561
  #ifdef ORGDISTRIB
! 	/*
! 	 * Allow local as well as organizational removals
! 	 */
! 	if (!STRCMP(ORGDISTRIB, header.distribution)
! 	   || !STRCMP("local", header.distribution)
  	   || !ngmatch(argv[1], NORMGROUPS))

--- 564,568 -----
  #ifdef ORGDISTRIB
! 	/* as well as organizational removals */
! 	   || !STRCMP(ORGDISTRIB, header.distribution)
! #endif	/* ORGDISTRIB */		
  	   || !ngmatch(argv[1], NORMGROUPS))
***************
*** 561,565
  	   || !ngmatch(argv[1], NORMGROUPS))
- #else	/* !ORGDISTRIB */		
- 	if (!STRCMP("local", header.distribution))
- #endif	/* !ORGDISTRIB */		
  #endif /* NORMGROUPS */

--- 568,569 -----
  	   || !ngmatch(argv[1], NORMGROUPS))
  #endif /* NORMGROUPS */
***************
*** 638,640
  	if (line == NULL) {
- 		struct tm *tm;
  		log("Can't cancel %s:  non-existent", argv[1]);

--- 642,643 -----
  	if (line == NULL) {
  		log("Can't cancel %s:  non-existent", argv[1]);
***************
*** 641,650
  		(void) time(&t);
! 		tm = localtime(&t);
! #ifdef USG
! 		sprintf(bfr,"%s\t%2.2d/%2.2d/%d %2.2d:%2.2d\tcancelled",
! #else /* !USG */
! 		sprintf(bfr,"%s\t%02d/%02d/%d %02d:%02d\tcancelled",
! #endif /* !USG */
! 		   argv[1], tm->tm_mon+1, tm->tm_mday, tm->tm_year, tm->tm_hour,
! 		   tm->tm_min);
  		savehist(bfr);

--- 644,646 -----
  		(void) time(&t);
! 		sprintf(bfr,"%s\t%ld\tcancelled", argv[1], t);
  		savehist(bfr);
***************
*** 737,739
  	register FILE *f, *u;
! 	int c;
  

--- 733,736 -----
  	register FILE *f, *u;
! 	register int len;
! 	register char *cp;
  
***************
*** 740,747
  #ifdef NOTIFY
! 	f = mailhdr((struct hbuf *)NULL, "sendsys control message");
! 	if (f != NULL) {
! 		fprintf(f, "%s requested your %s/sys file.\n", header.path, LIB);
! 		fprintf(f, "It has been sent.\n");
! 		fprintf(f, "\n\n%s says:\n", header.path);
! 		controlmail = f;
  	}

--- 737,746 -----
  #ifdef NOTIFY
! 	if (argc < 2) {
! 		f = mailhdr((struct hbuf *)NULL, "sendsys control message");
! 		if (f != NULL) {
! 			fprintf(f, "%s requested your %s/sys file.\n", header.path, LIB);
! 			fprintf(f, "It has been sent.\n");
! 			fprintf(f, "\n\n%s says:\n", header.path);
! 			controlmail = f;
! 		}
  	}
***************
*** 750,754
  	u = fopen(SUBFILE, "r");
! 	if (f != NULL && u != NULL) {
! 		while ((c=getc(u)) != EOF)
! 			putc(c, f);
  		(void) fclose(u);

--- 749,755 -----
  	u = fopen(SUBFILE, "r");
! 	if (f == NULL || u == NULL) 
! 		return 0;
! 	if (argc < 2) {
! 		while (len = fread(bfr, 1, sizeof bfr, u))
! 			fwrite(bfr, 1, len, f);
  		(void) fclose(u);
***************
*** 755,756
  		(void) mclose(f);
  	}

--- 756,758 -----
  		(void) mclose(f);
+ 		return 0;
  	}
***************
*** 756,757
  	}
  	return 0;

--- 758,776 -----
  	}
+ 	cp = argv[argc -1];
+ 	len = strlen(cp);
+ 	while (fgets(bfr, sizeof bfr, u) != NULL) {
+ 		while (STRNCMP(bfr, cp, len) == 0 && (bfr[len] == ':'
+ 			    || bfr[len] == '/')) {
+ 			register char *ch, c;
+ 			do {
+ 				ch = bfr;
+ 				while (c= *ch++)
+ 					putc(c, f);
+ 				c = ch[-3]; /* looking for trailing \ */
+ 			} while (fgets(bfr, sizeof bfr, u) != NULL
+ 				&& c == '\\');
+ 		}
+ 	}
+ 	(void) fclose(u);
+ 	(void) mclose(f);
  	return 0;
***************
*** 788,789
  
  	(void) setuid(geteuid());

--- 807,812 -----
  
+ 	if (header.approved[0] == '\0') {
+ 		logerr("checkgroups: not approved");
+ 		return 1;
+ 	}
  	(void) setuid(geteuid());
***************
*** 881,882
  		(void) close(hisside);
  		(void) setgid(gid);

--- 904,906 -----
  		(void) close(hisside);
+ 		unlock();
  		(void) setgid(gid);
Index: expire.c
Prereq: 2.61
diff -c1 onews/expire.c news/expire.c
*** onews/expire.c	Thu Jan 19 00:06:40 1989
--- news/expire.c	Fri Sep  1 18:23:21 1989
***************
*** 19,21
  #ifdef SCCSID
! static char	*SccsId = "@(#)expire.c	2.61	1/19/89";
  #endif /* SCCSID */

--- 19,21 -----
  #ifdef SCCSID
! static char	*SccsId = "@(#)expire.c	2.63	9/1/89";
  #endif /* SCCSID */
***************
*** 348,349
  		(void) close(creat(DIRFILE, 0666));
  		initdbm(NARTFILE);

--- 348,350 -----
  		(void) close(creat(DIRFILE, 0666));
+ 		(void) close(creat(NARTFILE, 0666));
  		initdbm(NARTFILE);
***************
*** 438,439
  				printf("article: %s", afline);
  			if (afline[0] != '<')

--- 439,441 -----
  				printf("article: %s", afline);
+ 			h.expdate[0] = '\0';
  			if (afline[0] != '<')
***************
*** 446,448
  			*p1 = '\t';
! 			p2 = index(p1 + 1, '\t');
  			if (!p2)

--- 448,450 -----
  			*p1 = '\t';
! 			p2 = rindex(p1 + 1, '\t');
  			if (!p2)
***************
*** 462,464
  			}
! 			rectime = cgtdate(recdate);
  			*p2++ = '\t';

--- 464,474 -----
  			}
! 			p3 = index(recdate, '~');
! 			if (p3) {
! 				*p3++ = '\0';
! 				rectime = cgtdate(recdate);
! 				exptime = atol(p3);
! 			} else { 
! 				rectime = cgtdate(recdate);
! 				exptime = rectime + expincr;
! 			}
  			*p2++ = '\t';
***************
*** 511,513
  			if (!ngmatch(nbuf, ngpat) ||
! 			     ((rectime+expincr > today) && !dorebuild &&
  				 !frflag && !usepost && recdate[0] != ' '))

--- 521,523 -----
  			if (!ngmatch(nbuf, ngpat) ||
! 			     (exptime > today && !dorebuild &&
  				 !frflag && !usepost && recdate[0] != ' '))
***************
*** 515,517
  			if (!dorebuild && !frflag && !usepost &&
! 				recdate[0] != ' ') {
  				grpsleft[0] = '\0';

--- 525,527 -----
  			if (!dorebuild && !frflag && !usepost &&
! 			     recdate[0] != ' ') {
  				grpsleft[0] = '\0';
***************
*** 615,617
  			if ((cp = index(h.nbuf, NGDELIM)) == NULL) {
- 				struct tm *tm;
  saveit:

--- 625,626 -----
  			if ((cp = index(h.nbuf, NGDELIM)) == NULL) {
  saveit:
***************
*** 617,628
  saveit:
! 				tm = gmtime(&rectime);
! 				fprintf(nhfd,
! #ifdef USG
! 				     "%s\t%s%2.2d/%2.2d/%d %2.2d:%2.2d\t%s\n",
! #else /* !USG */
! 				     "%s\t%s%02d/%02d/%d %02d:%02d\t%s\n",
! #endif /* !USG */
! 					h.ident, h.expdate[0] ? " " : "",
! 					tm->tm_mon+1, tm->tm_mday, tm->tm_year,
! 					tm->tm_hour, tm->tm_min, filename);
  				if(ferror(nhfd))

--- 626,634 -----
  saveit:
! 				fprintf(nhfd, "%s\t%ld",
! 					h.ident, rectime);
! 				if (h.expdate[0])
! 					fprintf(nhfd, "~%ld",
! 						(long) cgtdate(h.expdate));
! 					
! 				fprintf(nhfd, "\t%s\n", filename);
  				if(ferror(nhfd))
***************
*** 697,698
  			exptime = newtime;
  		if (frflag ? strcmp(baduser,h.from)==0 : today >= exptime) {

--- 703,705 -----
  			exptime = newtime;
+ 
  		if (frflag ? strcmp(baduser,h.from)==0 : today >= exptime) {
***************
*** 732,734
  				    h.ident, recdate);
! 			fputs(afline, nhfd);
  			if (ferror(nhfd))

--- 739,751 -----
  				    h.ident, recdate);
! 			if (h.expdate[0] == '\0')
! 				fputs(afline, nhfd);
! 			else {
! 				register char *rcp = rindex(recdate, ' ');
! 				if (rcp && STRCMP(rcp, " GMT") == 0)
! 					rcp = '\0';
! 				fprintf(nhfd, "%s\t%s~%ld%s\n", h.ident,
! 					recdate[0] == ' '? recdate+1 : recdate,
! 					exptime, rindex(afline, '\t'));
! 			}
! 
  			if (ferror(nhfd))
***************
*** 744,746
  		register struct multhist *mhp;
- 		struct tm *tm;
  		for (mhp = multhist; mhp < multhist+mh_size && mhp->mh_ident != NULL; mhp++)

--- 761,762 -----
  		register struct multhist *mhp;
  		for (mhp = multhist; mhp < multhist+mh_size && mhp->mh_ident != NULL; mhp++)
***************
*** 770,781
  				}
! 				tm = gmtime(&rectime);
! 				fprintf(nhfd,
! #ifdef USG
! 					"%s\t%s%2.2d/%2.2d/%d %2.2d:%2.2d\t%s\n",
! #else /* !USG */
! 					"%s\t%s%02d/%02d/%d %02d:%02d\t%s\n",
! #endif /* !USG */
! 					h.ident, h.expdate[0] ? " " : "",
! 					tm->tm_mon+1, tm->tm_mday, tm->tm_year,
! 					tm->tm_hour, tm->tm_min, mhp->mh_file);
  				if (ferror(nhfd))

--- 786,792 -----
  				}
! 				fprintf(nhfd, "%s\t%ld", h.ident, rectime);
! 				if (h.expdate[0])
! 					fprintf(nhfd, "~%ld",
! 						(long) cgtdate(h.expdate));
! 				fprintf(nhfd,"\t%s\n", mhp->mh_file);
  				if (ferror(nhfd))
***************
*** 862,864
  		int lineno = 0;
! 		char c, cansub, groupname[BUFLEN];
  

--- 873,875 -----
  		int lineno = 0;
! 		char c, cansub, groupname[BUFLEN], restofline[BUFLEN];
  
***************
*** 867,870
  		lineno++;
! 		if (sscanf(afline,"%s %ld %ld %c", groupname, &maxart, &minart,
! 		    &cansub) < 4) {
  			xerror("Line %d in active file invalid: %s",

--- 878,882 -----
  		lineno++;
! 		restofline[0] = '\0';
! 		if (sscanf(afline,"%s %ld %ld %c%s", groupname, &maxart,
! 			&minart, &cansub, restofline) < 4) {
  			xerror("Line %d in active file invalid: %s",
***************
*** 919,921
  		if (verbose > 4)
! 			printf("\tmaxart = %5.5ld, minart = %5.5ld\n",
  				maxart, minart);

--- 931,933 -----
  		if (verbose > 4)
! 			printf("\tmaxart = %7.7ld, minart = %7.7ld\n",
  				maxart, minart);
***************
*** 921,923
  				maxart, minart);
! 		fprintf(nhfd,"%s %5.5ld %5.5ld %c\n", groupname, maxart,
  			minart, cansub);

--- 933,935 -----
  				maxart, minart);
! 		fprintf(nhfd,"%s %7.7ld %7.7ld %c\n", groupname, maxart,
  			minart, cansub);
***************
*** 927,929
  		if (verbose > 4)
! 			printf("\tmaxart = %05ld, minart = %05ld\n",
  				maxart, minart);

--- 939,941 -----
  		if (verbose > 4)
! 			printf("\tmaxart = %07ld, minart = %07ld\n",
  				maxart, minart);
***************
*** 929,932
  				maxart, minart);
! 		fprintf(nhfd,"%s %05ld %05ld %c\n", groupname, maxart,
! 			minart, cansub);
  		if  (ferror(nhfd))

--- 941,945 -----
  				maxart, minart);
! 		fprintf(nhfd,"%s %07ld %07ld %c%s%s\n", groupname, maxart,
! 			minart, cansub, restofline[0] != '\0' ? " " : "",
! 			restofline);
  		if  (ferror(nhfd))

Index: funcs2.c
Prereq: 1.25
diff -c1 onews/funcs2.c news/funcs2.c
*** onews/funcs2.c	Sun Jan 15 19:48:57 1989
--- news/funcs2.c	Fri Sep  1 18:23:22 1989
***************
*** 19,21
  #ifdef SCCSID
! static char	*SccsId = "@(#)funcs2.c	1.25	1/15/89";
  #endif /* SCCSID */

--- 19,21 -----
  #ifdef SCCSID
! static char	*SccsId = "@(#)funcs2.c	1.26	9/1/89";
  #endif /* SCCSID */
***************
*** 206,207
  	char	junk[40],month[40],day[30],tod[60],year[50];
  	static time_t lasttime;

--- 206,208 -----
  	char	junk[40],month[40],day[30],tod[60],year[50];
+ 	register char *cp;
  	static time_t lasttime;
***************
*** 211,213
  		return lasttime;
! 	lasttime = getdate(datestr, &Now);
  	if (lasttime < 0) {

--- 212,222 -----
  		return lasttime;
! 	strncpy(lastdatestr, datestr, BUFLEN);
! 	cp = index(lastdatestr, '~');
! 	if (cp)
! 		*cp = '\0';
! 
! 	lasttime = atol(lastdatestr);
! 	if (lasttime > 600000000L)
! 		return lasttime;
! 	lasttime = getdate(lastdatestr, &Now);
  	if (lasttime < 0) {
***************
*** 213,216
  	if (lasttime < 0) {
! 		logerr("%s: Unparsable date \"%s\"", filename, datestr);
! 		if (sscanf(datestr, "%s %s %s %s %s", junk, month, day, tod,
  			year) == 5) {

--- 222,225 -----
  	if (lasttime < 0) {
! 		logerr("%s: Unparsable date \"%s\"", filename, lastdatestr);
! 		if (sscanf(lastdatestr, "%s %s %s %s %s", junk, month, day, tod,
  			year) == 5) {
***************
*** 221,223
  		if (lasttime < 0) {
! 			datestr = "now"; /* better than nothing */
  			lasttime = Now.time;

--- 230,232 -----
  		if (lasttime < 0) {
! 			strcpy(lastdatestr, "now"); /* better than nothing */
  			lasttime = Now.time;
***************
*** 225,227
  	}
- 	strncpy(lastdatestr, datestr, BUFLEN);
  	return lasttime;

--- 234,235 -----
  	}
  	return lasttime;
Index: getdate.y
Prereq: 2.19
diff -c1 onews/getdate.y news/getdate.y
*** onews/getdate.y	Tue Jan 17 13:09:29 1989
--- news/getdate.y	Fri Sep  1 18:23:23 1989
***************
*** 5,7
  	/*	University of North Carolina at Chapel Hill	*/
! 	/*	@(#)getdate.y	2.19	1/17/89	*/
  

--- 5,7 -----
  	/*	University of North Carolina at Chapel Hill	*/
! 	/*	@(#)getdate.y	2.20	9/1/89	*/
  
***************
*** 105,107
  
- 
  rspec:	SNUMBER UNIT =

--- 105,106 -----
  
  rspec:	SNUMBER UNIT =
***************
*** 108,109
  		{relsec +=  60L * $1 * $2;}
  	| SNUMBER MUNIT =

--- 107,110 -----
  		{relsec +=  60L * $1 * $2;}
+ 	| UNUMBER UNIT =
+ 		{relsec +=  60L * $1 * $2;}
  	| SNUMBER MUNIT =
***************
*** 110,111
  		{relmonth += $1 * $2;}
  	| SNUMBER SUNIT =

--- 111,114 -----
  		{relmonth += $1 * $2;}
+ 	| UNUMBER MUNIT =
+ 		{relmonth += $1 * $2;}
  	| SNUMBER SUNIT =
***************
*** 112,113
  		{relsec += $1;}
  	| UNIT =

--- 115,118 -----
  		{relsec += $1;}
+ 	| UNUMBER SUNIT =
+ 		{relsec += $1;}
  	| UNIT =
***************
*** 272,274
  	char *name;
! 	int type, value;
  };

--- 277,280 -----
  	char *name;
! 	int type;
! 	long value;
  };
Index: header.c
Prereq: 2.50
diff -c1 onews/header.c news/header.c
*** onews/header.c	Sun Jan 15 19:48:58 1989
--- news/header.c	Fri Sep  1 18:23:24 1989
***************
*** 19,21
  #ifdef SCCSID
! static char	*SccsId = "@(#)header.c	2.50	1/15/89";
  #endif /* SCCSID */

--- 19,21 -----
  #ifdef SCCSID
! static char	*SccsId = "@(#)header.c	2.51	9/1/89";
  #endif /* SCCSID */
***************
*** 205,207
  				do {
! 					if (*cp && !isprint(*cp))
  						*cp = '?';

--- 205,208 -----
  				do {
! 					if (*cp && (isspace(*cp) ||
! 					    !isprint(*cp)))
  						*cp = '?';
***************
*** 232,233
  				hp->path[0] != '\0' &&
  				strncmp(hp->path, LOCALPATHSYSNAME,

--- 233,238 -----
  				hp->path[0] != '\0' &&
+ #ifdef GENERICPATH
+ 				strncmp(hp->path, PATHSYSNAME,
+ 					 strlen(PATHSYSNAME)) != 0) {
+ #else /* !GENERICPATH */
  				strncmp(hp->path, LOCALPATHSYSNAME,
***************
*** 234,235
  					 strlen(LOCALPATHSYSNAME)) != 0) {
  					hp->distribution[0] = '\0';

--- 239,241 -----
  					 strlen(LOCALPATHSYSNAME)) != 0) {
+ #endif /* !GENERICPATH */
  					hp->distribution[0] = '\0';
Index: header.h
Prereq: 2.22
diff -c1 onews/header.h news/header.h
*** onews/header.h	Sun Jan 15 19:48:58 1989
--- news/header.h	Fri Sep  1 18:23:25 1989
***************
*** 4,6
  
! /*	@(#)header.h	2.22	1/15/89	*/
  

--- 4,6 -----
  
! /*	@(#)header.h	2.23	9/1/89	*/
  
***************
*** 20,21
  	char	expdate[DATELEN];	/* Expires:		*/
  	char	ctlmsg[PATHLEN];	/* Control:		*/

--- 20,22 -----
  	char	expdate[DATELEN];	/* Expires:		*/
+ 	time_t	exptime;		/* Expire time in secs	*/
  	char	ctlmsg[PATHLEN];	/* Control:		*/
***************
*** 27,29
  	int	intnumlines;		/* Integer version	*/
! 	char	keywords[BUFLEN];	/* Keywords:		*/
  	char	summary[BUFLEN];	/* Summary:		*/

--- 28,30 -----
  	int	intnumlines;		/* Integer version	*/
! 	char	keywords[MBUFLEN];	/* Keywords:		*/
  	char	summary[BUFLEN];	/* Summary:		*/

Index: ifuncs.c
Prereq: 2.72
diff -c1 onews/ifuncs.c news/ifuncs.c
*** onews/ifuncs.c	Wed Jan 18 14:28:50 1989
--- news/ifuncs.c	Tue Sep 12 16:58:15 1989
***************
*** 18,20
  #ifdef SCCSID
! static char	*SccsId = "@(#)ifuncs.c	2.72	1/18/89";
  #endif /* SCCSID */

--- 18,20 -----
  #ifdef SCCSID
! static char	*SccsId = "@(#)ifuncs.c	2.77	9/12/89";
  #endif /* SCCSID */
***************
*** 22,23
  #include "iparams.h"
  

--- 22,26 -----
  #include "iparams.h"
+ #if defined(BSD4_2) || defined(USG)
+ #include <fcntl.h>
+ #endif /* BSD || USG */
  
***************
*** 282,284
  /* I:	append messageid to file. implies F flag */
! 	int appmsgid = maynotify && (index(sp->s_flags, 'I') != NULL);
  

--- 285,287 -----
  /* I:	append messageid to file. implies F flag */
! 	int appmsgid = (index(sp->s_flags, 'I') != NULL);
  
***************
*** 284,285
  
  	/* allow specification based on size */

--- 287,293 -----
  
+ 	if (appmsgid && !appfile && !maynotify) {
+ 		appmsgid =  FALSE;
+ 		appfile = TRUE;
+ 	}
+ 
  	/* allow specification based on size */
***************
*** 389,391
  #endif /* !LOGDIR */
! 				BATCHDIR, TRANS, appmsgid ? ".ihave" : "");
  		}

--- 397,400 -----
  #endif /* !LOGDIR */
! 				BATCHDIR, TRANS, 
! 				(appmsgid && !appfile) ? ".ihave" : "");
  		}
***************
*** 392,393
  		ofp = fopen(sp->s_xmit, "a");
  		if (ofp == NULL)

--- 401,405 -----
  		ofp = fopen(sp->s_xmit, "a");
+ #ifdef F_SETFL
+ 		(void) fcntl(fileno(ofp), F_SETFL, O_APPEND);
+ #endif /* F_SETFL */
  		if (ofp == NULL)
***************
*** 394,397
  			xerror("Cannot append to %s", sp->s_xmit);
! 		fprintf(ofp, "%s", appmsgid ? hh.ident :
! 			firstbufname);
  #ifdef MULTICAST

--- 406,412 -----
  			xerror("Cannot append to %s", sp->s_xmit);
! 		if (appfile && appmsgid)
! 			fprintf(ofp, "%s\t%s", firstbufname, hh.ident);
! 		else
! 			fprintf(ofp, "%s", appmsgid ? hh.ident :
! 				firstbufname);
  #ifdef MULTICAST
***************
*** 775,777
  #else /* O_EXCL */
! 	while ((fd=(open(lockname, O_EXCL|O_CREAT, 0) < 0) {
  #endif /* O_EXCL */

--- 790,792 -----
  #else /* O_EXCL */
! 	while ((fd=open(lockname, O_EXCL|O_CREAT, 0)) < 0) {
  #endif /* O_EXCL */
***************
*** 906,910
  			if (STRCMP(bfr, ngs[i]) == NGUNSEEN) { /* localize? */
! 				/* newsgroup 12345 12345 X */
! 				/*  cp +    01234567890123 */
! 				if (!isproc && cp[13]  == 'n')
  					uses[i] = NGOK;

--- 921,965 -----
  			if (STRCMP(bfr, ngs[i]) == NGUNSEEN) { /* localize? */
! 				/* newsgroup 1234567 1234567 X optional-fname */
! 				/*  cp +    01234567890123456789 */
! 				if (cp[18] == ' ' && cp[19] != '\0') {
! 					int ok2post = 0;
! 					char buf2[BUFLEN], pbuf[MBUFLEN];
! 					register char *cp2, *cp3;
! 					/* check for private groups
! 					 * only sites listed in the file
! 					 * specified can post
! 					 */
! 					cp2 = index(&cp[19], '\n');
! 					if (cp2)
! 						*cp2 = '\0';
! 					cp2 = pbuf;
! 					cp3 = header.path;
! 					while (*cp3 &&index(NETCHRS, *cp3) == 0)
! 						*cp2++ = *cp3++;
! 					*cp2 = '\0';
! 					f = xfopen(&cp[19], "r");
! 					while (!ok2post) {
! 						register int c;
! 						cp2 = buf2;
! 						while ((c=getc(f)) != EOF) {
! 							if (c == '\n') {
! 								*cp2 = '\0';
! 								break;
! 							}
! 							*cp2++ = c;
! 						}
! 						if (c == EOF)
! 							break;
! 						if  (STRCMP(pbuf, buf2) == 0) {
! 							ok2post = 1;
! 							break;
! 						}
! 					}
! 					(void) fclose(f);
! 					if (!ok2post) {
! 						logerr("%s is not authorized to post to %s", pbuf, ngs[i]);
! 						return TRUE;
! 					}
! 				}
! 				if (!isproc && cp[17]  == 'n') {
  					uses[i] = NGOK;
***************
*** 910,912
  					uses[i] = NGOK;
! 				else {
  					if (uses[i] < NGALIAS)

--- 965,967 -----
  					uses[i] = NGOK;
! 				} else {
  					if (uses[i] < NGALIAS)
***************
*** 913,915
  						uses[i] = NGALIAS;
! 					if (cp[13] == 'm') {
  						strcpy(is_mod, bfr);

--- 968,970 -----
  						uses[i] = NGALIAS;
! 					if (cp[17] == 'm') {
  						strcpy(is_mod, bfr);
***************
*** 1150,1156
  
! #undef NGUNSEEN 0
! #undef NGOK 1
! #undef NGALIAS 2
! #undef NGBUGS 3
! #undef NGABUGS 4
  

--- 1205,1211 -----
  
! #undef NGUNSEEN
! #undef NGOK
! #undef NGALIAS
! #undef NGBUGS
! #undef NGABUGS
  
***************
*** 1176,1179
  	while ((!ret) && fscanf(mfd, "%[^:]:%s\n", mgrp, mlist) != EOF) {
- 		if (feof(mfd))
- 			break;
  		if (mgrp[0] == '#')

--- 1231,1232 -----
  	while ((!ret) && fscanf(mfd, "%[^:]:%s\n", mgrp, mlist) != EOF) {
  		if (mgrp[0] == '#')
***************
*** 1400,1402
  						freopen(tfilename, "r", infp);
! 					(void) free(cp);
  					return;	/* from checkbatch as if

--- 1453,1456 -----
  						freopen(tfilename, "r", infp);
! 					setbuf(infp, (char *) NULL);
! 					(void) free(cp); 
  					return;	/* from checkbatch as if
Index: inews.c
Prereq: 2.91
diff -c1 onews/inews.c news/inews.c
*** onews/inews.c	Tue Jan 24 15:24:00 1989
--- news/inews.c	Fri Sep  1 18:23:27 1989
***************
*** 19,21
  #ifdef SCCSID
! static char	*SccsId = "@(#)inews.c	2.91	1/24/89";
  #endif /* SCCSID */

--- 19,21 -----
  #ifdef SCCSID
! static char	*SccsId = "@(#)inews.c	2.92	9/1/89";
  #endif /* SCCSID */
***************
*** 55,56
  int spool_news = DONT_SPOOL;
  

--- 55,58 -----
  int spool_news = DONT_SPOOL;
+ static char *artlinks[32];
+ static int  linkcount;
  
***************
*** 223,226
  #ifdef NICENESS
! 		if (nice(0) < NICENESS)
! 			(void) nice(NICENESS);
  #endif /* NICENESS */

--- 225,228 -----
  #ifdef NICENESS
! 		if ((i=nice(0)) < NICENESS)
! 			(void) nice(NICENESS-i);
  #endif /* NICENESS */
***************
*** 237,243
  	if (space()) {		/* check disk space */
! 		mode = PROC;
! 		logerr("Out of space in %s. Saving for later processing.",
! 					SPOOLDIR);
! 		dospool((char *)NULL, FALSE);
! 		/* NOT REACHED */
  	}

--- 239,242 -----
  	if (space()) {		/* check disk space */
! 		spool_news = DOSPOOL;
! 		logerr("Out of space in %s.", SPOOLDIR);
  	}
***************
*** 306,308
  		&& uid == 0 /* allow root to set name in any case */
! #endif	/* !DOGETUSER */
  		) {

--- 305,307 -----
  		&& uid == 0 /* allow root to set name in any case */
! #endif	/* DOGETUSER */
  		) {
***************
*** 809,812
  
- static char *artlinks[32];
- static int  linkcount;
  /*

--- 808,809 -----
  
  /*
***************
*** 837,839
  			if (STRCMP(bfr, ngname) == 0) {
! 				if (ngsize < 0 || ngsize > 99998) {
  					logerr("found bad ngsize %ld ng %s, setting to 1", ngsize, bfr);

--- 834,836 -----
  			if (STRCMP(bfr, ngname) == 0) {
! 				if (ngsize < 0 || ngsize > 9999998L) {
  					logerr("found bad ngsize %ld ng %s, setting to 1", ngsize, bfr);
***************
*** 906,909
  	/*
! 	 * Has to be same size as old because of %05d.
! 	 * This will overflow with 99999 articles.
  	 */

--- 903,906 -----
  	/*
! 	 * Has to be same size as old because of %07d.
! 	 * This will overflow with 9,999,999 articles.
  	 */
***************
*** 909,911
  	 */
! 	fprintf(actfp, "%s %05ld", ngname, ngsize+1);
  #if defined(USG) || defined(MG1)

--- 906,908 -----
  	 */
! 	fprintf(actfp, "%s %07ld", ngname, ngsize+1);
  #if defined(USG) || defined(MG1)
***************
*** 946,948
  	struct srec srec;	/* struct for sys file lookup	*/
- 	struct tm *tm, *gmtime();
  	int is_invalid = FALSE;

--- 943,944 -----
  	struct srec srec;	/* struct for sys file lookup	*/
  	int is_invalid = FALSE;
***************
*** 948,949
  	int is_invalid = FALSE;
  	int exitcode = 0;

--- 944,946 -----
  	int is_invalid = FALSE;
+ 	int junked = FALSE;
  	int exitcode = 0;
***************
*** 963,974
  
! 	(void) time(&now);
! 	tm = gmtime(&now);
! 	if (header.expdate[0])
! 		addhist(" ");
! #ifdef USG
! 	sprintf(bfr,"%2.2d/%2.2d/%d %2.2d:%2.2d\t",
! #else /* !USG */
! 	sprintf(bfr,"%02d/%02d/%d %02d:%02d\t",
! #endif /* !USG */
! 		tm->tm_mon+1, tm->tm_mday, tm->tm_year,tm->tm_hour, tm->tm_min);
  	addhist(bfr);

--- 960,962 -----
  
! 	sprintf(bfr, "%ld", time(&now));
  	addhist(bfr);
***************
*** 974,975
  	addhist(bfr);
  	log("%s %s ng %s subj '%s' from %s", spool_news != DONT_SPOOL

--- 962,968 -----
  	addhist(bfr);
+ 	if (header.expdate[0]) {
+ 		sprintf(bfr,"~%ld",(long) cgtdate(header.expdate));
+ 		addhist(bfr);
+ 	}
+ 	addhist("\t");
  	log("%s %s ng %s subj '%s' from %s", spool_news != DONT_SPOOL
***************
*** 987,989
  			header.nbuf);
! 		if (localize("junk"))
  			savehist(histline);

--- 980,982 -----
  			header.nbuf);
! 		if (localize("junk")) {
  			savehist(histline);
***************
*** 989,990
  			savehist(histline);
  		exitcode = 1;

--- 982,985 -----
  			savehist(histline);
+ 			junked = TRUE;
+ 		}
  		exitcode = 1;
***************
*** 996,998
  		logerr("Orphaned Response, moved to junk");
! 		if (localize("junk"))
  			savehist(histline);

--- 991,993 -----
  		logerr("Orphaned Response, moved to junk");
! 		if (localize("junk")) {
  			savehist(histline);
***************
*** 998,999
  			savehist(histline);
  		exitcode = 1;

--- 993,998 -----
  			savehist(histline);
+ 			/*
+ 			junked = TRUE;
+ 			*/
+ 		}
  		exitcode = 1;
***************
*** 1005,1007
  		logerr("Article too old, moved to junk");
! 		if (localize("junk"))
  			savehist(histline);

--- 1004,1006 -----
  		logerr("Article too old, moved to junk");
! 		if (localize("junk")) {
  			savehist(histline);
***************
*** 1007,1008
  			savehist(histline);
  		exitcode = 1;

--- 1006,1009 -----
  			savehist(histline);
+ 			junked = TRUE;
+ 		}
  		exitcode = 1;
***************
*** 1220,1222
  	xxit((mode == PROC && filename[0] == '\0') ? 0 :
! 		(exitcode < 0 ? 0 : exitcode));
  }

--- 1221,1223 -----
  	xxit((mode == PROC && filename[0] == '\0') ? 0 :
! 		(exitcode < 0 || junked ? 0 : exitcode));
  }
Index: makeactive.sh
Prereq: 1.27
diff -c1 onews/makeactive.sh news/makeactive.sh
*** onews/makeactive.sh	Tue Jan 24 17:05:21 1989
--- news/makeactive.sh	Thu Sep  7 17:54:30 1989
***************
*** 2,4
  : "Usage: sh makeactive.sh LIBDIR SPOOLDIR NEWSUSR NEWSGRP"
! : '@(#)makeactive	1.27	1/24/89'
  LIBDIR=$1

--- 2,4 -----
  : "Usage: sh makeactive.sh LIBDIR SPOOLDIR NEWSUSR NEWSGRP"
! : '@(#)makeactive	1.29	9/7/89'
  LIBDIR=$1
***************
*** 13,14
  comp.ai.nlang-know-rep	Natural Language and Knowledge Representation. (Moderated)
  comp.ai.vision		Artificial Intelligence Vision Research. (Moderated)

--- 13,15 -----
  comp.ai.nlang-know-rep	Natural Language and Knowledge Representation. (Moderated)
+ comp.ai.shells		Artificial intelligence applied to shells. (Moderated)
  comp.ai.vision		Artificial Intelligence Vision Research. (Moderated)
***************
*** 56,58
  comp.lang.icon		Topics related to the ICON programming language.
! comp.lang.idl		IBL (Interface Description Language) related topics.
  comp.lang.lisp		Discussion about LISP.

--- 57,59 -----
  comp.lang.icon		Topics related to the ICON programming language.
! comp.lang.idl		IDL (Interface Description Language) related topics.
  comp.lang.lisp		Discussion about LISP.
***************
*** 80,81
  comp.mail.multi-media	Multimedia Mail.
  comp.mail.sendmail	Configuring and using the BSD sendmail agent.

--- 81,83 -----
  comp.mail.multi-media	Multimedia Mail.
+ comp.mail.mush		The Mail User's Shell (MUSH).
  comp.mail.sendmail	Configuring and using the BSD sendmail agent.
***************
*** 94,95
  comp.os.eunice		The SRI Eunice system.
  comp.os.minix		Discussion of Tanenbaum's MINIX system.

--- 96,98 -----
  comp.os.eunice		The SRI Eunice system.
+ comp.os.mach		The MACH OS from CMU & other places.
  comp.os.minix		Discussion of Tanenbaum's MINIX system.
***************
*** 111,112
  comp.protocols.iso.x400.gateway	X400 mail gateway discussions.  (Moderated)
  comp.protocols.kermit	Info about the Kermit package. (Moderated)

--- 114,116 -----
  comp.protocols.iso.x400.gateway	X400 mail gateway discussions.  (Moderated)
+ comp.protocols.kerberos	The Kerberos authentification server.
  comp.protocols.kermit	Info about the Kermit package. (Moderated)
***************
*** 119,120
  comp.protocols.tcp-ip.ibmpc	TCP/IP for IBM(-like) personal computers.
  comp.risks		Risks to the public from computers & users. (Moderated)

--- 123,125 -----
  comp.protocols.tcp-ip.ibmpc	TCP/IP for IBM(-like) personal computers.
+ comp.realtime		Issues related to real-time computing.
  comp.risks		Risks to the public from computers & users. (Moderated)
***************
*** 124,125
  comp.society.women	Women's roles and problems in computing (Moderated)
  comp.software-eng	Software Engineering and related topics.

--- 129,131 -----
  comp.society.women	Women's roles and problems in computing (Moderated)
+ comp.soft-sys.andrew	The Andrew system from CMU.
  comp.software-eng	Software Engineering and related topics.
***************
*** 133,134
  comp.sources.misc	Posting of software . (Moderated)
  comp.sources.unix	Postings of complete, UNIX-oriented sources. (Moderated)

--- 139,141 -----
  comp.sources.misc	Posting of software . (Moderated)
+ comp.sources.sun	Software for Sun workstations. (Moderated)
  comp.sources.unix	Postings of complete, UNIX-oriented sources. (Moderated)
***************
*** 141,142
  comp.std.unix		Discussion for the P1003 committee on UNIX. (Moderated)
  comp.sys.amiga		Commodore Amiga: info&uses, but no programs.

--- 148,150 -----
  comp.std.unix		Discussion for the P1003 committee on UNIX. (Moderated)
+ comp.sw.components	Software components and related technology.
  comp.sys.amiga		Commodore Amiga: info&uses, but no programs.
***************
*** 161,162
  comp.sys.intel.ipsc310	Anything related to Xenix on an Intel 310.
  comp.sys.m6809		Discussion about 6809's.

--- 169,171 -----
  comp.sys.intel.ipsc310	Anything related to Xenix on an Intel 310.
+ comp.sys.isis		The ISIS distributed system from Cornell.
  comp.sys.m6809		Discussion about 6809's.
***************
*** 169,170
  comp.sys.masscomp	The Masscomp line of computers. (Moderated)
  comp.sys.misc		Discussion about computers of all kinds.

--- 178,180 -----
  comp.sys.masscomp	The Masscomp line of computers. (Moderated)
+ comp.sys.mips		Systems based on MIPS chips.
  comp.sys.misc		Discussion about computers of all kinds.
***************
*** 202,203
  comp.unix.cray		Cray computers and their operating systems.
  comp.unix.microport	Discussion of Microport's UNIX.

--- 212,214 -----
  comp.unix.cray		Cray computers and their operating systems.
+ comp.unix.i386		Versions of Unix running on Intel 80386-based boxes.
  comp.unix.microport	Discussion of Microport's UNIX.
***************
*** 204,206
  comp.unix.questions	UNIX neophytes group.
! comp.unix.ultrix	Discussions about DEC's Ultrix. (Moderated)
  comp.unix.wizards	Discussions, bug reports, and fixes on and for UNIX.

--- 215,217 -----
  comp.unix.questions	UNIX neophytes group.
! comp.unix.ultrix	Discussions about DEC's Ultrix.
  comp.unix.wizards	Discussions, bug reports, and fixes on and for UNIX.
***************
*** 207,208
  comp.unix.xenix		Discussion about the Xenix OS.
  comp.windows.misc	Various issues about windowing systems.

--- 218,220 -----
  comp.unix.xenix		Discussion about the Xenix OS.
+ comp.virus		Computer viruses & security. (Moderated)
  comp.windows.misc	Various issues about windowing systems.
***************
*** 209,211
  comp.windows.ms		Window systems under MS/DOS.
! comp.windows.news	Sun Microsystems' NewS window system.
  comp.windows.x		Discussion about the X Window System.

--- 221,223 -----
  comp.windows.ms		Window systems under MS/DOS.
! comp.windows.news	Sun Microsystems' NeWS window system.
  comp.windows.x		Discussion about the X Window System.
***************
*** 213,214
  misc.consumers.house	Discussion about owning and maintaining a house.
  misc.forsale		Short, tasteful postings about items for sale.

--- 225,227 -----
  misc.consumers.house	Discussion about owning and maintaining a house.
+ misc.emerg-services	Forum for paramedics & other first responders.
  misc.forsale		Short, tasteful postings about items for sale.
***************
*** 216,217
  misc.headlines		Current interest: drug testing, terrorism, etc.
  misc.invest		Investments and the handling of money.

--- 229,231 -----
  misc.headlines		Current interest: drug testing, terrorism, etc.
+ misc.headlines.unitex	International news from the UN & related. (Moderated)
  misc.invest		Investments and the handling of money.
***************
*** 230,231
  news.announce.important	General announcements of interest to all. (Moderated)
  news.announce.newusers	Explanatory postings for new users. (Moderated)

--- 244,246 -----
  news.announce.important	General announcements of interest to all. (Moderated)
+ news.announce.newgroups	Calls for newgroups & announcements of same. (Moderated)
  news.announce.newusers	Explanatory postings for new users. (Moderated)
***************
*** 236,237
  news.newsites		Postings of new site announcements.
  news.software.b		Discussion about B-news-compatible software.

--- 251,254 -----
  news.newsites		Postings of new site announcements.
+ news.newusers.questions	Q & A for users new to the Usenet.
+ news.software.anu-news	VMS B-news software from Australian National Univ.
  news.software.b		Discussion about B-news-compatible software.
***************
*** 253,254
  rec.arts.tv.soaps	Postings about soap operas.
  rec.arts.wobegon	"A Prairie Home Companion" radio show discussion.

--- 270,272 -----
  rec.arts.tv.soaps	Postings about soap operas.
+ rec.arts.tv.uk		Discussions of telly shows from the UK.
  rec.arts.wobegon	"A Prairie Home Companion" radio show discussion.
***************
*** 259,260
  rec.aviation		Aviation rules, means, and methods.
  rec.bicycles		Bicycles, related products and laws.

--- 277,279 -----
  rec.aviation		Aviation rules, means, and methods.
+ rec.backcountry		Activities in the Great Outdoors.
  rec.bicycles		Bicycles, related products and laws.
***************
*** 286,287
  rec.ham-radio.packet	Discussion about packet radio setups.
  rec.humor		Jokes and the like.  May be somewhat offensive.

--- 305,307 -----
  rec.ham-radio.packet	Discussion about packet radio setups.
+ rec.ham-radio.swap	Offers to trade and swap radio equipment.
  rec.humor		Jokes and the like.  May be somewhat offensive.
***************
*** 299,300
  rec.music.classical	Discussion about classical music.
  rec.music.folk		Folks discussing folk music of various sorts.

--- 319,322 -----
  rec.music.classical	Discussion about classical music.
+ rec.music.dementia	Discussion of comedy and novelty music.
+ rec.music.dylan		Discussion of Bob's works & music.
  rec.music.folk		Folks discussing folk music of various sorts.
***************
*** 304,305
  rec.music.misc		Music lovers' group.
  rec.music.synth		Synthesizers and computer music.

--- 326,328 -----
  rec.music.misc		Music lovers' group.
+ rec.music.newage	"New Age" music discussions.
  rec.music.synth		Synthesizers and computer music.
***************
*** 311,313
  rec.scuba		Hobbyists interested in SCUBA diving.
! rec.skiing		Hobbyists interested in skiing.
  rec.skydiving		Hobbyists interested in skydiving.

--- 334,336 -----
  rec.scuba		Hobbyists interested in SCUBA diving.
! rec.skiing		Hobbyists interested in snow skiing.
  rec.skydiving		Hobbyists interested in skydiving.
***************
*** 321,322
  rec.woodworking		Hobbyists interested in woodworking.
  sci.astro		Astronomy discussions and information.

--- 344,346 -----
  rec.woodworking		Hobbyists interested in woodworking.
+ sci.aeronautics		The science of aeronautics & related technology.
  sci.astro		Astronomy discussions and information.
***************
*** 324,325
  sci.bio.technology	Any topic relating to biotechnology.
  sci.crypt		Different methods of data en/decryption.

--- 348,350 -----
  sci.bio.technology	Any topic relating to biotechnology.
+ sci.chem		Chemistry and related sciences.
  sci.crypt		Different methods of data en/decryption.
***************
*** 325,326
  sci.crypt		Different methods of data en/decryption.
  sci.electronics		Circuits, theory, electrons and discussions.

--- 350,352 -----
  sci.crypt		Different methods of data en/decryption.
+ sci.edu			Science education.
  sci.electronics		Circuits, theory, electrons and discussions.
***************
*** 326,327
  sci.electronics		Circuits, theory, electrons and discussions.
  sci.lang		Natural languages, communication, etc.

--- 352,355 -----
  sci.electronics		Circuits, theory, electrons and discussions.
+ sci.energy		Discussions about energy, science & technology.
+ sci.environment		Discussions about the environment and ecology.
  sci.lang		Natural languages, communication, etc.
***************
*** 335,336
  sci.med.aids		AIDS: treatment, pathology/biology of HIV, prevention. (Moderated)
  sci.military		Discussion about science & the military. (Moderated)

--- 363,365 -----
  sci.med.aids		AIDS: treatment, pathology/biology of HIV, prevention. (Moderated)
+ sci.med.physics		Issues of physics in medical testing/care.
  sci.military		Discussion about science & the military. (Moderated)
***************
*** 341,342
  sci.physics		Physical laws, properties, etc.
  sci.psychology		Topics related to psychology.

--- 370,372 -----
  sci.physics		Physical laws, properties, etc.
+ sci.physics.fusion	Info on fusion, esp. "cold" fusion.
  sci.psychology		Topics related to psychology.
***************
*** 343,344
  sci.research		Research methods, funding, ethics, and whatever.
  sci.space		Space, space programs, space related research, etc.

--- 373,375 -----
  sci.research		Research methods, funding, ethics, and whatever.
+ sci.skeptic		Skeptics discussing psuedo-science.
  sci.space		Space, space programs, space related research, etc.
***************
*** 346,347
  soc.college		College, college activities, campus life, etc.
  soc.culture.african	Discussions about Africa & things African.

--- 377,379 -----
  soc.college		College, college activities, campus life, etc.
+ soc.couples		Discussions for couples (cf. soc.singles).
  soc.culture.african	Discussions about Africa & things African.
***************
*** 348,349
  soc.culture.arabic	Technological & cultural issues, *not* politics.
  soc.culture.celtic	Group about Celts (*not* basketball!).

--- 380,382 -----
  soc.culture.arabic	Technological & cultural issues, *not* politics.
+ soc.culture.asian.american	Issues & discussion about Asian-Americans.
  soc.culture.celtic	Group about Celts (*not* basketball!).
***************
*** 352,353
  soc.culture.greek	Group about Greeks.
  soc.culture.indian	Group for discussion about India & things Indian.

--- 385,387 -----
  soc.culture.greek	Group about Greeks.
+ soc.culture.hongkong	Discussions pertaining to Hong Kong.
  soc.culture.indian	Group for discussion about India & things Indian.
***************
*** 356,357
  soc.culture.misc	Group for discussion about other cultures.
  soc.human-nets		Computer aided communications digest. (Moderated)

--- 390,395 -----
  soc.culture.misc	Group for discussion about other cultures.
+ soc.culture.nordic	Discussion about culture up north.
+ soc.culture.taiwan	Discussion about things Taiwanese.
+ soc.culture.turkish	Discussion about things Turkish.
+ soc.feminism		Discussion of feminism & feminist issues. (Moderated)
  soc.human-nets		Computer aided communications digest. (Moderated)
***************
*** 364,365
  soc.religion.christian	Christianity and related topics. (Moderated)
  soc.roots		Genealogical matters.

--- 402,404 -----
  soc.religion.christian	Christianity and related topics. (Moderated)
+ soc.rights.human	Human rights & activism (e.g., Amnesty International).
  soc.roots		Genealogical matters.
***************
*** 366,368
  soc.singles		Newsgroup for single people, their activities, etc.
! soc.women		Women's rights, discrimination, etc.
  talk.abortion		All sorts of discussions and arguments on abortion.

--- 405,407 -----
  soc.singles		Newsgroup for single people, their activities, etc.
! soc.women		Issues related to women, their problems & relationships.
  talk.abortion		All sorts of discussions and arguments on abortion.
***************
*** 371,372
  talk.philosophy.misc	Philosophical musings on all topics.
  talk.politics.mideast	Discussion & debate over Middle Eastern events.

--- 410,412 -----
  talk.philosophy.misc	Philosophical musings on all topics.
+ talk.politics.guns	The politics of firearm ownership and (mis)use.
  talk.politics.mideast	Discussion & debate over Middle Eastern events.
***************
*** 375,376
  talk.politics.theory	Theory of politics and political systems.
  talk.religion.misc	Religious, ethical, & moral implications.

--- 415,417 -----
  talk.politics.theory	Theory of politics and political systems.
+ talk.rape		Discussions on stopping rape; not to be crossposted.
  talk.religion.misc	Religious, ethical, & moral implications.
***************
*** 384,387
  	cat <<'E_O_F' >>$LIBDIR/active
! control 00000 00001
! junk 00000 00001
  E_O_F

--- 425,428 -----
  	cat <<'E_O_F' >>$LIBDIR/active
! control 0000000 0000000
! junk 0000000 0000000
  E_O_F
***************
*** 389,390
  else
  : make sure it is in the new format

--- 430,433 -----
  else
+ : increase max article number if necessary
+ sed 's/ \([0-9][0-9][0-9][0-9][0-9]\) \([0-9][0-9][0-9][0-9][0-9]\) / 00\1 00\2 /' $LIBDIR/active>$LIBDIR/nactive && mv $LIBDIR/nactive $LIBDIR/active
  : make sure it is in the new format
***************
*** 400,402
  	2)	ed - $LIBDIR/active << 'EOF'
! 1,$s/$/ 00001/
  w

--- 443,445 -----
  	2)	ed - $LIBDIR/active << 'EOF'
! 1,$s/$/ 0000000/
  w
***************
*** 431
  rm -f /tmp/$$*

--- 474,482 -----
  rm -f /tmp/$$*
+ 
+ nlines=`wc -l < $LIBDIR/active`
+ set - `grep '^#define LINES' defs.h`
+ if test $nlines -gt $3
+ then
+ 	echo "WARNING: active file has more than $3 lines"
+ 	echo "Increase LINES in defs.h"
+ fi
Index: params.h
Prereq: 2.31
diff -c1 onews/params.h news/params.h
*** onews/params.h	Thu Jan 19 00:06:42 1989
--- news/params.h	Fri Sep  1 18:23:28 1989
***************
*** 4,6
  
! /*	@(#)params.h	2.31	1/19/89	*/
  

--- 4,6 -----
  
! /*	@(#)params.h	2.32	9/1/89	*/
  
***************
*** 133,137
  
! #ifdef M_XENIX
! #define LOCKING
! #endif /* defined M_XENIX */
  

--- 133,137 -----
  
! #if defined(M_XENIX) && !defined(LOCKF) && !defined(LOCKING)
! #define LOCKING 
! #endif /* M_XENIX */
  
***************
*** 191,193
  #define STRCMP(a,b)  ((*(a) != *(b)) ? (*(a)-*(b)) : strcmp((a)+1, (b)+1))
! #define STRNCMP(a,b,n)  ((*(a) != *(b)) ? (*(a)-*(b)) : strncmp(a, b, n))
  extern char charmap[];

--- 191,193 -----
  #define STRCMP(a,b)  ((*(a) != *(b)) ? (*(a)-*(b)) : strcmp((a)+1, (b)+1))
! #define STRNCMP(a,b,n)  ((*(a) != *(b)) ? (int)(*(a)-*(b)) : strncmp(a, b, n))
  extern char charmap[];
Index: patchlevel.h
Prereq: 17
diff -c1 onews/patchlevel.h news/patchlevel.h
*** onews/patchlevel.h	Tue Jan 24 15:49:36 1989
--- news/patchlevel.h	Tue Sep 12 17:02:43 1989
***************
*** 1,2
! #define	PATCHLEVEL	17
  

--- 1,2 -----
! #define	PATCHLEVEL	18
  
***************
*** 2,3
  
! #define NEWS_VERSION   "B 2.11 1/24/89"

--- 2,3 -----
  
! #define NEWS_VERSION   "B 2.11 9/12/89"
Index: postnews.c
Prereq: 1.37
diff -c1 onews/postnews.c news/postnews.c
*** onews/postnews.c	Sun Jan 15 19:49:03 1989
--- news/postnews.c	Fri Sep  1 18:23:31 1989
***************
*** 19,21
  #ifdef SCCSID
! static char	*SccsId = "@(#)postnews.c	1.37	1/15/89";
  #endif /* SCCSID */

--- 19,21 -----
  #ifdef SCCSID
! static char	*SccsId = "@(#)postnews.c	1.40	9/1/89";
  #endif /* SCCSID */
***************
*** 43,45
  char newsgroups[BUFLEN];
! char followupto[BUFLEN];
  char isfrom[BUFLEN];

--- 43,45 -----
  char newsgroups[BUFLEN];
! char followto[BUFLEN];
  char isfrom[BUFLEN];
***************
*** 46,48
  char msgid[BUFLEN];
! char keywords[BUFLEN];
  char summary[BUFLEN];

--- 46,48 -----
  char msgid[BUFLEN];
! char keywords[MBUFLEN];
  char summary[BUFLEN];
***************
*** 457,460
  
! 	if (followupto[0] != '\0')
! 		fprintf(tf, "Followup-To: %s\n", followupto);
  

--- 457,460 -----
  
! 	if (followto[0] != '\0')
! 		fprintf(tf, "Followup-To: %s\n", followto);
  
***************
*** 652,654
  	}
! 	if (index(newsgroups, NGDELIM) != NULL && followupto[0] == '\0') {
  		printf("Your article is being posted to multiple newsgroups.\n");

--- 652,654 -----
  	}
! 	if (index(newsgroups, NGDELIM) != NULL && followto[0] == '\0') {
  		printf("Your article is being posted to multiple newsgroups.\n");
***************
*** 657,662
  		printf("(If responses should be mailed to you, enter \"poster\")\n");
! 		getpr("Followup-To: ", followupto);
! 		if (followupto[0] != '\0')
! 			modify_article(tempfname, "Followup-To: ", followupto,
! 				APPEND);
  	}

--- 657,662 -----
  		printf("(If responses should be mailed to you, enter \"poster\")\n");
! 		getpr("Followup-To: ", followto);
! 		if (followto[0] != '\0')
! 			modify_article(tempfname, "Followup-To: ", followto,
! 				REPLACE);
  	}
***************
*** 974,976
  		default:
! 			printf("Active file (%s) corrupted. ", ACTIVE);
  			byebye("Seek help!");

--- 974,976 -----
  		default:
! 			printf("Active file corrupt: %s", ng_read);
  			byebye("Seek help!");
Index: readnews.c
Prereq: 2.33
diff -c1 onews/readnews.c news/readnews.c
*** onews/readnews.c	Sun Oct 18 18:04:20 1987
--- news/readnews.c	Thu Sep  7 17:54:31 1989
***************
*** 5,7
  #ifdef SCCSID
! static char	*SccsId = "@(#)readnews.c	2.33	10/15/87";
  #endif /* SCCSID */

--- 5,7 -----
  #ifdef SCCSID
! static char	*SccsId = "@(#)readnews.c	2.34	9/7/89";
  #endif /* SCCSID */
***************
*** 126,128
  			if (++line > LINES)
! 				xerror("Too many options.");
  			if ((rcline[line] = malloc((unsigned)(strlen(ptr) + 1))) == NULL)

--- 126,128 -----
  			if (++line > LINES)
! 			   xerror("Too many options. Increase LINES in defs.h");
  			if ((rcline[line] = malloc((unsigned)(strlen(ptr) + 1))) == NULL)
***************
*** 170,172
  					if (++line > LINES)
! 						xerror("Too many options.");
  					if ((rcline[line] = malloc((unsigned)(strlen(ptr) + 1))) == NULL)

--- 170,172 -----
  					if (++line > LINES)
! 						xerror("Too many options. Increase LINES in defs.h");
  					if ((rcline[line] = malloc((unsigned)(strlen(ptr) + 1))) == NULL)
Index: recmail.c
Prereq: 1.18
diff -c1 onews/recmail.c news/recmail.c
*** onews/recmail.c	Tue Jan 17 13:09:30 1989
--- news/recmail.c	Tue Sep 12 16:58:15 1989
***************
*** 18,20
   * It is similar to sendmail -t, but only assumes /bin/mail.
!  * To use your own mailer, e. g. nmail, compile with -DMAILER=my_mailer.
   */

--- 18,20 -----
   * It is similar to sendmail -t, but only assumes /bin/mail.
!  * To use your own mailer, e. g. nmail, compile with -DMAILPROGRAM=my_mailer.
   */
***************
*** 22,24
  #ifdef SCCSID
! static char	*SccsId = "@(#)recmail.c	1.18	1/17/89";
  #endif /* SCCSID */

--- 22,24 -----
  #ifdef SCCSID
! static char	*SccsId = "@(#)recmail.c	1.19	9/12/89";
  #endif /* SCCSID */
***************
*** 27,30
  
! #ifndef MAILER
! #define MAILER "/bin/mail"
  #endif

--- 27,30 -----
  
! #ifndef MAILPROGRAM
! #define MAILPROGRAM "/bin/mail"
  #endif
***************
*** 30,32
  #endif
! char mailer[] = MAILER;
  

--- 30,32 -----
  #endif
! char mailer[] = MAILPROGRAM;
  
Index: rextern.c
Prereq: 2.17
diff -c1 onews/rextern.c news/rextern.c
*** onews/rextern.c	Fri Nov 21 16:04:49 1986
--- news/rextern.c	Tue Sep 12 16:58:15 1989
***************
*** 5,7
  #ifdef SCCSID
! static char	*SccsId = "@(#)rextern.c	2.17	11/21/86";
  #endif /* SCCSID */

--- 5,7 -----
  #ifdef SCCSID
! static char	*SccsId = "@(#)rextern.c	2.18	9/12/89";
  #endif /* SCCSID */
***************
*** 47,49
  
- #ifndef MAILER
  char	*MAILER;

--- 47,48 -----
  
  char	*MAILER;
***************
*** 49,52
  char	*MAILER;
- #endif
- 
  char	*PAGER = "";

--- 48,49 -----
  char	*MAILER;
  char	*PAGER = "";
Index: rfuncs.c
Prereq: 2.47
diff -c1 onews/rfuncs.c news/rfuncs.c
*** onews/rfuncs.c	Thu Jan 19 00:06:44 1989
--- news/rfuncs.c	Thu Sep  7 17:54:32 1989
***************
*** 18,20
  #ifdef SCCSID
! static char	*SccsId = "@(#)rfuncs.c	2.47	1/19/89";
  #endif /* SCCSID */

--- 18,20 -----
  #ifdef SCCSID
! static char	*SccsId = "@(#)rfuncs.c	2.49	9/7/89";
  #endif /* SCCSID */
***************
*** 421,423
  		if (++line > LINES)
! 			xerror("Too many newsgroups");
  		ptr[0] = oldptr;

--- 421,423 -----
  		if (++line > LINES)
! 			xerror("Too many newsgroups. Increase LINES in defs.h");
  		ptr[0] = oldptr;
***************
*** 654,656
  		    &tp->minart, &tp->yn) != 4) 
! 			xerror("Active file corrupt");
  		delta = tp->maxart - tp->minart;

--- 654,656 -----
  		    &tp->minart, &tp->yn) != 4) 
! 			xerror("Active file corrupt: %s", aline);
  		delta = tp->maxart - tp->minart;
Index: sendbatch.sh
Prereq: 1.20
diff -c1 onews/sendbatch.sh news/sendbatch.sh
*** onews/sendbatch.sh	Sun Jan 15 23:04:11 1989
--- news/sendbatch.sh	Fri Sep  1 18:23:33 1989
***************
*** 1,2
! : '@(#)sendbatch.sh	1.20	1/15/89'
  

--- 1,2 -----
! : '@(#)sendbatch.sh	1.21	9/1/89'
  
***************
*** 17,19
  
! for rmt in $*
  do

--- 17,19 -----
  
! for rmt
  do
***************
*** 61,62
  		continue;;
  	esac

--- 61,64 -----
  		continue;;
+ 	-f*)	MINDF=`expr "$rmt" : '-f\(.*\)'`
+ 		continue;;
  	esac
***************
*** 78,80
  
! 	if test -n "$MAXBATCH"
  	then

--- 80,82 -----
  
! 	if test -n "$MAXBATCH" -a -d /usr/spool/uucp/$rmt
  	then
***************
*** 106,108
  	sentbytes=0
! 	while test $? -eq 0 -a $sentbytes -le $MAXBATCH -a \
  		\( \( $sentbytes -eq 0 -a -s $BATCH/$rmt \) -o \

--- 108,110 -----
  	sentbytes=0
! 	while test $? -eq 0 -a $sentbytes -le "$MAXBATCH" -a \
  		\( \( $sentbytes -eq 0 -a -s $BATCH/$rmt \) -o \
Index: virtterm.c
Prereq: 1.15
diff -c1 onews/virtterm.c news/virtterm.c
*** onews/virtterm.c	Sun Jan 15 19:49:06 1989
--- news/virtterm.c	Fri Sep  1 18:23:35 1989
***************
*** 7,9
  #ifdef SCCSID
! static char	*SccsId = "@(#)virtterm.c	1.15	1/15/89";
  #endif /* SCCSID */

--- 7,9 -----
  #ifdef SCCSID
! static char	*SccsId = "@(#)virtterm.c	1.16	9/1/89";
  #endif /* SCCSID */
***************
*** 1003,1004
  		AM = XN = 1;
  	}

--- 1003,1025 -----
  		AM = XN = 1;
+ 	}
+ 	free((char *) _virt[0].l);
+ 	free((char *) _virt);
+ 	{
+ 		char *thelines;
+ 		int i;
+ 		char *malloc();
+ 
+ 		thelines = malloc(2 * ROWS * COLS);
+ 		_virt = (struct line *)malloc(2 * ROWS * sizeof (struct line));
+ 		_actual = _virt + ROWS;
+ 		for (i = 0; i < ROWS; i++) {
+ 			_virt[i].len = 0;
+ 			_virt[i].flags = 0;
+ 			_actual[i].len = 0;
+ 			_actual[i].flags = 0;
+ 			_virt[i].l = thelines;
+ 			thelines += COLS;
+ 			_actual[i].l = thelines;
+ 			thelines += COLS;
+ 		}
  	}
Index: visual.c
Prereq: 1.44
diff -c1 onews/visual.c news/visual.c
*** onews/visual.c	Sun Jan 22 22:18:19 1989
--- news/visual.c	Tue Sep 12 16:58:17 1989
***************
*** 6,8
  #ifdef SCCSID
! static char	*SccsId = "@(#)visual.c	1.44	1/22/89";
  #endif /* SCCSID */

--- 6,8 -----
  #ifdef SCCSID
! static char	*SccsId = "@(#)visual.c	1.46	9/12/89";
  #endif /* SCCSID */
***************
*** 170,171
  static FILE *fp;			/* current article to be printed*/
  

--- 170,172 -----
  static FILE *fp;			/* current article to be printed*/
+ static char savebuf[BUFLEN];
  
***************
*** 351,352
  	int i;
  	long nart, Hoffset;

--- 352,354 -----
  	int i;
+ 	int sawlong;
  	long nart, Hoffset;
***************
*** 520,522
  	{
- 		static char savebuf[BUFLEN];
  		int wflags;

--- 522,523 -----
  	{
  		int wflags;
***************
*** 762,763
  		(void) fseek(fp, 0L, 0);
  		for (i = 0; i < ARTWLEN; i++) {

--- 763,765 -----
  		(void) fseek(fp, 0L, 0);
+ 		sawlong = FALSE;
  		for (i = 0; i < ARTWLEN; i++) {
***************
*** 765,767
  				break;
! 			if (linebuf[0] == '\n')
  				break;

--- 767,769 -----
  				break;
! 			if (linebuf[0] == '\n' && !sawlong)
  				break;
***************
*** 767,768
  				break;
  			linebuf[COLS] = '\0';

--- 769,771 -----
  				break;
+ 			sawlong = index(linebuf, '\n') == NULL;
  			linebuf[COLS] = '\0';

-- 
Arnold Robbins -- The Basement Computer		| Laundry increases
Internet: arnold@skeeve.ATL.GA.US		| exponentially in the
UUCP:	{ gatech, gladys, emory }!skeeve!arnold | number of children.
Bitnet:	Forget it. Get on a real network.	|    -- Miriam Hartholz