DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download
Index: ┃ 2 T

⟦679e2a27b⟧ TextFile

    Length: 79915 (0x1382b)
    Types: TextFile
    Names: »2«

Derivation

└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
    └─ ⟦this⟧ »EUUGD11/euug-87hel/sec1/news/src/BUGS/2« 

TextFile


Description:
	This is patch #2 for the news 2.11 source distribution. It addresses
	the following problems:

	Many small changes were made to make lint happy (ok, happier).
	The code for HOMNAME is fixed (but still not documented).
	rmgroup.sh now works correctly under Eunice. It also is more efficient
	when removing lots of groups at a time.
	checkgroups no longer has the toplevel newsgroup names hard
	coded. It takes them from the input.
	More fixes to make the HIDDENNET code work they way it's supposed to.
	The rmgroup control message now works if you don't have MANUALLY
	defined.
	A memory allocation bug in expire was fixed.
	Distributions of "net" are now aliased into "world".
	New commands "l" and "L" were added to readnews/vnews. "l" list the
	from and subject lines of unread articles. "L" does it for all
	articles.
	"l" in vnews nolonger redraws the screen. Use "^L" instead.
	rnews -U no longer runs if the news system is locked.
	The NICENESS code now works as expected.
	Several incorrect uses of vfork were replaced with fork.
	The list of active groups and aliases were updated, so "make update"
	now prints more reasonable comments.
	ndir.c was fixed so it will run on an HP9000/500 if HP9K5 is defined.
	postnews is more rational about default posting distributions. The
	intuited distribution must be in LIBDIR/distributions or it will
	use "world". If the line "default foobar" appears in the distributions
	file, it will use foobar as the default distribution instead of world.
	virtterm now accepts line lengths >127 on machines with signed chars.
	The 's' command in vnews now remembers the last saved filename and
	prompts with it. You can edit the line with your erase/kill chars.
Fix:
	cd to the src directory and run the following through patch

Index: batch.c
Prereq: 1.17
*** .d/batch.c	Fri Nov 21 16:04:41 1986
--- batch.c	Tue Dec 16 13:09:52 1986
***************
*** 32,38 ****
   */
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)batch.c	1.17	11/21/86";
  #endif /* SCCSID */
  
  #include <stdio.h>
--- 32,38 ----
   */
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)batch.c	1.18	12/16/86";
  #endif /* SCCSID */
  
  #include <stdio.h>
***************
*** 184,190 ****
  	logtime[16] = 0;
  	logtime += 4;
  
! #ifdef IHCC
  	(void) sprintf(lfname, "%s/%s/errlog", logdir(HOME), LIBDIR);
  #else
  	(void) sprintf(lfname, "%s/errlog", LIBDIR);
--- 184,190 ----
  	logtime[16] = 0;
  	logtime += 4;
  
! #if defined(IHCC) || defined(HOME)
  	(void) sprintf(lfname, "%s/%s/errlog", logdir(HOME), LIBDIR);
  #else
  	(void) sprintf(lfname, "%s/errlog", LIBDIR);
Index: checkgroups.sh
Prereq: 1.19
*** .d/checkgroups.sh	Fri Nov 21 16:05:11 1986
--- checkgroups.sh	Tue Dec 16 13:09:53 1986
***************
*** 1,5 ****
  : check active file for missing or extra newsgroups
! : '@(#)checkgroups	1.19	11/21/86'
  
  if  test  ! -s LIBDIR/newsgroups
  then
--- 1,5 ----
  : check active file for missing or extra newsgroups
! : '@(#)checkgroups	1.20	12/16/86'
  
  if  test  ! -s LIBDIR/newsgroups
  then
***************
*** 19,29 ****
  	cat /tmp/$$a - > LIBDIR/newsgroups
  	;;
  *)
! 	group="^net\\.|^mod\\.|^comp\\.|^sci\\.|^rec\\.|^news\\.|^soc\\.|^misc\\.|^talk\\."
  	egrep -v "${group}" LIBDIR/newsgroups > /tmp/$$a
  	cat /tmp/$$a > LIBDIR/newsgroups
! 	echo "${line}" >> LIBDIR/newsgroups
! 	cat >> LIBDIR/newsgroups
  	;;
  esac
  
--- 19,44 ----
  	cat /tmp/$$a - > LIBDIR/newsgroups
  	;;
  *)
! 	# Get the distributions from the checkgroups message itself
! 	# This allows sites to append their local groups to the distributed
! 	# checkgroups message and prevents stray checkgroups from other sites
! 	# from showing all the local groups as being bad groups.
! 	#
! 	echo "${line}" > /tmp/$$msg
! 	cat >> /tmp/$$msg
! 	cp /dev/null /tmp/$$b
! 	cat /tmp/$$msg | sed -e "s;[ 	].*;;" -e "s;\..*;;" | sort -u |
! 		while read dist
! 		do
! 			group=`cat /tmp/$$b`
! 			group="${group}|^$dist\\."
! 			echo "${group}" > /tmp/$$b
! 		done
! 	group=`cat /tmp/$$b`
  	egrep -v "${group}" LIBDIR/newsgroups > /tmp/$$a
  	cat /tmp/$$a > LIBDIR/newsgroups
! 	cat /tmp/$$msg >> LIBDIR/newsgroups
! 	rm -f /tmp/$$b /tmp/$$msg
  	;;
  esac
  
Index: checknews.c
Prereq: 2.26
*** .d/checknews.c	Fri Nov 21 16:04:45 1986
--- checknews.c	Tue Dec 16 13:09:54 1986
***************
*** 16,22 ****
   */
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)checknews.c	2.26	11/21/86";
  #endif /* SCCSID */
  
  char *Progname = "checknews";		/* used by xerror */
--- 16,22 ----
   */
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)checknews.c	2.27	12/16/86";
  #endif /* SCCSID */
  
  char *Progname = "checknews";		/* used by xerror */
***************
*** 25,31 ****
  
  char	bfr[LBUFLEN];			/* general-use scratch area	*/
  char	optbuf[BUFLEN];			/* NEWSOPTS buffer		*/
! int	line = -1, y, e, n, q;
  int	verbose;			/* For debugging.		*/
  int	nflag;				/* for spec. newsgroup		*/
  char	narggrp[BUFLEN];		/* spec newsgroup		*/
--- 25,31 ----
  
  char	bfr[LBUFLEN];			/* general-use scratch area	*/
  char	optbuf[BUFLEN];			/* NEWSOPTS buffer		*/
! int	y, e, n, q;
  int	verbose;			/* For debugging.		*/
  int	nflag;				/* for spec. newsgroup		*/
  char	narggrp[BUFLEN];		/* spec newsgroup		*/
***************
*** 32,37 ****
--- 32,38 ----
  FILE	*rcfp, *actfp;
  char	newsrc[BUFLEN],*rcline[LINES],rcbuf[LBUFLEN],*argvrc[LINES];
  int	mode = 1;
+ extern int line;
  #ifndef SHELL
  char	*SHELL;
  #endif

Index: compress.c
Prereq: 1.12
*** .d/compress.c	Thu Oct 30 16:08:25 1986
--- compress.c	Tue Dec 16 13:09:57 1986
***************
*** 1,6 ****
  #ifdef SCCSID
! static char	*SccsId = "@(#)compress.c	1.12	10/29/86";
! #endif SCCSID
  static char rcs_ident[] = "Based on compress.c,v 4.0 85/07/30 12:50:00 joe Release";
  
  /* 
--- 1,6 ----
  #ifdef SCCSID
! static char	*SccsId = "@(#)compress.c	1.13	12/16/86";
! #endif /* SCCSID */
  static char rcs_ident[] = "Based on compress.c,v 4.0 85/07/30 12:50:00 joe Release";
  
  /* 

Index: control.c
Prereq: 2.48
*** .d/control.c	Fri Nov 21 16:04:47 1986
--- control.c	Tue Dec 16 13:10:00 1986
***************
*** 19,25 ****
   */
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)control.c	2.48	11/21/86";
  #endif /* SCCSID */
  
  #include "iparams.h"
--- 19,25 ----
   */
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)control.c	2.49	12/16/86";
  #endif /* SCCSID */
  
  #include "iparams.h"
***************
*** 95,104 ****
  #ifdef NOTIFY
  			TELLME = mp->m_who_to;	/* reset whom to tell */
  #endif /* NOTIFY */
! 			if(strcmp(mp->m_name, "cancel") == 0) /* special case */
! 				return (*mp->m_func)(cargc, cargv);
! 			(*mp->m_func)(cargc, cargv); /* do the function */
! 			break;
  		}
  	}
  	if( !mp->m_name ) {
--- 95,101 ----
  #ifdef NOTIFY
  			TELLME = mp->m_who_to;	/* reset whom to tell */
  #endif /* NOTIFY */
! 			return (*mp->m_func)(cargc, cargv); /* do it */
  		}
  	}
  	if( !mp->m_name ) {
***************
*** 168,174 ****
  	if (argc < 2)
  		error("ihave: Too few arguments.");
  	if (strncmp(FULLSYSNAME, argv[argc - 1], SNLN) == 0)
! 		return;
  	list[0] = '\0';
  	if (argc > 2) {
  		for (i = 1; i < (argc - 1); ++i)
--- 165,171 ----
  	if (argc < 2)
  		error("ihave: Too few arguments.");
  	if (strncmp(FULLSYSNAME, argv[argc - 1], SNLN) == 0)
! 		return 0;
  	list[0] = '\0';
  	if (argc > 2) {
  		for (i = 1; i < (argc - 1); ++i)
***************
*** 177,183 ****
  				(void) strcat(list, argv[i]);
  			}
  		if (list[0] == '\0')
! 			return;
  	} else {
  		register FILE *	outfp;
  		register long	outpos, inpos;
--- 174,180 ----
  				(void) strcat(list, argv[i]);
  			}
  		if (list[0] == '\0')
! 			return 0;
  	} else {
  		register FILE *	outfp;
  		register long	outpos, inpos;
***************
*** 196,202 ****
  		if (outpos == ftell(outfp)) {	/* if nothing is wanted */
  			(void) fclose(outfp);
  			(void) fseek(infp, inpos, 0);
! 			return;
  		}
  		(void) fclose(outfp);
  		/*
--- 193,199 ----
  		if (outpos == ftell(outfp)) {	/* if nothing is wanted */
  			(void) fclose(outfp);
  			(void) fseek(infp, inpos, 0);
! 			return 0;
  		}
  		(void) fclose(outfp);
  		/*
***************
*** 230,235 ****
--- 227,233 ----
  	** Note that we do *not* change the history line
  	** so that if the "ihave" message comes in again it gets rejected.
  	*/
+ 	return 0;
  }
  
  /*
***************
*** 241,247 ****
   * Give it to them with no fuss.
   */
  c_sendme(argc, argv)
! register char **	argv;
  {
  	struct srec	srec;
  
--- 239,245 ----
   * Give it to them with no fuss.
   */
  c_sendme(argc, argv)
! register char **argv;
  {
  	struct srec	srec;
  
***************
*** 248,254 ****
  	if (argc < 2)
  		error("sendme: Too few arguments.");
  	if (strncmp(FULLSYSNAME, argv[argc - 1], SNLN) == 0)
! 		return;
  	if (s_find(&srec, argv[argc - 1]) != TRUE)
  		error("sendme: Can't find sys record for %s", argv[argc - 1]);
  	/* Send the articles. */
--- 246,252 ----
  	if (argc < 2)
  		error("sendme: Too few arguments.");
  	if (strncmp(FULLSYSNAME, argv[argc - 1], SNLN) == 0)
! 		return 0;
  	if (s_find(&srec, argv[argc - 1]) != TRUE)
  		error("sendme: Can't find sys record for %s", argv[argc - 1]);
  	/* Send the articles. */
***************
*** 268,273 ****
--- 266,272 ----
  		for (i = 1; i < (argc - 1); ++i)
  			sendmefunc(argv[i], &srec);
  	}
+ 	return 0;
  }
  
  static
***************
*** 331,338 ****
  	if (argc < 2)
  		error("newgroup: Too few arguments.");
  
! 	if (header.approved[0] == '\0')
! 		error("newgroup: %s not approved", argv[1]);
  
  	/* see if it already exists */
  	(void) rewind(actfp); clearerr(actfp);
--- 330,339 ----
  	if (argc < 2)
  		error("newgroup: Too few arguments.");
  
! 	if (header.approved[0] == '\0') {
! 		logerr("newgroup: %s not approved", argv[1]);
! 		return 1;
! 	}
  
  	/* see if it already exists */
  	(void) rewind(actfp); clearerr(actfp);
***************
*** 349,355 ****
  			p -= 3;
  			if (argc > 2 && strcmp(argv[2], "moderated") == 0) {
  				if (*p == 'm')
! 					return;
  # ifdef NONEWGROUPS
  				if(can_change) {
  					*p = 'm';
--- 350,356 ----
  			p -= 3;
  			if (argc > 2 && strcmp(argv[2], "moderated") == 0) {
  				if (*p == 'm')
! 					return 0;
  # ifdef NONEWGROUPS
  				if(can_change) {
  					*p = 'm';
***************
*** 361,367 ****
  #endif /* NONEWGROUPS */
  			} else {
  				if (*p != 'm')
! 					return;
  # ifdef NONEWGROUPS
  				if(can_change)  {
  					*p = 'y';
--- 362,368 ----
  #endif /* NONEWGROUPS */
  			} else {
  				if (*p != 'm')
! 					return 0;
  # ifdef NONEWGROUPS
  				if(can_change)  {
  					*p = 'y';
***************
*** 413,419 ****
  			 * No permission to change
  			 */
  			if(!can_change)
! 				return;
  # endif /* NONEWGROUPS */
  			/* The active file was wrong about the state of the
  			 * group. Rewrite the active file
--- 414,420 ----
  			 * No permission to change
  			 */
  			if(!can_change)
! 				return 0;
  # endif /* NONEWGROUPS */
  			/* The active file was wrong about the state of the
  			 * group. Rewrite the active file
***************
*** 427,433 ****
  			else
  				logerr("Newsgroup %s changed from unmoderated to moderated",
  				argv[1]);
! 			return;
  		}
  	}
  
--- 428,434 ----
  			else
  				logerr("Newsgroup %s changed from unmoderated to moderated",
  				argv[1]);
! 			return 0;
  		}
  	}
  
***************
*** 439,445 ****
  		fprintf(actfp, "%s 00000 00001 %c\n", argv[1],
  			(argc > 2 && strcmp(argv[2], "moderated") == 0) 
  				? 'm' : 'y');
! #ifdef USG
  		/*
  		 * U G L Y   K L U D G E
  		 * This utter piece of tripe is the only way I know of
--- 440,446 ----
  		fprintf(actfp, "%s 00000 00001 %c\n", argv[1],
  			(argc > 2 && strcmp(argv[2], "moderated") == 0) 
  				? 'm' : 'y');
! #if defined(USG) || defined(MG1)
  		/*
  		 * U G L Y   K L U D G E
  		 * This utter piece of tripe is the only way I know of
***************
*** 449,454 ****
--- 450,456 ----
  		 * on all "real" USG Unix systems, It will probably
  		 * break on some obscure look alike that doesnt use the
  		 * real ATT stdio.h
+ 		 * also broken in WCW MG-1 42nix 2.0
  		 * Don't blame me, blame ATT. stdio should have
  		 * already done the following line for us, but it didn't
  		 */
***************
*** 487,492 ****
--- 489,495 ----
  		(void) mclose(fd);
  	}
  # endif /* NOTIFY */
+ 	return 0;
  }
  
  /*
***************
*** 505,515 ****
  	if (argc < 2)
  		error("rmgroup: Too few arguments.");
  	if (!validng(argv[1]))
! 		return;
! 	if (header.approved[0] == '\0')
! 		error("rmgroup: %s not approved", argv[1]);
  
! #ifndef MANUALLY
  #ifdef ORGDISTRIB
  	/*
  	 * Allow local as well as organizational removals
--- 508,520 ----
  	if (argc < 2)
  		error("rmgroup: Too few arguments.");
  	if (!validng(argv[1]))
! 		return 0;
! 	if (header.approved[0] == '\0') {
! 		logerr("rmgroup: %s not approved", argv[1]);
! 		return 1;
! 	}
  
! #ifdef MANUALLY
  #ifdef ORGDISTRIB
  	/*
  	 * Allow local as well as organizational removals
***************
*** 519,528 ****
  #else	/* !ORGDISTRIB */		
  	if (!strcmp("local", header.distribution))
  #endif	/* !ORGDISTRIB */		
  		shouldremove++;
- #endif /* !MANUALLY */
  #ifdef NOTIFY
! 	sprintf(subjline, "Recevied rmgroup for %s", argv[1]);
  	fd = mailhdr((struct hbuf *)NULL, subjline);
  	if (fd != NULL) {
  		if (shouldremove) {
--- 524,533 ----
  #else	/* !ORGDISTRIB */		
  	if (!strcmp("local", header.distribution))
  #endif	/* !ORGDISTRIB */		
+ #endif /* MANUALLY */
  		shouldremove++;
  #ifdef NOTIFY
! 	sprintf(subjline, "Received rmgroup for %s", argv[1]);
  	fd = mailhdr((struct hbuf *)NULL, subjline);
  	if (fd != NULL) {
  		if (shouldremove) {
***************
*** 552,557 ****
--- 557,563 ----
  		rc = system(bfr);
  		log("system(%s) status %d", bfr, rc);
  	}
+ 	return 0;
  }
  
  /*
***************
*** 685,690 ****
--- 691,697 ----
  		(void) fclose(u);
  		(void) mclose(f);
  	}
+ 	return 0;
  }
  
  /*
***************
*** 733,738 ****
--- 740,746 ----
  		(void) pclose(u);
  		(void) mclose(fd);
  	}
+ 	return 0;
  }
  
  /*
***************
*** 751,756 ****
--- 759,765 ----
  	fprintf(f, "The header of your message follows:\n\n");
  	(void) hwrite(&header, f);
  	(void) mclose(f);
+ 	return 0;
  }
  
  /*
***************
*** 773,778 ****
--- 782,788 ----
  #endif /* !NOTIFY */
  	rc = system(bfr);
  	log("system(%s) status %d", bfr, rc);
+ 	return 0;
  }
  
  /*
***************
*** 794,799 ****
--- 804,810 ----
  		(void) mclose(f);
  	}
  #endif /* NOTIFY */
+ 	return 0;
  }
  
  /* ARGSUSED */
***************
*** 811,816 ****
--- 822,828 ----
  		(void) mclose(f);
  	}
  #endif /* NOTIFY */
+ 	return 0;
  }
  
  /*

Index: expire.c
Prereq: 2.48
*** .d/expire.c	Fri Nov 21 16:04:48 1986
--- expire.c	Tue Dec 16 13:10:01 1986
***************
*** 17,23 ****
   */
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)expire.c	2.48	11/21/86";
  #endif /* SCCSID */
  
  #include "params.h"
--- 17,23 ----
   */
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)expire.c	2.49	12/16/86";
  #endif /* SCCSID */
  
  #include "params.h"
***************
*** 491,499 ****
  			goto checkdate;
  		}
  		for(i=0; i<NUNREC; i++)
! 			if (h.unrec[i] != NULL)
  				free(h.unrec[i]);
! 			else
  				break;
  		if (!hread(&h, fp, TRUE)) {
  			printf("Garbled article %s.\n", filename);
--- 491,500 ----
  			goto checkdate;
  		}
  		for(i=0; i<NUNREC; i++)
! 			if (h.unrec[i] != NULL) {
  				free(h.unrec[i]);
! 				h.unrec[i] = NULL;
! 			} else
  				break;
  		if (!hread(&h, fp, TRUE)) {
  			printf("Garbled article %s.\n", filename);

Index: funcs.c
Prereq: 2.34
*** .d/funcs.c	Fri Nov 21 16:04:55 1986
--- funcs.c	Tue Dec 16 13:10:02 1986
***************
*** 16,22 ****
   */
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)funcs.c	2.34	11/21/86";
  #endif /* SCCSID */
  
  /*LINTLIBRARY*/
--- 16,22 ----
   */
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)funcs.c	2.35	12/16/86";
  #endif /* SCCSID */
  
  /*LINTLIBRARY*/
***************
*** 584,590 ****
  	 */
  
  	(void) strncpy(facgroups, FASCIST, BUFLEN);
! 	sprintf(factemp, "%s/%s", LIBDIR, "authorized");
  	facfd = fopen(factemp, "r");
  
  	if (facfd != NULL) { /* If no such file, we go with the global default */
--- 584,590 ----
  	 */
  
  	(void) strncpy(facgroups, FASCIST, BUFLEN);
! 	sprintf(factemp, "%s/%s", LIB, "authorized");
  	facfd = fopen(factemp, "r");
  
  	if (facfd != NULL) { /* If no such file, we go with the global default */
***************
*** 599,605 ****
  #ifdef DEBUG
  	fprintf(stderr, "facgroups = %s\n", facgroups);
  	fprintf(stderr, "newsgroups = %s\n", newsgroups);
! #endif DEBUG
  
  	/* We step through the newsgroups being posted to and check each against
  	 * the restriction list.  *ALL* posted groups must match the restriction
--- 599,605 ----
  #ifdef DEBUG
  	fprintf(stderr, "facgroups = %s\n", facgroups);
  	fprintf(stderr, "newsgroups = %s\n", newsgroups);
! #endif /* DEBUG */
  
  	/* We step through the newsgroups being posted to and check each against
  	 * the restriction list.  *ALL* posted groups must match the restriction
***************
*** 625,631 ****
  	/* must be okay -- return */
  #ifdef DEBUG
  	fprintf (stderr, "Newsgroups approved for this poster.\n");
! #endif DEBUG
  	return FALSE;
  }
! #endif FASCIST
--- 625,631 ----
  	/* must be okay -- return */
  #ifdef DEBUG
  	fprintf (stderr, "Newsgroups approved for this poster.\n");
! #endif /* DEBUG */
  	return FALSE;
  }
! #endif /* FASCIST */

Index: funcs2.c
Prereq: 1.16
*** .d/funcs2.c	Thu Oct 30 16:10:57 1986
--- funcs2.c	Tue Dec 16 13:10:03 1986
***************
*** 17,23 ****
   */
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)funcs2.c	1.16	10/23/86";
  #endif /* SCCSID */
  
  #include "params.h"
--- 17,23 ----
   */
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)funcs2.c	1.17	12/16/86";
  #endif /* SCCSID */
  
  #include "params.h"
***************
*** 384,395 ****
  	char mbuf[BUFLEN], modadd[BUFLEN];
  	FILE *mfd;
  	/* Let's find a path to the backbone */
! 	sprintf(mbuf, "%s/mailpaths", LIBDIR);
  	mfd = xfopen(mbuf, "r");
  	do {
  		if (fgets(mbuf, sizeof mbuf, mfd) == NULL)
  			xerror("Can't find internet in %s/mailpaths",
! 				LIBDIR);
  	} while (!prefix(mbuf, "internet"));
  	if (sscanf(mbuf, "%*s %s", modadd) != 1)
  		xerror("backbone address corrupted");
--- 384,395 ----
  	char mbuf[BUFLEN], modadd[BUFLEN];
  	FILE *mfd;
  	/* Let's find a path to the backbone */
! 	sprintf(mbuf, "%s/mailpaths", LIB);
  	mfd = xfopen(mbuf, "r");
  	do {
  		if (fgets(mbuf, sizeof mbuf, mfd) == NULL)
  			xerror("Can't find internet in %s/mailpaths",
! 				LIB);
  	} while (!prefix(mbuf, "internet"));
  	if (sscanf(mbuf, "%*s %s", modadd) != 1)
  		xerror("backbone address corrupted");

Index: getdate.y
Prereq: 2.14
*** .d/getdate.y	Fri Nov 21 16:05:02 1986
--- getdate.y	Tue Dec 16 13:10:04 1986
***************
*** 3,9 ****
  	/* 	Originally from: Steven M. Bellovin (unc!smb)	*/ 
  	/*	Dept. of Computer Science			*/
  	/*	University of North Carolina at Chapel Hill	*/
! 	/*	@(#)getdate.y	2.14	11/21/86	*/
  
  #include <sys/types.h>
  #ifdef USG
--- 3,9 ----
  	/* 	Originally from: Steven M. Bellovin (unc!smb)	*/ 
  	/*	Dept. of Computer Science			*/
  	/*	University of North Carolina at Chapel Hill	*/
! 	/*	@(#)getdate.y	2.15	12/16/86	*/
  
  #include <sys/types.h>
  #ifdef USG
***************
*** 22,30 ****
  #include "defs.h"
  #if defined(BSD4_2) || defined (BSD4_1C)
  #include <sys/time.h>
! #else sane
  #include <time.h>
! #endif sane
  
  #define	NULL	0
  #define daysec (24L*60L*60L)
--- 22,30 ----
  #include "defs.h"
  #if defined(BSD4_2) || defined (BSD4_1C)
  #include <sys/time.h>
! #else /* sane */
  #include <time.h>
! #endif /* sane */
  
  #define	NULL	0
  #define daysec (24L*60L*60L)

Index: help
*** .d/help	Thu Oct 30 16:12:10 1986
--- help	Tue Dec 16 13:10:06 1986
***************
*** 20,24 ****
  K		Mark the rest of the articles in current group as read.
  x		Exit.  Don't update .newsrc.
  v		Version.  Print current news version number.
! 
  c, f, r, e, h, and s can be followed by -'s to refer to the previous article
--- 20,25 ----
  K		Mark the rest of the articles in current group as read.
  x		Exit.  Don't update .newsrc.
  v		Version.  Print current news version number.
! l		List unread articles in newsgroup.
! L		List all articles in newsgroup.
  c, f, r, e, h, and s can be followed by -'s to refer to the previous article

Index: ifuncs.c
Prereq: 2.58
*** .d/ifuncs.c	Fri Nov 21 16:04:00 1986
--- ifuncs.c	Tue Dec 16 13:10:07 1986
***************
*** 16,22 ****
   */
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)ifuncs.c	2.58	11/21/86";
  #endif /* SCCSID */
  
  #include "iparams.h"
--- 16,22 ----
   */
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)ifuncs.c	2.59	12/16/86";
  #endif /* SCCSID */
  
  #include "iparams.h"
***************
*** 62,68 ****
  extern char firstbufname[];
  #endif
  
! broadcast()
  {
  	register char *hptr;
  	register char *sptr;
--- 62,69 ----
  extern char firstbufname[];
  #endif
  
! broadcast(is_rnews)
! int is_rnews;
  {
  	register char *hptr;
  	register char *sptr;
***************
*** 73,78 ****
--- 74,82 ----
  	char sentbuf[LBUFLEN];
  	int nsent = 0;
  	char *sentsys;
+ #ifdef HIDDENNET
+ 	int len;
+ #endif /* HIDDENNET */
  
  	/* h is a local copy of the header we can scribble on */
  #ifdef VMS
***************
*** 86,94 ****
  
  	(void) strcpy(sentbuf, h.ident);
  	(void) strcat(sentbuf, " sent to ");
! 	sentsys = index(sentbuf, 0);
  	nsent = 0;
  	/* break path into list of systems. */
  	sptr = hptr = h.path;
  	while ((hptr=strpbrk(hptr, NETCHRS)) != NULL) {
  		*hptr++ = '\0';
--- 90,105 ----
  
  	(void) strcpy(sentbuf, h.ident);
  	(void) strcat(sentbuf, " sent to ");
! 	sentsys = index(sentbuf, '\0');
  	nsent = 0;
  	/* break path into list of systems. */
+ 	hptr = h.path;
+ #ifdef HIDDENNET
+ 	if (!is_rnews && 
+ 		strncmp(FULLSYSNAME, h.path, (len = strlen(FULLSYSNAME))) == 0
+ 		&& index(NETCHRS, h.path[len]))
+ 		(void) strcpy(h.path, &(h.path[len+1]));
+ #endif HIDDENNET
  	sptr = hptr = h.path;
  	while ((hptr=strpbrk(hptr, NETCHRS)) != NULL) {
  		*hptr++ = '\0';

Index: inews.c
Prereq: 2.70
*** .d/inews.c	Fri Nov 21 16:04:44 1986
--- inews.c	Tue Dec 16 13:10:09 1986
***************
*** 17,23 ****
   */
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)inews.c	2.70	11/21/86";
  #endif /* SCCSID */
  
  #include "iparams.h"
--- 17,23 ----
   */
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)inews.c	2.71	12/16/86";
  #endif /* SCCSID */
  
  #include "iparams.h"
***************
*** 131,137 ****
  	if (flock(fileno(actfp), LOCK_SH|LOCK_NB) < 0 && errno == EWOULDBLOCK)
  #else	/* !BSD4_2 */
  #ifdef	LOCKF
! 	if (lockf(fileno(actfp), F_TLOCK, 0) < 0 && errno == EAGAIN)
  #else	/* !LOCKF */
  	sprintf(bfr, "%s.lock", ACTIVE);
  	if (LINK(ACTIVE,bfr) < 0 && errno == EEXIST)
--- 131,138 ----
  	if (flock(fileno(actfp), LOCK_SH|LOCK_NB) < 0 && errno == EWOULDBLOCK)
  #else	/* !BSD4_2 */
  #ifdef	LOCKF
! 	if (lockf(fileno(actfp), F_TLOCK, 0) < 0 &&
! 		(errno == EAGAIN || errno == EACCES))
  #else	/* !LOCKF */
  	sprintf(bfr, "%s.lock", ACTIVE);
  	if (LINK(ACTIVE,bfr) < 0 && errno == EEXIST)
***************
*** 152,157 ****
--- 153,160 ----
  #endif	/* !BSD4_2 && !LOCKF */
  	}
  	if (argc > 1 && !strcmp(*(argv+1), "-U")) {
+ 		if (spool_news)	/* can't unspool while things are locked */
+ 			xxit(0);
  		dounspool();
  		/* NOT REACHED */
  	}
***************
*** 163,169 ****
  			/* NOT REACHED */
  		}
  #ifdef NICENESS
! 		nice(NICENESS);
  #endif /* NICENESS */
  	} else
  		if (argc < 2)
--- 166,173 ----
  			/* NOT REACHED */
  		}
  #ifdef NICENESS
! 		if (nice(0) < NICENESS)
! 			(void) nice(NICENESS);
  #endif /* NICENESS */
  	} else
  		if (argc < 2)
***************
*** 504,510 ****
  	(void) sprintf(buf, "%s/.rnews/%02d%02d%02d%02d%02d%x",
  #endif /* V7 */
  #endif /* VMS */
! 		SPOOLDIR,
  		tp->tm_year, tp->tm_mon+1, tp->tm_mday,
  		tp->tm_hour, tp->tm_min, getpid());
  	sp = xfopen(buf, "w");
--- 508,514 ----
  	(void) sprintf(buf, "%s/.rnews/%02d%02d%02d%02d%02d%x",
  #endif /* V7 */
  #endif /* VMS */
! 		SPOOL,
  		tp->tm_year, tp->tm_mon+1, tp->tm_mday,
  		tp->tm_hour, tp->tm_min, getpid());
  	sp = xfopen(buf, "w");
***************
*** 653,659 ****
  	 * This will overflow with 99999 articles.
  	 */
  	fprintf(actfp, "%s %05ld", ngname, ngsize+1);
! #ifdef USG
  	/*
  	 * U G L Y   K L U D G E
  	 * This utter piece of tripe is the only way I know of to get
--- 657,663 ----
  	 * This will overflow with 99999 articles.
  	 */
  	fprintf(actfp, "%s %05ld", ngname, ngsize+1);
! #if defined(USG) || defined(MG1)
  	/*
  	 * U G L Y   K L U D G E
  	 * This utter piece of tripe is the only way I know of to get
***************
*** 664,669 ****
--- 668,674 ----
  	 * real ATT stdio.h
  	 * Don't blame me, blame ATT. stdio should have already done the
  	 * following line for us, but it doesn't
+ 	 * also broken in WCW MG-1 42nix 2.0
  	 */
  	 actfp->_flag |= _IOWRT;
  #endif /* USG */
***************
*** 726,732 ****
  	}
  
  #ifdef ZAPNOTES
! 	if (strcmp(header.title, "Re: Orphaned Response") == 0) {
  		logerr("Orphaned Response, moved to junk");
  		if (localize("junk"))
  			savehist(histline);
--- 731,737 ----
  	}
  
  #ifdef ZAPNOTES
! 	if (strncmp(header.title, "Re: Orphaned Response", 21) == 0) {
  		logerr("Orphaned Response, moved to junk");
  		if (localize("junk"))
  			savehist(histline);
***************
*** 763,774 ****
  		fprintf(stderr," directly.\nYour article is being mailed to");
  		fprintf(stderr," the moderator who will post it for you.\n");
  		/* Let's find a path to the backbone */
! 		sprintf(bfr, "%s/mailpaths", LIBDIR);
  		mfd = xfopen(bfr, "r");
  		do {
  			if (fscanf(mfd, "%s %s", bfr, modadd) != 2)
  				xerror("Can't find backbone in %s/mailpaths",
! 					LIBDIR);
  		} while (strcmp(bfr, "backbone") != 0 && !ngmatch(is_mod, bfr));
  		(void) fclose(mfd);
  		/* fake a header for mailhdr */
--- 768,779 ----
  		fprintf(stderr," directly.\nYour article is being mailed to");
  		fprintf(stderr," the moderator who will post it for you.\n");
  		/* Let's find a path to the backbone */
! 		sprintf(bfr, "%s/mailpaths", LIB);
  		mfd = xfopen(bfr, "r");
  		do {
  			if (fscanf(mfd, "%s %s", bfr, modadd) != 2)
  				xerror("Can't find backbone in %s/mailpaths",
! 					LIB);
  		} while (strcmp(bfr, "backbone") != 0 && !ngmatch(is_mod, bfr));
  		(void) fclose(mfd);
  		/* fake a header for mailhdr */
***************
*** 866,883 ****
  	(void) fclose(tfp);
  	(void) fclose(infp);
  	if(exitcode == 0) {
- 		int pid;
  		/* article has passed all the checks, so work in background */
! 		if (mode != PROC)
! 			if ((pid=vfork()) < 0)
  				xerror("Can't fork");
  			else if (pid > 0)
  				exit(0);
  #ifdef SIGTTOU
  		signal(SIGTTOU, SIG_IGN);
  #endif /* SIGTTOU */
  		savehist(histline);
! 		broadcast();
  	}
  	xxit(mode == PROC ? 0 : exitcode);
  }
--- 871,889 ----
  	(void) fclose(tfp);
  	(void) fclose(infp);
  	if(exitcode == 0) {
  		/* article has passed all the checks, so work in background */
! 		if (mode != PROC) {
! 			int pid;
! 			if ((pid=fork()) < 0)
  				xerror("Can't fork");
  			else if (pid > 0)
  				exit(0);
+ 		}
  #ifdef SIGTTOU
  		signal(SIGTTOU, SIG_IGN);
  #endif /* SIGTTOU */
  		savehist(histline);
! 		broadcast(mode==PROC);
  	}
  	xxit(mode == PROC ? 0 : exitcode);
  }
***************
*** 1099,1107 ****
  	register struct direct *dir;
  	register int foundsome;
  #ifdef VMS
! 	sprintf(bfr, "%s/+rnews", SPOOLDIR);
  #else /* !VMS */
! 	sprintf(bfr, "%s/.rnews", SPOOLDIR);
  #endif /* !VMS */
  
  	if (chdir(bfr) < 0)
--- 1105,1113 ----
  	register struct direct *dir;
  	register int foundsome;
  #ifdef VMS
! 	sprintf(bfr, "%s/+rnews", SPOOL);
  #else /* !VMS */
! 	sprintf(bfr, "%s/.rnews", SPOOL);
  #endif /* !VMS */
  
  	if (chdir(bfr) < 0)
***************
*** 1117,1123 ****
  			if (dir->d_name[0] == '.')
  				continue;
  			sprintf(bfr,"%s -S -p %s", RNEWS, dir->d_name);
! 			system(bfr);
  			(void) unlink(dir->d_name);
  			foundsome++;
  		}
--- 1123,1134 ----
  			if (dir->d_name[0] == '.')
  				continue;
  			sprintf(bfr,"%s -S -p %s", RNEWS, dir->d_name);
! 			if (system(bfr) != 0) {
! 				sprintf(bfr, "../%s", dir->d_name);
! 				(void) LINK(dir->d_name, bfr);
! 				logerr("rnews failed. Batch saved in %s/%s",
! 					SPOOLDIR, dir->d_name);
! 			}
  			(void) unlink(dir->d_name);
  			foundsome++;
  		}

Index: install.sh
Prereq: 1.16
*** .d/install.sh	Thu Oct 30 16:16:49 1986
--- install.sh	Tue Dec 16 13:10:09 1986
***************
*** 1,4 ****
! : '@(#)install.sh	1.16	10/29/86'
  
  if test "$#" != 6
  then
--- 1,4 ----
! : '@(#)install.sh	1.17	12/16/86'
  
  if test "$#" != 6
  then
***************
*** 110,128 ****
  fi
  
  cat >$LIBDIR/aliases.new <<EOF
! net.chess		net.games.chess
! net.trivia		net.games.trivia
! net.rec.radio		net.ham-radio
! net.term		net.info-terms
! net.joke		net.jokes
! net.vlsi		net.lsi
! net.micro.16k		net.micro.ns32k
! net.music.gdea		net.music.gdead
! net.notes		net.news.notes
! net.periph		net.periphs
! net.puzzles		net.puzzle
! net.unix.wizards	net.unix-wizards
! net.sources.wanted	net.wanted.sources
  net.consumers		misc.consumers
  net.consumers.house	misc.consumers.house
  net.house		misc.consumers.house
--- 110,258 ----
  fi
  
  cat >$LIBDIR/aliases.new <<EOF
! net.audio	rec.audio
! net.auto	rec.autos
! net.auto.tech	rec.autos.tech
! net.aviation	rec.aviation
! net.bicycle	rec.bicycles
! net.rec.birds	rec.birds
! net.rec.boat	rec.boats
! net.cooks	rec.food.cooking
! net.wines	rec.food.drink
! net.veg		rec.food.veg
! net.games	rec.games.misc
! net.games.board	rec.games.board
! net.rec.bridge	rec.games.bridge
! net.games.chess	rec.games.chess
! net.games.emp	rec.games.empire
! net.games.frp	rec.games.frp
! net.games.go	rec.games.go
! net.games.hack	rec.games.hack
! net.games.pbm	rec.games.pbm
! net.games.rogue	rec.games.rogue
! net.games.trivia	rec.games.trivia
! net.games.video	rec.games.video
! net.garden	rec.gardens
! net.ham-radio	 rec.ham-radio
! net.ham-radio.packet rec.ham-radio.packet
! net.jokes	rec.humor
! net.jokes.d	rec.humor.d
! mod.mag		rec.mag
! net.mag		rec.mag
! net.books	rec.arts.books
! net.comics	rec.arts.comics
! net.tv.drwho	rec.arts.drwho
! mod.movies	rec.arts.movies
! net.movies	rec.arts.movies
! net.sf-lovers	rec.arts.sf-lovers
! net.startrek	rec.arts.startrek
! net.tv		rec.arts.tv
! net.tv.soaps	rec.arts.tv.soaps
! net.wobegon	rec.arts.wobegon
! net.rec		rec.misc
! net.cycle	rec.motorcycles
! net.music.classical	rec.music.classical
! net.music.folk	rec.music.folk
! net.music.gdead	rec.music.gdead
! net.music.makers	rec.music.makers
! net.music	rec.music.misc
! net.music.synth	rec.music.synth
! net.rec.nude	rec.nude
! net.pets	rec.pets
! net.rec.photo	rec.photo
! net.poems	rec.arts.poems
! net.puzzle	rec.puzzles
! net.railroad	rec.railroad
! net.rec.scuba	rec.scuba
! net.rec.ski	rec.skiing
! net.rec.skydive	rec.skydiving
! net.sport	rec.sport.misc
! net.sport.baseball	rec.sport.baseball
! net.sport.hoops	rec.sport.basketball
! net.sport.football	rec.sport.football
! net.sport.hockey	rec.sport.hockey
! net.travel	rec.travel
! net.video	rec.video
! net.rec.wood	rec.woodworking
! net.ai	comp.ai
! net.arch	comp.arch
! net.bugs.2bsd	comp.bugs.2bsd
! net.bugs.4bsd	comp.bugs.4bsd
! net.bugs.usg	comp.bugs.sys5
! net.bugs.uucp	comp.bugs.misc
! net.bugs.v7	comp.bugs.misc
! net.bugs	comp.bugs.misc
! net.cog-eng	comp.cog-eng
! net.cse		comp.edu
! net.database	comp.databases
! net.dcom	comp.dcom.modems
! net.decus	comp.org.decus
! net.emacs	comp.emacs
! net.eunice	comp.os.eunice
! net.graphics	comp.graphics
! net.info-terms	comp.terminals
! net.internat	comp.std.internat
! net.lan		comp.dcom.lans
! net.lang	comp.lang.misc
! net.lang.ada	comp.lang.ada
! net.lang.apl	comp.lang.apl
! net.lang.c	comp.lang.c
! net.lang.c++	comp.lang.c++
! net.lang.f77	comp.lang.fortran
! net.lang.forth	comp.lang.forth
! net.lang.lisp	comp.lang.lisp
! net.lang.mod2	comp.lang.modula2
! net.lang.pascal	comp.lang.pascal
! net.lang.prolog	comp.lang.prolog
! net.lang.st80	comp.lang.smalltalk
! net.lsi		comp.lsi
! net.mail	comp.mail.uucp
! net.mail.headers	comp.mail.headers
! net.micro	comp.sys.misc
! net.micro.6809	comp.sys.m6809
! net.micro.68k	comp.sys.m68k
! net.micro.apple	comp.sys.apple
! net.micro.amiga	comp.sys.amiga
! net.micro.atari16	comp.sys.atari.st
! net.micro.atari8	comp.sys.atari.8bit
! net.micro.att	comp.sys.att
! net.micro.cbm	comp.sys.cbm
! net.micro.cpm	comp.os.cpm
! net.micro.hp	comp.sys.hp
! net.micro.mac	comp.sys.mac
! net.micro.ns32k	comp.sys.nsc.32k
! net.micro.pc	comp.sys.ibm.pc
! net.micro.ti	comp.sys.ti
! net.micro.trs-80	comp.sys.tandy
! net.news	news.misc
! net.news.adm	news.admin
! net.news.b	news.software.b
! net.news.config	news.config
! net.news.group	news.groups
! net.news.newsite	news.newsites
! net.news.notes	news.software.notes
! net.news.sa	news.sysadmin
! net.news.stargate	news.stargate
! net.periphs	comp.periphs
! net.sources.d	comp.sources.d
! net.text	comp.text
! net.unix	comp.unix.questions
! net.unix-wizards	comp.unix.wizards
! net.usenix	comp.org.usenix
! net.wanted.sources	comp.sources.wanted
! net.chess		rec.games.chess
! net.trivia		rec.games.trivia
! net.rec.radio		rec.ham-radio
! net.term		comp.terminals
! net.joke		rec.humor
! net.vlsi		comp.lsi
! net.micro.16k		comp.sys.nsc.32k
! net.music.gdea		rec.music.gdead
! net.notes		news.software.notes
! net.periph		comp.periphs
! net.puzzles		rec.puzzles
! net.unix.wizards	comp.unix.wizards
! net.sources.wanted	comp.sources.wanted
  net.consumers		misc.consumers
  net.consumers.house	misc.consumers.house
  net.house		misc.consumers.house
***************
*** 187,192 ****
--- 317,327 ----
  talk.religion		talk.religion.misc
  net.rumor		talk.rumors
  talk.rumor		talk.rumors
+ rec.skydive		rec.skydiving
+ comp.sources.games	net.sources.games
+ comp.sources.bugs	net.sources.bugs
+ comp.sources.unix	net.sources
+ comp.sources.mac	net.sources.mac
  EOF
  : if no aliases file, make one
  if test ! -f $LIBDIR/aliases

Index: ndir.c
Prereq: 1.8
*** .d/ndir.c	Thu Oct 30 16:12:02 1986
--- ndir.c	Tue Dec 16 13:10:10 1986
***************
*** 4,10 ****
  #include "ndir.h"
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)ndir.c	1.8	4/26/85";
  #endif /* SCCSID */
  
  /*
--- 4,10 ----
  #include "ndir.h"
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)ndir.c	1.9	12/16/86";
  #endif /* SCCSID */
  
  /*
***************
*** 48,58 ****
--- 48,68 ----
  #else /* V7 file system */
  #define	ODIRSIZ	14
  
+ #if HP9K5
+ /* HP 9000/500 has a weird directory format */
+ struct olddirect {
+ 	char	od_name[DIRSIZ+2];	/* filename */
+ 	short	od_object_type;
+ 	short	od_file_code;
+ 	short	od_ino; 		/* inode */
+ };
+ #else /* normal V7 */
  struct	olddirect {
  	short	od_ino;
  	char	od_name[ODIRSIZ];
  };
  #endif /* V7 */
+ #endif /* !pyr */
  
  /*
   * get next entry in a directory.
Index: pathinit.c
Prereq: 1.18
*** .d/pathinit.c	Thu Oct 30 16:09:55 1986
--- pathinit.c	Tue Dec 16 13:10:11 1986
***************
*** 34,40 ****
   */
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)pathinit.c	1.18	10/23/86";
  #endif /* SCCSID */
  
  #if defined(INEW) || defined(EXP)
--- 34,40 ----
   */
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)pathinit.c	1.19	12/16/86";
  #endif /* SCCSID */
  
  #if defined(INEW) || defined(EXP)
***************
*** 116,123 ****
  pathinit()
  {
  #if defined(INEW) && defined(NOTIFY)
- 	FILE *nfd;		/* notify file descriptor */
- 	char *p;
  #endif /* INEW && NOTIFY */
  #ifndef ROOTID
  	struct passwd	*pw;	/* struct for pw lookup	*/
--- 116,121 ----
Index: postnews.c
Prereq: 1.29
*** .d/postnews.c	Fri Nov 21 16:05:06 1986
--- postnews.c	Tue Dec 16 13:10:12 1986
***************
*** 16,24 ****
   * script, and does more intelligent prompting and filtering than possible
   * in a shell script.
   */
- 
  #ifdef SCCSID
! static char	*SccsId = "@(#)postnews.c	1.29	11/21/86";
  #endif /* SCCSID */
  
  #include "params.h"
--- 16,23 ----
   * script, and does more intelligent prompting and filtering than possible
   * in a shell script.
   */
  #ifdef SCCSID
! static char	*SccsId = "@(#)postnews.c	1.30	12/16/86";
  #endif /* SCCSID */
  
  #include "params.h"
***************
*** 57,62 ****
--- 56,62 ----
  	char descr[128];
  } distr[MAXDISTR];
  
+ char def_distr[24] = "";	/* default distribution */
  FILE *xfopen();
  
  main(argc, argv)
***************
*** 253,258 ****
--- 253,259 ----
  #endif /* !PAGE */
  			}
  			printf("These are the currently active groups:\n");
+ 			(void) fflush(stdout);
  			sprintf(buf, "exec %s %s/newsgroups", pager, LIB);
  			(void) system(buf);
  			continue;
***************
*** 310,315 ****
--- 311,322 ----
  		(void) strcpy(def, deflt);
  	if (ngmatch("misc.test", newsgroups))
  		(void) strcpy(def, "local");
+ 	for (i=0; distr[i].abbr[0]; i++) {
+ 		if (strcmp(distr[i].abbr, def) == 0)
+ 			break;
+ 	}
+ 	if (distr[i].abbr[0] == '\0')
+ 		strcpy(def, def_distr);
  	for(;;) {
  		do {
  			(void) sprintf(buf, "Distribution (default='%s', '?' for help) : ", def);
***************
*** 419,424 ****
--- 426,432 ----
  				fprintf(tf, "> %s", buf);
  			(void) fclose(of);
  			printf("OK, but please edit it to suppress unnecessary verbiage, signatures, etc.\n");
+ 			(void) fflush(stdout);
  		}
  	}
  
***************
*** 732,739 ****
--- 740,752 ----
  		if (fscanf(fd, "%s %[^\n]", distr[i].abbr, distr[i].descr)
  			!= 2)
  			break;
+ 		if (strcmp(distr[i].abbr, "default") == 0)
+ 			strcpy(def_distr, distr[i--].descr);
  	}
  	(void) fclose(fd);
+ 	distr[i].abbr[0] = '\0';
+ 	if (def_distr[0] == '\0')
+ 		strcpy(def_distr, "world");	/* maybe "local" is better? */
  }
  
  /*
***************
*** 886,892 ****
  					*canpost = 'n';
  					return FALSE;
  				}
! #endif FASCIST
  				return TRUE;
  			} else
  				return FALSE;
--- 899,905 ----
  					*canpost = 'n';
  					return FALSE;
  				}
! #endif /* FASCIST */
  				return TRUE;
  			} else
  				return FALSE;
***************
*** 1047,1052 ****
--- 1060,1066 ----
  
  	(void) sprintf(buf,"exec %s/%s 13 < %s >> %s\n", LIB, "caesar", codedfile, article);
  	printf("Encoding article -- please stand by\n");
+ 	(void) fflush(stdout);
  	if (system(buf)) {
  		printf("encoding failed");
  		exit(2);

Index: process.c
Prereq: 2.16
*** .d/process.c	Fri Nov 21 16:04:39 1986
--- process.c	Tue Dec 16 13:10:13 1986
***************
*** 16,28 ****
   */
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)process.c	2.16	11/21/86";
  #endif /* SCCSID */
  
  #include "rparams.h"
  
  char	coptbuf[LBUFLEN], datebuf[LBUFLEN];
- struct hbuf header;
  
  #define OPTION	0	/* pick up an option string */
  #define STRING	1	/* pick up a string of arguments */
--- 16,27 ----
   */
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)process.c	2.17	12/16/86";
  #endif /* SCCSID */
  
  #include "rparams.h"
  
  char	coptbuf[LBUFLEN], datebuf[LBUFLEN];
  
  #define OPTION	0	/* pick up an option string */
  #define STRING	1	/* pick up a string of arguments */

Index: readr.c
Prereq: 2.59
*** .d/readr.c	Fri Nov 21 16:04:38 1986
--- readr.c	Tue Dec 16 13:10:14 1986
***************
*** 16,22 ****
   */
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)readr.c	2.59	11/21/86";
  #endif /* SCCSID */
  
  #include "rparams.h"
--- 16,22 ----
   */
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)readr.c	2.60	12/16/86";
  #endif /* SCCSID */
  
  #include "rparams.h"
***************
*** 221,226 ****
--- 221,233 ----
  
  	switch (*bptr++) {
  
+ 	/* display list of articles in current group */
+ 	case 'l':
+ 	case 'L':
+ 		list_group(groupdir, atoi(bptr),
+ 			(*(bptr - 1) == 'l') ? FALSE : TRUE, pngsize);
+ 		break;
+ 	
  	/* No.  Go on to next article. */
  	case 'n':
  		EOL();
***************
*** 516,522 ****
  			*ptr2 = '\0';
  		ptr2 = index(ptr3, '/');
  		if (!ptr2) {
- 			*ptr3 = '\0';
  			if (strcmp(ptr3, "cancelled") == 0) {
  				fprintf(ofp, "Article %s has been cancelled.\n",
  					bptr);
--- 523,528 ----

Index: rfuncs2.c
Prereq: 1.32
*** .d/rfuncs2.c	Thu Oct 30 16:10:44 1986
--- rfuncs2.c	Tue Dec 16 13:10:16 1986
***************
*** 16,22 ****
   */
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)rfuncs2.c	1.32	10/23/86";
  #endif /* SCCSID */
  
  /*LINTLIBRARY*/
--- 16,22 ----
   */
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)rfuncs2.c	1.33	12/16/86";
  #endif /* SCCSID */
  
  /*LINTLIBRARY*/
***************
*** 24,29 ****
--- 24,30 ----
  #include "rparams.h"
  
  static char	lbuf[LBUFLEN];
+ extern char *replyname();
  
  FILE *popen();
  
Index: uname.c
Prereq: 2.12
*** .d/uname.c	Fri Nov 21 16:04:50 1986
--- uname.c	Tue Dec 16 13:10:17 1986
***************
*** 21,27 ****
   */
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)uname.c	2.12	11/21/86";
  #endif /* SCCSID */
  
  #include "params.h"
--- 21,27 ----
   */
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)uname.c	2.13	12/16/86";
  #endif /* SCCSID */
  
  #include "params.h"
***************
*** 36,42 ****
  {
  	char *cp;
  	gethostname(uptr->nodename, sizeof (uptr->nodename));
! 	if (MYDOMAIN[0] == '\0') /* get domain name from hostname */
  		return;
  	cp = index(uptr->nodename, '.');
  	if (cp)
--- 36,43 ----
  {
  	char *cp;
  	gethostname(uptr->nodename, sizeof (uptr->nodename));
! 	cp = MYDOMAIN;	/* Gould compiler can't handle ""[0] */
! 	if (*cp == '\0') /* get domain name from hostname */
  		return;
  	cp = index(uptr->nodename, '.');
  	if (cp)

Index: unbatch.c
Prereq: 1.23
*** .d/unbatch.c	Fri Nov 21 16:04:53 1986
--- unbatch.c	Tue Dec 16 13:10:17 1986
***************
*** 13,19 ****
   */
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)unbatch.c	1.23	11/21/86";
  #endif /* SCCSID */
  
  #define	MAXARGS		32
--- 13,19 ----
   */
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)unbatch.c	1.24	12/16/86";
  #endif /* SCCSID */
  
  #define	MAXARGS		32
***************
*** 161,167 ****
--- 161,171 ----
  	if (cp++ == NULL)
  		cp = args[0];
  
+ # ifdef HOME
+ 	sprintf(path, "%s/%s/%s", logdir(HOME), LIBDIR, cp);
+ # else /* !HOME */
  	sprintf(path, "%s/%s", LIBDIR, cp);
+ # endif /* HOME */
  
  	/*
  	 * "path" is absolute, no searching is needed,  we use

Index: virtterm.c
Prereq: 1.12
*** .d/virtterm.c	Thu Oct 30 16:08:32 1986
--- virtterm.c	Tue Dec 16 13:10:19 1986
***************
*** 5,11 ****
   */
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)virtterm.c	1.12	10/29/86";
  #endif /* SCCSID */
  
  /*LINTLIBRARY*/
--- 5,11 ----
   */
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)virtterm.c	1.13	12/16/86";
  #endif /* SCCSID */
  
  /*LINTLIBRARY*/
***************
*** 89,95 ****
  int     COLS;			/* width of screen */
  
  struct line {
! 	char    len;
  	char    flags;
  	char    *l;		/* pointer to actual line text, NO NULL @ end */
  };
--- 89,95 ----
  int     COLS;			/* width of screen */
  
  struct line {
! 	short    len;		/* should really be u_char */
  	char    flags;
  	char    *l;		/* pointer to actual line text, NO NULL @ end */
  };
***************
*** 1006,1009 ****
  
  	winch_upd();
  }
! #endif TIOCGWINSZ
--- 1006,1009 ----
  
  	winch_upd();
  }
! #endif /* TIOCGWINSZ */

Index: visual.c
Prereq: 1.33
*** .d/visual.c	Fri Nov 21 16:04:36 1986
--- visual.c	Tue Dec 16 13:10:21 1986
***************
*** 4,10 ****
   */
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)visual.c	1.33	11/21/86";
  #endif /* SCCSID */
  
  #include "rparams.h"
--- 4,10 ----
   */
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)visual.c	1.34	12/16/86";
  #endif /* SCCSID */
  
  #include "rparams.h"
***************
*** 324,330 ****
  	secpr[0] = '\0';
  	if (countset == 0)
  		count = 1;
! 	docmd(c, count);
  	if (c != '?' && c != 'H')		/* UGGH */
  		prflags &=~ HELPMSG;
  	if (dlinno > hdrstart)
--- 324,330 ----
  	secpr[0] = '\0';
  	if (countset == 0)
  		count = 1;
! 	docmd(c, count, countset);
  	if (c != '?' && c != 'H')		/* UGGH */
  		prflags &=~ HELPMSG;
  	if (dlinno > hdrstart)
***************
*** 335,343 ****
  /*
   * Process one command, which has already been typed in.
   */
! docmd(c, count)
  int c;
  long count;
  {
  	int i;
  	long nart, Hoffset;
--- 335,344 ----
  /*
   * Process one command, which has already been typed in.
   */
! docmd(c, count, countset)
  int c;
  long count;
+ int countset;
  {
  	int i;
  	long nart, Hoffset;
***************
*** 345,350 ****
--- 346,363 ----
  
  	switch (c) {
  
+ 	/* display list of articles in current group */
+ 	case 'l':
+ 	case 'L':
+ 		botscreen();
+ 		ttycooked();
+ 		list_group(groupdir, countset ? count : 0,
+ 			(c == 'l') ? FALSE : TRUE, pngsize);
+ 		ttyraw();
+ 		clearok(curscr, 1);
+ 		updscr();
+ 		break;
+ 
  	/* Show more of current article, or advance to next article */
  	case '\n':
  	case ' ':
***************
*** 432,438 ****
  		break;
  
  	/* Turn displaying of article back on */
- 	case 'l':
  	case 'd':
  		prflags &=~ NOPRT;
  		break;
--- 445,450 ----
***************
*** 496,528 ****
  
  		/* write out the article someplace */
  		/* w writes out without the header */
! 	case 's':
! 	case 'w': {
! 		char *grn = groupdir;
  		int wflags;
  
! 		msg("file: ");
! 		curflag = CURP2;
! 		while ((wflags = vgetc()) == ' ');
! 		if (wflags == cintr) {
! 			secpr[0] = '\0';
! 			break;
  		}
! 		if (wflags == '|') {
! 			linebuf[0] = '|';
! 			if (prget("| ", linebuf+1))
! 				break;
! 		} else {
! 			pushback(wflags);
! 			if (prget("file: ", linebuf))
! 				break;
! 		}
  		wflags = 0;
  		if (c == 's')
  			wflags |= SVHEAD;
  		if (count != 1)
  			wflags |= OVWRITE;
! 		bptr = linebuf;
  		while( *bptr == ' ')
  			bptr++;	/* strip leading spaces */
  
--- 508,550 ----
  
  		/* write out the article someplace */
  		/* w writes out without the header */
! 		/* | defaults to pipeing */
! 	{
! 		static char savebuf[BUFLEN];
  		int wflags;
  
! 	case '|':
! 		if (savebuf[0] != '|') {
! 			savebuf[0] = '|';
! 			savebuf[1] = '\0';
  		}
! 		c = 's';
! 	case 's':
! 	case 'w':
! 		/* We loop back to here each time user types ^U to prompt */
! 		do {
! 			if (savebuf[0] == 0) {
! 				/* No saved default.  Ask. */
! 				msg("file: ");
! 				curflag = CURP2;
! 				while ((wflags = vgetc()) == ' ');
! 				if (wflags == cintr) {
! 					secpr[0] = '\0';
! 					break;
! 				}
! 				savebuf[0] = wflags;
! 				savebuf[1] = 0;
! 			}
! 			wflags = prget( (savebuf[0] == '|') ? "": "file: ",
! 					savebuf);
! 		} while (wflags == 2);
! 		if (wflags) break;	/* Interrupted out */
  		wflags = 0;
  		if (c == 's')
  			wflags |= SVHEAD;
  		if (count != 1)
  			wflags |= OVWRITE;
! 		bptr = savebuf;
  		while( *bptr == ' ')
  			bptr++;	/* strip leading spaces */
  
***************
*** 536,542 ****
  			} else if (boxptr = getenv("NEWSBOX")) {
   				if (index(boxptr, '%')) {
  					struct stat stbf;
!  					sprintf(bptr, boxptr, grn);
   					if (stat(bptr,&stbf) < 0) {
   						if (mkdir(bptr, 0777) < 0) {
  							msg("Cannot create directory %s", bptr);
--- 558,564 ----
  			} else if (boxptr = getenv("NEWSBOX")) {
   				if (index(boxptr, '%')) {
  					struct stat stbf;
!  					sprintf(bptr, boxptr, groupdir);
   					if (stat(bptr,&stbf) < 0) {
   						if (mkdir(bptr, 0777) < 0) {
  							msg("Cannot create directory %s", bptr);
***************
*** 633,638 ****
--- 655,661 ----
  		int flags;
  
  		p = linebuf;
+ 		*p = 0;
  		if (prget("!", p))
  			break;
  		flags = CWAIT;
***************
*** 763,770 ****
  	/* specific message ID. */
  	case '<':
  		/* could improve this */
! 		linebuf[0] = '<';
! 		if (prget("<", linebuf+1))
  			break;
  searchid:	secpr[0] = '\0';
  		if (index(linebuf, '@') == NULL && index(linebuf, '>') == NULL) {
--- 786,793 ----
  	/* specific message ID. */
  	case '<':
  		/* could improve this */
! 		linebuf[0] = '<'; linebuf[1] = 0;
! 		if (prget("", linebuf))
  			break;
  searchid:	secpr[0] = '\0';
  		if (index(linebuf, '@') == NULL && index(linebuf, '>') == NULL) {
***************
*** 1033,1038 ****
--- 1056,1062 ----
  next_ng_command()
  {
  	obit = -1;
+ 	linebuf[0] = 0;
  	if (prget("group? ", linebuf))
  		return FALSE;
  	bptr = linebuf;
***************
*** 1530,1556 ****
  	maxcol = linebuf;
  }
  
  prget(prompter, buf)
  char *prompter, *buf;
  {
! 	char *p, *q, *r;
! 	int c, lastc;
  
  	curflag = CURP2;
! 	r = buf;
  	lastc = '\0';
  	for (;;) {
- 		*r = '\0';
  		p = secpr;
  		for (q = prompter ; *q ; q++)
  			*p++ = *q;
  		for (q = buf ; *q ; q++) {
! 			if (p < &secpr[SECPRLEN-1] && *q >= ' ' && *p <= '~')
  				*p++ = *q;
  		}
  		*p = '\0';
  		c = vgetc();
! 		if (c == '\n' || c == cintr) {
  			break;
  		}
  		if (c == cerase || c == '\b' || c == '\177') {
--- 1554,1595 ----
  	maxcol = linebuf;
  }
  
+ 
+ /*
+  * Prompt the user and get a line.
+  * "prompter" is the prompt.  "buf" contains a string which
+  * will be used as the initial user response (which may be edited
+  * by the user with backspace, ^U, etc).  The resulting line is
+  * returned in "buf".  The result of prget() is:
+  *	 0 if the line was terminated by NL or CR
+  *	 1 if it was terminated by the interrupt character.
+  *	 2 if it was terminated by erasing all the characters, including
+  *	   one or more that were prompted initially in "buf".  (If "buf"
+  * 	   was empty, this will never occur.)
+  */
+ int
  prget(prompter, buf)
  char *prompter, *buf;
  {
! 	register char *p, *q, *r;
! 	register char c;
! 	char lastc;
! 	char hadprompt = buf[0];
  
  	curflag = CURP2;
! 	r = buf + strlen(buf);
  	lastc = '\0';
  	for (;;) {
  		p = secpr;
  		for (q = prompter ; *q ; q++)
  			*p++ = *q;
  		for (q = buf ; *q ; q++) {
! 			if (p < &secpr[SECPRLEN-1] && *q >= ' ' && *q <= '~')
  				*p++ = *q;
  		}
  		*p = '\0';
  		c = vgetc();
! 		if (c == '\n' || c == '\r' || c == cintr) {
  			break;
  		}
  		if (c == cerase || c == '\b' || c == '\177') {
***************
*** 1578,1583 ****
--- 1617,1625 ----
  			*r++ = c;
  		}
  		lastc = c;
+ 		*r = '\0';
+ 		if ((r == buf) && hadprompt)
+ 			return 2;
  	}
  	curflag = CURHOME;
  	secpr[0] = '\0';
***************
*** 1620,1626 ****
  		(void) signal(SIGTTOU, SIG_DFL);
  #endif
  	}
! #ifdef BSD4_2
  	while ((pid = vfork()) == -1)
  #else /* !BSD4_2 */
  	/* 4.1 BSD (at least) can't handle this vfork with -ljobs */
--- 1662,1668 ----
  		(void) signal(SIGTTOU, SIG_DFL);
  #endif
  	}
! #if defined(BSD4_2) && !defined(sun)
  	while ((pid = vfork()) == -1)
  #else /* !BSD4_2 */
  	/* 4.1 BSD (at least) can't handle this vfork with -ljobs */
***************
*** 1811,1817 ****
  	if(UPDATING)	/* concurrency.  wow! */
  		WINCH++;
  	else if((WINCH == 0) && (savelinno >= 0)) {
! 		int saveline = dlinno, saveflag = curflag;
  
  		/* reread the article */
  		FCLOSE(fp);
--- 1853,1859 ----
  	if(UPDATING)	/* concurrency.  wow! */
  		WINCH++;
  	else if((WINCH == 0) && (savelinno >= 0)) {
! 		int  saveflag = curflag;
  
  		/* reread the article */
  		FCLOSE(fp);
Index: vnews.help
*** .d/vnews.help	Thu Oct 30 16:12:04 1986
--- vnews.help	Tue Dec 16 13:10:22 1986
***************
*** 17,22 ****
  ESC-r  Reply directly using mailer      m   Move on to next item in a digest
  f   Post a followup article             s   Save article in file
  N   Go to newsgroup (next is default)   w   Save without header
! l   Display article (use after !, r, f, or ?)
  
! [Press l to see article again]
--- 17,22 ----
  ESC-r  Reply directly using mailer      m   Move on to next item in a digest
  f   Post a followup article             s   Save article in file
  N   Go to newsgroup (next is default)   w   Save without header
! l   List unread articles in group	L   List all articles in group
  
! [Press ^L to see article again]

Index: header.c
Prereq: 2.44
*** .d/header.c	Fri Nov 21 16:18:38 1986
--- header.c	Wed Dec 17 11:36:27 1986
***************
*** 16,22 ****
   */
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)header.c	2.44	11/21/86";
  #endif /* SCCSID */
  
  #include <stdio.h>
--- 16,22 ----
   */
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)header.c	2.46	12/17/86";
  #endif /* SCCSID */
  
  #include <stdio.h>
***************
*** 38,44 ****
--- 38,46 ----
  FILE *fp;
  int wholething;
  {
+ #ifndef HIDDENNET
  	register int	len;
+ #endif /* HIDDENNET */
  	register int	i;
  #ifdef OLD
  	char *p;
***************
*** 94,102 ****
--- 96,106 ----
  #endif /* OLD */
  
  strip:	/* strip off sys! from front of path. */
+ #ifndef HIDDENNET
  	if (strncmp(FULLSYSNAME, hp->path, (len = strlen(FULLSYSNAME))) == 0
  		&& index(NETCHRS, hp->path[len]))
  		(void) strcpy(hp->path, &(hp->path[len+1]));
+ #endif /* HIDDENNET */
  	lcase(hp->nbuf);
  
  	/* Intuit the From: line if only a path was given. */
***************
*** 214,219 ****
--- 218,225 ----
  			break;
  		case DISTRIBUTION:
  			getfield(hp->distribution, sizeof(hp->distribution));
+ 			if (strcmp(hp->distribution, "net") == 0)
+ 				hp->distribution[0] = '\0';
  			break;
  		case ORGANIZATION:
  			getfield(hp->organization, sizeof(hp->organization));
Index: rfuncs.c
Prereq: 2.31
*** .d/rfuncs.c	Thu Oct 30 16:10:23 1986
--- rfuncs.c	Wed Dec 17 00:09:42 1986
***************
*** 16,22 ****
   */
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)rfuncs.c	2.31	10/23/86";
  #endif /* SCCSID */
  
  /*LINTLIBRARY*/
--- 16,22 ----
   */
  
  #ifdef SCCSID
! static char	*SccsId = "@(#)rfuncs.c	2.38	12/16/86";
  #endif /* SCCSID */
  
  /*LINTLIBRARY*/
***************
*** 186,193 ****
   * we write it out.
   */
  	if ((ngsize-minartno) > BITMAPSIZE) {
! 		/* This should never happen */
! 		(void) xerror("Bitmap not large enough for newsgroup %s", groupdir);
  	}
  
  	cur = 0;
--- 186,197 ----
   * we write it out.
   */
  	if ((ngsize-minartno) > BITMAPSIZE) {
! 		/* resize the bitmap array */
! 		(void) free (bitmap);
! 		BITMAPSIZE = 8 * (((ngsize - minartno) + 7) / 8);
! 		bitmap = malloc((unsigned)BITMAPSIZE/8);
! 		if (bitmap == NULL)
! 			xerror("Can't malloc bitmap");
  	}
  
  	cur = 0;
***************
*** 698,701 ****
--- 702,844 ----
  	}
  	(void) fclose(nfp);
  #endif /* SORTACTIVE */
+ }
+ 
+ #if defined(BSD4_2) || defined(BSD4_1C)
+ #include <sys/dir.h>
+ # else
+ #include "ndir.h"
+ #endif
+ #include <errno.h>
+ 
+ /*
+  * Routine to display header lines for all articles in newsgroup. If the flag
+  * argument is FALSE then only articles which are not marked as read in the
+  * bitmap will be displayed. This routine makes no attempt to determine if
+  * the article is in multiple groups and therefore should not be displayed at
+  * this time. 
+  */
+ 
+ static int *lg_array = NULL;
+ static int *lg_entry;
+ static int lg_max = 0;
+ static int int_sig;
+ extern int errno;
+ 
+ lg_cmp(p1, p2)
+ int *p1, *p2;
+ {
+ 	return *p1 > *p2;
+ }
+ 
+ list_group(lgroup, displines, flag, pngsize)
+ char *lgroup;
+ int displines, flag;
+ long pngsize;
+ {
+ 	char *briefdate();
+ 	struct hbuf hh;
+ 	register DIR *dirp;
+ 	register struct direct *dir;
+ 	register FILE *fp_art;
+ 	int i;
+ 	int entries;
+ 	unsigned int alloc_size;
+ 	int (*old_sig) ();
+ 	extern lg_trap();
+ 	char *gets();
+ 
+ 	/* This should get the numbers from the active file XXX */
+ 	if ((dirp = opendir(dirname(lgroup))) == NULL) {
+ 		printf("Can't open %s\r\n", dirname(lgroup));
+ 		return;
+ 	}
+ 	entries = 0;
+ 	if (lg_array == NULL) {
+ 		lg_max = 50;
+ 		alloc_size = lg_max * sizeof(int);
+ 		lg_array = (int *) malloc(alloc_size);
+ 	}
+ 	while ((dir = readdir(dirp)) != NULL) {
+ 		if (dir->d_ino == 0)
+ 			continue;
+ 		i = atoi(dir->d_name);
+ 		if ((i < 1) || (i > pngsize))
+ 			continue;
+ 		if (flag == FALSE) {
+ 			if (get(i) == 0)
+ 				continue;
+ 		}
+ 		if (++entries > lg_max) {
+ 			lg_max += 50;
+ 			alloc_size = lg_max * sizeof(int);
+ 			lg_array = (int *) realloc((char *) lg_array, alloc_size);
+ 		}
+ 		lg_array[entries - 1] = i;
+ 	}
+ 	if (entries == lg_max) {
+ 		lg_max++;
+ 		alloc_size = lg_max * sizeof(int);
+ 		lg_array = (int *) realloc((char *) lg_array, alloc_size);
+ 	}
+ 	qsort(lg_array, entries, sizeof *lg_array, lg_cmp);
+ 	lg_array[entries] = 0;
+ 	int_sig = 0;
+ 	old_sig = signal(SIGINT, lg_trap);
+ 	hh.unrec[0] = NULL;
+ 	for (lg_entry = lg_array; *lg_entry != 0 && int_sig == 0; lg_entry++) {
+ 		(void) sprintf(filename, "%s/%d", dirname(lgroup), *lg_entry);
+ 		fp_art = fopen(filename, "r");
+ 		if (fp_art == NULL)
+ 			continue;
+ 		if (hread(&hh, fp_art, TRUE) == NULL) {
+ 			(void) fclose(fp_art);
+ 			continue;
+ 		}
+ 		printf("%5d %-20.20s %-13s  %s\r\n",
+ 		       *lg_entry, hh.from,
+ 		       briefdate(hh.subdate), hh.title);
+ 		for (i = 0; i < displines;) {
+ 			if (fgets(bfr, LBUFLEN, fp_art) == NULL) {
+ 				break;
+ 			}
+ 			if ((bfr[0] == '\n') || (bfr[0] == '>')) {
+ 				continue;
+ 			}
+ 			printf("%s", bfr);
+ 			i++;
+ 		}
+ 		(void) fclose(fp_art);
+ 	}
+ 	(void) fflush(stdout);
+ 
+ 	closedir(dirp);
+ 	(void) signal(SIGINT, old_sig);	/* restore to old value */
+ 
+ 	printf("[Press RETURN to continue]");
+ 	(void) fflush(stdout);
+ 
+ 	while (TRUE) {
+ 		errno = 0;
+ 		i = getchar();
+ 		if (errno == EINTR)
+ 			continue;
+ 		if (i == '\n' || i == '\r')
+ 			break;
+ 		if (i == EOF)
+ 			break;
+ 		if (i == '\4')
+ 			break;
+ 	}
+ 	(void) free(lg_array);
+ 
+ }
+ 
+ lg_trap(code)
+ int code;
+ {
+ 
+ 	int_sig = 1;
+ 	(void) signal(code, lg_trap);	/* reset signal */
+ 
  }

Index: Makefile.dst
Prereq: 1.19
*** .d/Makefile.dst	Fri Nov 21 16:05:09 1986
--- Makefile.dst	Tue Dec 16 17:47:05 1986
***************
*** 1,4 ****
! # '@(#)Makefile.dst	1.19	11/21/86'
  # Generic Makefile.
  # This is converted to USG/v7/etc by localize.sh
  # which should at least be a copy of localize.v7 or localize.usg
--- 1,4 ----
! # '@(#)Makefile.dst	1.21	12/16/86'
  # Generic Makefile.
  # This is converted to USG/v7/etc by localize.sh
  # which should at least be a copy of localize.v7 or localize.usg
***************
*** 57,62 ****
--- 57,63 ----
  #BSD4_1 LIBS = -ldbm -ljobs
  
  TERMLIB = -ltermlib
+ FIXACTIVE =
  
  #VMS TERMLIB = -ltrmlib
  #VMS LIBS = -ldbm
***************
*** 64,69 ****
--- 65,71 ----
  #VMS MISC = uname.o
  #VMS LINTFLAGS = -chba -DDBM -DVMS ${DEFS}
  #VMS VFORK=
+ #VMS FIXACTIVE = /etc/vmstounix $(LIBDIR)/active
  
  #V7 MISC = uname.o
  #USG MISC = ftime.o
***************
*** 182,188 ****
  	$(CC) $(CFLAGS) $(HOMENAME) -c ifuncs.c
  
  iextern.o:  iextern.c iparams.h defs.h params.h Makefile header.h
! 	$(CC) $(CFLAGS) -c iextern.c
  
  postnews: $(POBJECTS)
  	$(CC) $(CFLAGS) $(LFLAGS) $(POBJECTS) -o postnews
--- 184,190 ----
  	$(CC) $(CFLAGS) $(HOMENAME) -c ifuncs.c
  
  iextern.o:  iextern.c iparams.h defs.h params.h Makefile header.h
! 	$(CC) $(CFLAGS) $(HOMENAME) -c iextern.c
  
  postnews: $(POBJECTS)
  	$(CC) $(CFLAGS) $(LFLAGS) $(POBJECTS) -o postnews
***************
*** 271,278 ****
  process.o:  process.c rparams.h defs.h params.h header.h Makefile
  	$(CC) $(CFLAGS) -c process.c
  
! checknews:  checknews.o process.o cpathinit.o
! 	$(CC) $(LFLAGS) checknews.o process.o cpathinit.o -o checknews
  #VMS 	mv checknews.exe checknews
  
  sendbatch: sendbatch.sh Makefile
--- 273,280 ----
  process.o:  process.c rparams.h defs.h params.h header.h Makefile
  	$(CC) $(CFLAGS) -c process.c
  
! checknews:  checknews.o process.o cpathinit.o rextern.o
! 	$(CC) $(LFLAGS) checknews.o process.o cpathinit.o rextern.o -o checknews
  #VMS 	mv checknews.exe checknews
  
  sendbatch: sendbatch.sh Makefile
***************
*** 283,288 ****
--- 285,291 ----
  
  rmgroup: rmgroup.sh Makefile
  	sed -e "s%LIBDIR%$(LIBDIR)%g" \
+ 	 -e "s%FIXACTIVE%$(FIXACTIVE)%g" \
  	 -e "s%SPOOLDIR%$(SPOOLDIR)%g" rmgroup.sh > rmgroup
  #VMS 	/etc/unixtovms rmgroup
  
Index: makeactive.sh
Prereq: 1.22
*** .d/makeactive.sh	Thu Oct 30 16:10:33 1986
--- makeactive.sh	Wed Dec 17 00:09:41 1986
***************
*** 1,6 ****
  : "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
--- 1,6 ----
  : "Create active file and newsgroup hierarchy for new machine"
  : "Usage: sh makeactive.sh LIBDIR SPOOLDIR NEWSUSR NEWSGRP"
! : '@(#)makeactive	1.23	12/16/86'
  LIBDIR=$1
  SPOOLDIR=$2
  NEWSUSR=$3
***************
*** 7,144 ****
  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)
--- 7,16 ----
***************
*** 162,175 ****
  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)
--- 34,44 ----
***************
*** 201,211 ****
  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.
--- 70,139 ----
  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)
! comp.ai			Artificial intelligence discussions.
! comp.arch		Computer architecture.
! comp.bugs.2bsd		Reports of UNIX* version 2BSD related bugs.
! comp.bugs.4bsd		Reports of UNIX version 4BSD related bugs.
! comp.bugs.misc		General bug reports and fixes (includes V7 & uucp).
! comp.bugs.sys5		Reports of USG (System III, V, etc.) bugs.
! comp.cog-eng		Cognitive engineering.
! comp.databases		Database and data management issues and theory.
! comp.dcom.lans		Local area network hardware and software.
! comp.dcom.modems	Data communications hardware and software.
! comp.edu		Computer science education.
! comp.emacs		EMACS editors of different flavors.
! comp.graphics		Computer graphics, art, animation, image processing,
! comp.lang.ada		Discussion about Ada*.
! comp.lang.apl		Discussion about APL.
! comp.lang.c		Discussion about C.
! comp.lang.c++		The object-oriented C++ language.
! comp.lang.forth		Discussion about Forth.
! comp.lang.fortran	Discussion about FORTRAN.
! comp.lang.lisp		Discussion about LISP.
! comp.lang.misc		Different computer languages not specifically listed.
! comp.lang.modula2	Discussion about Modula-2.
! comp.lang.pascal	Discussion about Pascal.
! comp.lang.prolog	Discussion about PROLOG.
! comp.lang.smalltalk	Discussion about Smalltalk 80.
! comp.lsi		Large scale integrated circuits.
! comp.mail.headers	Gatewayed from the ARPA header-people list.
! comp.mail.misc		General discussions about computer mail.
! comp.mail.uucp		Mail in the uucp network environment.
! comp.misc		General topics about computers not covered elsewhere.
! comp.org.decus		DEC* Users' Society newsgroup.
! comp.org.usenix		USENIX Association events and announcements.
! comp.os.cpm		Discussion about the CP/M operating system.
! comp.os.eunice		The SRI Eunice system.
! comp.os.misc		General OS-oriented discussion not carried elsewhere.
! comp.periphs		Peripheral devices.
! comp.sources.d		For any discussion of source postings.
! comp.sources.wanted	Requests for software and fixes.
! comp.std.internat	Discussion about international standards
! comp.sys.amiga		Discussion about the Amiga micro.
! comp.sys.apple		Discussion about Apple micros.
! comp.sys.atari.8bit	Discussion about 8 bit Atari micros.
! comp.sys.atari.st	Discussion about 16 bit Atari micros.
! comp.sys.att		Discussions about AT&T microcomputers 
! comp.sys.cbm		Discussion about Commodore micros.
! comp.sys.dec		Discussions about DEC computer systems.
! comp.sys.hp		Discussion about Hewlett/Packard's.
! comp.sys.ibm.pc		Discussion about IBM personal computers.
! comp.sys.intel		Disucussions about Intel systems and parts.
! comp.sys.m6809		Discussion about 6809's.
! comp.sys.m68k		Discussion about 68k's.
! comp.sys.mac		Discussions about the Apple Macintosh & Lisa.
! comp.sys.misc		Micro computers of all kinds.
! comp.sys.nsc.32k	National Semiconductor 32000 series chips
! comp.sys.tandy		Discussion about TRS-80's.
! comp.sys.ti		Discussion about Texas Instruments.
! comp.terminals		All sorts of terminals.
! comp.text		Text processing.
! comp.unix.questions	UNIX neophytes group.
! comp.unix.wizards	Discussions, bug reports, and fixes on and for UNIX.
! comp.unix.xenix		Discussion about the Xenix OS.
  misc.consumers		Consumer interests, product reviews, etc.
  misc.consumers.house	Discussion about owning and maintaining a house.
! misc.forsale		Short, tasteful postings about 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.
***************
*** 215,220 ****
--- 143,220 ----
  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).
+ news.admin		Comments directed to news administrators.
+ news.config		Postings of system down times and interruptions.
+ news.groups		Discussions and lists of newsgroups
+ news.lists		News-related statistics and lists (Moderated)
+ news.misc		Discussions of USENET itself.
+ news.newsites		Postings of new site announcements.
+ news.software.b		Discussion about B news software.
+ news.software.notes	Notesfile software from the Univ. of Illinois.
+ news.stargate		Discussion about satellite transmission of news.
+ news.sysadmin		Comments directed to system administrators.
+ rec.arts.books		Books of all genres, shapes, and sizes.
+ rec.arts.comics		The funnies, old and new.
+ rec.arts.drwho		Discussion about Dr. Who.
+ rec.arts.movies		Reviews and discussions of movies.
+ rec.arts.poems		For the posting of poems.
+ rec.arts.sf-lovers	Science fiction lovers' newsgroup.
+ rec.arts.startrek	Star Trek, the TV show and the movies.
+ rec.arts.tv		The boob tube, its history, and past and current shows.
+ rec.arts.tv.soaps	Postings about soap operas.
+ rec.arts.wobegon	"A Prairie Home Companion" radio show discussion.
+ rec.audio		High fidelity audio.
+ rec.autos		Automobiles, automotive products and laws.
+ rec.autos.tech		Technical aspects of automobiles, et. al.
+ rec.aviation		Aviation rules, means, and methods.
+ rec.bicycles		Bicycles, related products and laws.
+ rec.birds		Hobbyists interested in bird watching.
+ rec.boats		Hobbyists interested in boating.
+ rec.food.cooking	Food, cooking, cookbooks, and recipes.
+ rec.food.drink		Wines and spirits.
+ rec.food.veg		Vegetarians.
+ rec.games.board		Discussion and hints on board games.
+ rec.games.bridge	Hobbyists interested in bridge.
+ rec.games.chess		Chess & computer chess.
+ rec.games.empire	Discussion and hints about Empire.
+ rec.games.frp		Discussion about Fantasy Role Playing games.
+ rec.games.go		Discussion about Go.
+ rec.games.hack		Discussion, hints, etc. about the Hack game.
+ rec.games.misc		Games and computer games.
+ rec.games.pbm		Discussion about Play by Mail games.
+ rec.games.rogue		Discussion and hints about Rogue.
+ rec.games.trivia	Discussion about trivia.
+ rec.games.video		Discussion about video games.
+ rec.gardens		Gardening, methods and results.
+ rec.ham-radio		Amateur Radio practices, contests, events, rules, etc.
+ rec.ham-radio.packet	Discussion about packet radio setups.
+ rec.humor		Jokes and the like.  May be somewhat offensive.
+ rec.humor.d		Discussions on the content of rec.humor articles
+ rec.mag			Magazine summaries, tables of contents, etc.
+ rec.misc		General topics about recreational/participant sports.
+ rec.motorcycles		Motorcycles and related products and laws.
+ rec.music.classical	Discussion about classical music.
+ rec.music.folk		Folks discussing folk music of various sorts
+ rec.music.gdead		A group for (Grateful) Dead-heads
+ rec.music.makers	For performers and their discussions.
+ rec.music.misc		Music lovers' group.
+ rec.music.synth		Synthesizers and computer music
+ rec.nude		Hobbyists interested in naturist/nudist activities.
+ rec.pets		Pets, pet care, and household animals in general.
+ rec.photo		Hobbyists interested in photography.
+ rec.puzzles		Puzzles, problems, and quizzes.
+ rec.railroad		Real and model train fans' newsgroup.
+ rec.scuba		Hobbyists interested in SCUBA diving.
+ rec.skiing		Hobbyists interested in skiing.
+ rec.skydiving		Hobbyists interested in skydiving.
+ rec.sport.baseball	Discussion about baseball.
+ rec.sport.basketball	Discussion about basketball.
+ rec.sport.football	Discussion about football.
+ rec.sport.hockey	Discussion about hockey.
+ rec.sport.misc		Spectator sports.
+ rec.travel		Traveling all over the world.
+ rec.video		Video and video components.
+ rec.woodworking		Hobbyists interested in woodworking.
  sci.astro		Astronomy discussions and information.
  sci.bio			Biology and related sciences.
  sci.crypt		Different methods of data en/decryption.
***************
*** 234,240 ****
  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.
--- 234,240 ----
  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 & religion
  soc.culture.misc	Group for discussion about other cultures
  soc.misc		Socially-oriented topics not in other groups.
  soc.motss		Issues pertaining to homosexuality.
Index: rmgroup.sh
Prereq: 1.6
*** .d/rmgroup.sh	Thu Oct 30 16:12:15 1986
--- rmgroup.sh	Tue Dec 16 17:47:07 1986
***************
*** 1,23 ****
! : '@(#)rmgroup.sh	1.6	9/19/86'
  for group
  do
- 	echo "Removing newsgroup $group"
  	qgrp="`echo $group | sed 's/\./\\\./g'`"
  	if
  		grep -s "^$qgrp " LIBDIR/active
  	then
! 		cat << E_O_F >/tmp/$$
! /^$qgrp[ 	]/d
! w
! q
! E_O_F
! 		ed - LIBDIR/active < /tmp/$$
! 		ed - LIBDIR/newsgroups < /tmp/$$
  		dir=SPOOLDIR/"`echo $group | sed 's/\./\//g'`"
! 		if [ -d $dir ]
  		then
! 			rm $dir/*
! 			rmdir $dir
  		else
  			echo "$0: $dir: no spool directory" 2>&1
  		fi
--- 1,17 ----
! : '@(#)rmgroup.sh	1.8	12/16/86'
  for group
  do
  	qgrp="`echo $group | sed 's/\./\\\./g'`"
  	if
  		grep -s "^$qgrp " LIBDIR/active
  	then
! 		echo "Removing newsgroup $group"
! 		echo "/^$qgrp[ 	]/d" >>/tmp/,edit$$
  		dir=SPOOLDIR/"`echo $group | sed 's/\./\//g'`"
! 		if test  -d $dir
  		then
! 			rm $dir/* >/dev/null 2>&1
! 			echo "rmdir $dir >/dev/null 2>&1" >>/tmp/,rmdir$$
  		else
  			echo "$0: $dir: no spool directory" 2>&1
  		fi
***************
*** 25,29 ****
  		echo "$0: $group: no such newsgroup" 2>&1
  	fi
  done
! rm -f /tmp/$$
  exit 0
--- 19,36 ----
  		echo "$0: $group: no such newsgroup" 2>&1
  	fi
  done
! echo w >>/tmp/,edit$$
! echo q >>/tmp/,edit$$
! echo "Editing LIBDIR/active..."
! ed - LIBDIR/active < /tmp/,edit$$
! FIXACTIVE
! echo "Editing LIBDIR/newsgroups..."
! ed - LIBDIR/newsgroups < /tmp/,edit$$
! echo "Removing directories..."
! if test -s /tmp/,rmdir$$
! then
! 	sort +1r -o /tmp/,rmdir$$ /tmp/,rmdir$$
! 	. /tmp/,rmdir$$
! fi
! rm -f /tmp/,edit$$ /tmp/,rmdir$$
  exit 0
Index: patchlevel.h
Prereq: 1
*** .d/patchlevel.h	Fri Nov 21 16:06:03 1986
--- patchlevel.h	Tue Dec 16 17:47:05 1986
***************
*** 1,3 ****
! #define	PATCHLEVEL	1
  
! #define NEWS_VERSION   "B 2.11 11/15/86"
--- 1,3 ----
! #define	PATCHLEVEL	2
  
! #define NEWS_VERSION   "B 2.11 12/17/86"