Subject: C News patch CR.B
Newsgroups: news.software.b

This is the first part of a two-part patch, CR.C being the second, for
the C News Cleanup Release.  The distribution files on ftp.cs.toronto.edu
and zoo.toronto.edu have been updated to match.  See the README.changes
diff below for what's been done.

start of patch CR.B
(suggested archive name:  patchCR.B)
apply with   patch -p0 <thisfile

Prereq: CR.A.
*** README.mastercopy	Sun Nov 27 20:04:56 1994
--- README	Sun Nov 27 19:29:28 1994
***************
*** 1,4 ****
! This is the Cleanup Release of C News, with patch CR.A.		Oct 1994
  
  The current C News distribution can be retrieved by anonymous FTP from
  ftp.cs.toronto.edu (file pub/c-news/c-news.tar.Z) or ftp.zoo.toronto.edu
--- 1,4 ----
! Cleanup Release of C News, with patch CR.B (which needs .C).	Nov 1994
  
  The current C News distribution can be retrieved by anonymous FTP from
  ftp.cs.toronto.edu (file pub/c-news/c-news.tar.Z) or ftp.zoo.toronto.edu
***************
*** 6,18 ****
  hours (0800-1800 Eastern time, zone -0500).  Major archive sites such as
  ftp.uu.net and ftp.funet.fi also usually have the latest distribution.
  
! See README.changes for what's new and wonderful.
! See README.install for installation instructions.
  
! Warning:  the documentation stinks, worse than usual. :-)  README.install
! and the stuff in notebook/ are current.  The stuff in man/ is thought to be
! correct but may be incomplete in small ways.  The stuff in doc/ is mostly
! out of date and should not be trusted too far.
  
  We are grateful for financial support of C News development by the
  following, none of whom are to blame for the final result (some more
--- 6,15 ----
  hours (0800-1800 Eastern time, zone -0500).  Major archive sites such as
  ftp.uu.net and ftp.funet.fi also usually have the latest distribution.
  
! See README.changes for what's new and wonderful, README.install for
! installation instructions, README.etc for general notes.
  
! Warning:  the documentation in doc/ is somewhat out of date.
  
  We are grateful for financial support of C News development by the
  following, none of whom are to blame for the final result (some more

*** README.changes.mastercopy	Sun Nov 27 20:04:56 1994
--- README.changes	Sun Nov 27 19:50:50 1994
***************
*** 1,3 ****
--- 1,21 ----
+ High points of patch CR.B:
+ This is the first part of a two-part patch, the second being CR.C.  Install
+ both parts, this one first.  In this part...  The viauux -g option now accepts
+ multi-character grade names.  The batcher now works even if off_t is longer
+ than long.  Just plain "make" now balks if you haven't run quiz, or if you
+ need to re-run it.  Expire now grumbles if a line in explist applies to no
+ newsgroups.  Upact has been made more robust, does a much more rigorous
+ check of the new active file before installing it (using the new checkactive
+ program in CR.C), and has a more rigorous regression test.  Complaints from
+ the exploder (e.g. about batch files it cannot create) are now reported
+ properly.  Permissions on gunzip have been fixed.  Numeric filenames in
+ in.coming are now absolute dates, not relative to an undocumented origin
+ (this is possible since CR.A's changes to filenames avoid a 14-character
+ problem).  The makefile now spots whether you've incompletely installed a
+ multi-part patch (like this one) and removes files obsoleted by patches
+ (something "patch" itself cannot be convinced to do).  And the usual bits
+ of cleanup, portability, and minor bug fixes.
+ 
  High points of patch CR.A:
  Quiz now pays attention to the compiler-name and config-file-location
  question answers.  The PATH bug in control-message handling has been fixed.

*** README.etc.mastercopy	Sun Nov 27 20:04:57 1994
--- README.etc	Sun Nov 27 18:16:47 1994
***************
*** 0 ****
--- 1,31 ----
+ This is C News.
+ 
+ C News is an implementation of the storage and forwarding subsystems of a
+ news system.  We include a simple reader as a bonus, but more complex ones
+ will usually be wanted.
+ 
+ You may wish to read doc/problems, which discusses common difficulties,
+ and doc/trouble, which is the beginnings of a troubleshooting guide.
+ 
+ Discussion of C News issues usually takes place in the Usenet newsgroup
+ news.software.b (the name is historical).  There is no C News mailing list.
+ 
+ If you've found a problem, we definitely do want to hear about it.  But,
+ we *do not* want to see 2000 lines of diff listing!  What we want to see
+ is a concise human-readable description of what the problem is and how, 
+ if at all, you solved it.  If we want the diff listing, we will ask.
+ Similarly, we are interested in hearing about changes and improvements,
+ but want to see terse descriptions first.
+ 
+ To send comments, complaints, problem reports, etc., do *not* mail to
+ Geoff or Henry personally, but to:
+ 
+ 	[email-masked]
+ aka	[email-masked]
+ aka	utzoo!c-news
+ 
+ (Note that this has changed, c-news used to be on utstat.)
+ 
+ 
+ 					Geoff Collyer
+ 					Henry Spencer

*** README.install.mastercopy	Sun Nov 27 20:04:57 1994
--- README.install	Wed Nov  2 00:12:11 1994
***************
*** 13,19 ****
  	charges onward -- it knows what it's doing.  Note:  getting the
  	command search path set up properly for compiling is up to you --
  	the search path which quiz asks about is used only for *running*
! 	them.
  
  3. (optional but recommended) "make r".  This will run regression tests.
  	They take a while.  Errors that don't cause make to stop are not
--- 13,21 ----
  	charges onward -- it knows what it's doing.  Note:  getting the
  	command search path set up properly for compiling is up to you --
  	the search path which quiz asks about is used only for *running*
! 	the software.  Also, you need to get the umask set up so that the
! 	compiled binaries will have the right permissions -- again, the
! 	umask quiz asks about is used only for *running* the software.
  
  3. (optional but recommended) "make r".  This will run regression tests.
  	They take a while.  Errors that don't cause make to stop are not
***************
*** 59,65 ****
  	addresses.  Also, unless your site is engaged in network mapping,
  	you should arrange for mail to "newsmap" to be discarded (not
  	returned, not forwarded, just discarded) to minimize the effects
! 	of "sendsys bombing" by practical jokers.
  
  13. Put conf/crontab, or something like it, in as the news-database
  	owner's crontab.
--- 61,70 ----
  	addresses.  Also, unless your site is engaged in network mapping,
  	you should arrange for mail to "newsmap" to be discarded (not
  	returned, not forwarded, just discarded) to minimize the effects
! 	of "sendsys bombing" by practical jokers.  We suggest you also
! 	arrange that mail to "news", "usenet", "newsmaster", and the
! 	news-database owner gets sent somewhere where it will be looked
! 	at regularly.
  
  13. Put conf/crontab, or something like it, in as the news-database
  	owner's crontab.
***************
*** 80,87 ****
  
  18. The next time newsrun runs -- see the crontab -- the article should
  	appear in the newsgroup, the history file, the log file, and
! 	NOT in the errlog file.  Run readnews and try to read it.  If
! 	you can, then it looks like you did most everything right.
  
  19. Get a feed from somebody, somehow, and see if batches from them are
  	arriving in NEWSARTS/in.coming properly and being processed okay.
--- 85,92 ----
  
  18. The next time newsrun runs -- see the crontab -- the article should
  	appear in the newsgroup, the history file, the log file, and
! 	NOT in the errlog file.  Run readnews (or some other reader) and
! 	try to read it.  If you can, then you did most everything right.
  
  19. Get a feed from somebody, somehow, and see if batches from them are
  	arriving in NEWSARTS/in.coming properly and being processed okay.

*** quiz.mastercopy	Sun Nov 27 20:04:58 1994
--- quiz	Sun Nov 27 18:09:54 1994
***************
*** 395,401 ****
  echo '	svr4	System V Release 4 uucp'
  echo '	hdb	pre-SVR4 Honey DanBer, aka Basic Networking Utilities'
  echo '	sub	old uucp with subdirectories (e.g. /usr/spool/uucp/C.)'
! echo '	old	very old uucp, no subdirectories'
  echo '	pre	prehistoric uucp, no subdirectories, no -g option on uux'
  echo "	null	don't run uucp or don't care about queue lengths"
  while :
--- 395,401 ----
  echo '	svr4	System V Release 4 uucp'
  echo '	hdb	pre-SVR4 Honey DanBer, aka Basic Networking Utilities'
  echo '	sub	old uucp with subdirectories (e.g. /usr/spool/uucp/C.)'
! echo '	vo	very old uucp, no subdirectories'
  echo '	pre	prehistoric uucp, no subdirectories, no -g option on uux'
  echo "	null	don't run uucp or don't care about queue lengths"
  while :

*** makefile.mastercopy	Sun Nov 27 20:04:58 1994
--- makefile	Sun Nov 27 19:24:40 1994
***************
*** 12,27 ****
  RDIRS=$(PDIRS)
  SLOWRDIRS=libdbz
  INALL=conf/inall
  
  # System V bug fix
  SHELL=/bin/sh
  
! all:	msub sub mx libcnews.a pgms
  	: everything built successfully
  
  lib:	libcnews.a
  
! libcnews.a:	msub sub mx conf/liblist
  	$(INALL) "$(MAKE)" `cat conf/liblist`
  
  freshlib:
--- 12,28 ----
  RDIRS=$(PDIRS)
  SLOWRDIRS=libdbz
  INALL=conf/inall
+ ROPT=
  
  # System V bug fix
  SHELL=/bin/sh
  
! all:	needquiz patchchores msub sub mx libcnews.a pgms
  	: everything built successfully
  
  lib:	libcnews.a
  
! libcnews.a:	needquiz msub sub mx conf/liblist
  	$(INALL) "$(MAKE)" `cat conf/liblist`
  
  freshlib:
***************
*** 28,55 ****
  	rm -f libcnews.a conf/liblist
  	$(MAKE) lib
  
! pgms:	msub sub mx libcnews.a
  	$(INALL) "$(MAKE)" $(PDIRS)
  	: programs built successfully
  
! install:
  	$(INALL) "$(MAKE) install" $(PDIRS)
  	: 'all programs installed!'
  	: 'but input/newsspool needs its ownership and permissions changed'
  
! setup:
  	$(INALL) "$(MAKE) setup" $(PDIRS)
  	cd conf ; $(MAKE) versetup
  
! ui:
  	$(INALL) "$(MAKE) ui" $(UIDIRS)
  	: 'user interface installed'
  
! readpostcheck:
  	$(INALL) "$(MAKE) readpostcheck" readnews
  	: 'readnews, postnews, checknews installed'
  
! cmp:
  	$(INALL) "$(MAKE) cmp" $(PDIRS)
  	: 'no worrisome differences found'
  
--- 29,56 ----
  	rm -f libcnews.a conf/liblist
  	$(MAKE) lib
  
! pgms:	needquiz msub sub mx libcnews.a
  	$(INALL) "$(MAKE)" $(PDIRS)
  	: programs built successfully
  
! install:	needquiz
  	$(INALL) "$(MAKE) install" $(PDIRS)
  	: 'all programs installed!'
  	: 'but input/newsspool needs its ownership and permissions changed'
  
! setup:		needquiz
  	$(INALL) "$(MAKE) setup" $(PDIRS)
  	cd conf ; $(MAKE) versetup
  
! ui:	needquiz
  	$(INALL) "$(MAKE) ui" $(UIDIRS)
  	: 'user interface installed'
  
! readpostcheck:	needquiz
  	$(INALL) "$(MAKE) readpostcheck" readnews
  	: 'readnews, postnews, checknews installed'
  
! cmp:	needquiz
  	$(INALL) "$(MAKE) cmp" $(PDIRS)
  	: 'no worrisome differences found'
  
***************
*** 56,61 ****
--- 57,71 ----
  cmpok:
  	$(INALL) "$(MAKE) cmp CMPOPT=-i" $(PDIRS)
  
+ # conf/makeinc and conf/substitutions depend on quiz and conf/useanswers too,
+ # but including them here would defeat the don't-touch-if-unchanged trick in
+ # conf/useanswers which avoids spurious re-runs of subst.
+ include/config.make:	quiz conf/useanswers
+ 	: "you must run (or re-run) quiz first -- see README.install"
+ 	@false
+ 
+ needquiz:	include/config.make
+ 
  msub:	conf/msubsts.done
  
  conf/msubsts.done:	conf/makefilelist conf/makeinc conf/subst
***************
*** 81,87 ****
  	echo "include libc libcnews $(DBZ) libfake libbig" >conf/liblist
  
  stdio:
! 	cd libstdio ; $(MAKE) r || ( $(MAKE) clean ; exit 1 )
  	: and only if that succeeded...
  	cd libstdio ; $(MAKE) rclean
  	echo "libstdio" >>conf/liblist
--- 91,97 ----
  	echo "include libc libcnews $(DBZ) libfake libbig" >conf/liblist
  
  stdio:
! 	cd libstdio ; $(MAKE) r $(ROPT) || ( $(MAKE) clean ; exit 1 )
  	: and only if that succeeded...
  	cd libstdio ; $(MAKE) rclean
  	echo "libstdio" >>conf/liblist
***************
*** 102,111 ****
  	: "You must run 'quiz' before running 'make'."
  	exit 1 ;
  
  r:
! 	$(INALL) "$(MAKE) r && $(MAKE) rclean" $(RDIRS)
  	: leave libdbz to last because its regression test is rather slow
! 	$(INALL) "$(MAKE) r && $(MAKE) rclean" $(SLOWRDIRS)
  	: 'all tests successful!'
  	: 'either you or newsmaster should have mail from the "report" test'
  
--- 112,124 ----
  	: "You must run 'quiz' before running 'make'."
  	exit 1 ;
  
+ patchchores:
+ 	cd conf ; $(MAKE) patchchores
+ 
  r:
! 	$(INALL) "$(MAKE) r $(ROPT) && $(MAKE) rclean" $(RDIRS)
  	: leave libdbz to last because its regression test is rather slow
! 	$(INALL) "$(MAKE) r $(ROPT) && $(MAKE) rclean" $(SLOWRDIRS)
  	: 'all tests successful!'
  	: 'either you or newsmaster should have mail from the "report" test'
  
***************
*** 129,132 ****
--- 142,147 ----
  
  # this is strictly for development use
  .DEFAULT:
+ 	: if you see this, you are doing something wrong -- the following
+ 	: is strictly for development use
  	$(MAKE) -f mfile $@

*** batch/viauux.mastercopy	Sun Nov 27 20:04:59 1994
--- batch/viauux	Mon Oct 24 16:59:51 1994
***************
*** 8,14 ****
  for dummy
  do
  	case "$1" in
! 	-g?)	grade="$1"		;;
  	-g)	grade="-g$2" ; shift	;;
  	-z)	z=-z			;;
  	-n)	z=-n			;;
--- 8,14 ----
  for dummy
  do
  	case "$1" in
! 	-g?*)	grade="$1"		;;
  	-g)	grade="-g$2" ; shift	;;
  	-z)	z=-z			;;
  	-n)	z=-n			;;

*** batch/batcher.c.mastercopy	Sun Nov 27 20:04:59 1994
--- batch/batcher.c	Mon Oct 31 15:22:46 1994
***************
*** 122,128 ****
  	if (fstat(artfile, &sbuf) < 0)
  		error("internal disaster, can't fstat", "");
  
! 	printf("#! rnews %ld\n", sbuf.st_size);
  	while ((count = read(artfile, buffer, sizeof buffer)) > 0) {
  		if (fwrite(buffer, sizeof(char), count, stdout) != count)
  			error("write failure in `%s'", article);
--- 122,128 ----
  	if (fstat(artfile, &sbuf) < 0)
  		error("internal disaster, can't fstat", "");
  
! 	printf("#! rnews %ld\n", (long)sbuf.st_size);
  	while ((count = read(artfile, buffer, sizeof buffer)) > 0) {
  		if (fwrite(buffer, sizeof(char), count, stdout) != count)
  			error("write failure in `%s'", article);

*** conf/subst.all.mastercopy	Sun Nov 27 20:05:00 1994
--- conf/subst.all	Sun Nov 27 18:26:46 1994
***************
*** 43,48 ****
--- 43,49 ----
  maint/addgroup
  maint/addmissing
  maint/badexpiry
+ maint/checkactive
  maint/cnewsdo
  maint/delgroup
  maint/histfrom
***************
*** 57,62 ****
--- 58,65 ----
  maint/newshist
  maint/newswatch
  maint/sysck
+ man/badexpiry.8cn
+ man/checkactive.8
  man/checknews.1cn
  man/cnewsdo.8cn
  man/controlperm.5
***************
*** 89,97 ****
  util/mkpdir
  util/newshostname
  util/queuelen.hdb
- util/queuelen.old
  util/queuelen.sub
  util/queuelen.svr4
  util/report
  util/sfcproto
  util/sfshproto
--- 92,100 ----
  util/mkpdir
  util/newshostname
  util/queuelen.hdb
  util/queuelen.sub
  util/queuelen.svr4
+ util/queuelen.vo
  util/report
  util/sfcproto
  util/sfshproto

*** conf/versionname.mastercopy	Sun Nov 27 20:05:01 1994
--- conf/versionname	Sun Nov 27 19:29:48 1994
***************
*** 1 ****
! Cleanup Release, with patch CR.A
--- 1 ----
! Cleanup Release, with patch CR.B but not .C

*** conf/active.eg.mastercopy	Sun Nov 27 20:05:01 1994
--- conf/active.eg	Thu Nov  3 19:19:29 1994
***************
*** 1,3 ****
  control 0000000000 00001 y
  junk 0000000000 00001 y
! news.announce.newusers 0000000000 00001 y
--- 1,3 ----
  control 0000000000 00001 y
  junk 0000000000 00001 y
! news.announce.newusers 0000000000 00001 m

*** conf/deadfiles.mastercopy	Sun Nov 27 20:05:02 1994
--- conf/deadfiles	Sun Nov 27 20:04:55 1994
***************
*** 0 ****
--- 1,4 ----
+ doc/flow.old
+ expire/mkadir
+ util/queuelen.old
+ README.old

*** conf/useanswers.mastercopy	Sun Nov 27 20:05:03 1994
--- conf/useanswers	Wed Nov  9 19:35:22 1994
***************
*** 168,185 ****
  	echo "HFAKE=$fakehdrs"
  	echo "OFAKE=$fake"
  ) >$tf
! if cmp $tf $uacm >/dev/null 2>/dev/null
  then
! 	echo "unchanged, old one left in place"
! else
! 	>$uacm
! 	if test ! -w $uacm
! 	then
! 		echo "$0: unable to create \`$uacm'; aborting" >&2
! 		exit 1
! 	fi
! 	cp $tf $uacm || exit 1
  fi
  
  rm -f $tf
  exit 0
--- 168,181 ----
  	echo "HFAKE=$fakehdrs"
  	echo "OFAKE=$fake"
  ) >$tf
! # this one we always change, so makefile knows when quiz was re-run
! >$uacm
! if test ! -w $uacm
  then
! 	echo "$0: unable to create \`$uacm'; aborting" >&2
! 	exit 1
  fi
+ cp $tf $uacm || exit 1
  
  rm -f $tf
  exit 0

*** conf/makefile.mastercopy	Sun Nov 27 20:05:04 1994
--- conf/makefile	Sun Nov 27 19:30:31 1994
***************
*** 12,17 ****
--- 12,23 ----
  all:	$(ALL)
  	$(MX) report.ctl config
  
+ patchchores:
+ 	: if this fails, you have not installed all parts of a multi-part patch
+ 	test " `cat versionname | sed 's/^[^.]*\..//'`" = " " ;
+ 	: delete files obsoleted by patches
+ 	cd .. ; rm -f `cat conf/deadfiles` conf/dummy
+ 
  install:	$(ALL)
  
  LASTGROUP=`egrep -v = $(NEWSCTL)/active | tr . / | sed -n '$$s/ .*//p'`

*** ctl/rmgroup.mastercopy	Sun Nov 27 20:05:05 1994
--- ctl/rmgroup	Sat Nov  5 16:32:45 1994
***************
*** 60,66 ****
  ?*)	case "$action" in
  	*q*)	;;
  	*)	(
! 			echo "$0: \`$author' tried"
  			echo "to remove newsgroup \`$g'."
  			echo "Request was refused:"
  			echo "	$reject"
--- 60,66 ----
  ?*)	case "$action" in
  	*q*)	;;
  	*)	(
! 			echo "rmgroup: \`$author' tried"
  			echo "to remove newsgroup \`$g'."
  			echo "Request was refused:"
  			echo "	$reject"

*** ctl/newgroup.mastercopy	Sun Nov 27 20:05:05 1994
--- ctl/newgroup	Sat Nov  5 16:32:36 1994
***************
*** 113,119 ****
  ?*)	case "$action" in
  	*q*)	;;
  	*)	(
! 			echo "$0: \`$author' tried"
  			case "$oldstatus" in
  			'')	echo "to create newsgroup \`$g'."	;;
  			*)	echo "to set newsgroup \`$g' to \`$f'."	;;
--- 113,119 ----
  ?*)	case "$action" in
  	*q*)	;;
  	*)	(
! 			echo "newgroup: \`$author' tried"
  			case "$oldstatus" in
  			'')	echo "to create newsgroup \`$g'."	;;
  			*)	echo "to set newsgroup \`$g' to \`$f'."	;;
***************
*** 158,165 ****
  	cat $tmp >>$NEWSCTL/newsgroups
  	;;
  *)	# status change
! 	awk '$1 == "'"$g"'" { print $1, $2, $3, "'"$newstatus"'" }' \
! 					$NEWSCTL/active >$NEWSCTL/active.tmp
  	if test `wc -l <$NEWSCTL/active.tmp` -lt `wc -l <$NEWSCTL/active`
  	then
  		fail="active.tmp is shorter than active, something's wrong"
--- 158,165 ----
  	cat $tmp >>$NEWSCTL/newsgroups
  	;;
  *)	# status change
! 	awk '$1 == "'"$g"'" { print $1, $2, $3, "'"$newstatus"'" ; next }
! 		{ print }' $NEWSCTL/active >$NEWSCTL/active.tmp
  	if test `wc -l <$NEWSCTL/active.tmp` -lt `wc -l <$NEWSCTL/active`
  	then
  		fail="active.tmp is shorter than active, something's wrong"

*** ctl/makefile.mastercopy	Sun Nov 27 20:05:06 1994
--- ctl/makefile	Tue Nov  1 23:54:49 1994
***************
*** 80,85 ****
--- 80,98 ----
  	test -d arts/comp/lang/beta ;
  	test -r arts/comp/lang/beta/.overview ;
  	rm -f reports
+ 	: newgroup for status change
+ 	sed '/^comp.lang.beta/s/y$$/m/' active >active.good
+ 	sed 's/ [0-9][0-9]* / 0 /' active.times >at.good
+ 	cp newsgroups newsgroups.ok
+ 	$(HERE) ./newgroup comp.lang.beta moderated <reg/n.2 >out.tmp 2>err.tmp
+ 	test ! -s out.tmp ;
+ 	test ! -s err.tmp ;
+ 	cmp active.good active || diff active.good active
+ 	sed 's/ [0-9][0-9]* / 0 /' active.times >at.tmp
+ 	cmp at.good at.tmp || diff at.good at.tmp
+ 	cmp newsgroups.ok newsgroups || diff newsgroups.ok newsgroups
+ 	cmp reg/n.2r reports || diff reg/n.2r reports
+ 	rm -f reports
  	: rmgroup
  	egrep -v soundcard active >active.good
  	egrep -v soundcard active.times >at.good

*** ctl/reg/n.2.mastercopy	Sun Nov 27 20:05:06 1994
--- ctl/reg/n.2	Tue Nov  1 23:50:35 1994
***************
*** 0 ****
--- 1,25 ----
+ Control: newgroup comp.lang.beta moderated
+ Newsgroups: comp.lang.beta
+ Path: tadpole.com!uunet!tale
+ From: [email-masked] (David C Lawrence)
+ Subject: newgroup comp.lang.beta
+ Approved: [email-masked]
+ Sender: [email-masked] (David C Lawrence)
+ Date: Tue, 6 Sep 1994 14:31:58 GMT
+ Message-ID: <[email-masked]>
+ Lines: 14
+ 
+ comp.lang.beta is an unmoderated newsgroup which passed its vote for
+ creation by 354:18 as reported in news.announce.newgroups on 30 Aug 1994.
+ 
+ For your newsgroups file:
+ comp.lang.beta		The object-oriented programming language BETA.
+ 
+ The charter, culled from the call for votes:
+ 
+ comp.lang.beta will receive all the postings from comp.lang.misc and
+ comp.object concerning the BETA language and the programs and systems
+ written in or supporting BETA. Discussions concerning object-oriented
+ programming principles based on the concepts known from BETA will also
+ take place, possibly cross-posted to comp.object.
+ 

*** ctl/reg/n.2r.mastercopy	Sun Nov 27 20:05:07 1994
--- ctl/reg/n.2r	Tue Nov  1 23:54:30 1994
***************
*** 0 ****
--- 1,32 ----
+ status change for comp.lang.beta
+ :::
+ [email-masked] (David C Lawrence) said to
+ set `comp.lang.beta' to moderated.
+ This was done.
+ ===
+ Control: newgroup comp.lang.beta moderated
+ Newsgroups: comp.lang.beta
+ Path: tadpole.com!uunet!tale
+ From: [email-masked] (David C Lawrence)
+ Subject: newgroup comp.lang.beta
+ Approved: [email-masked]
+ Sender: [email-masked] (David C Lawrence)
+ Date: Tue, 6 Sep 1994 14:31:58 GMT
+ Message-ID: <[email-masked]>
+ Lines: 14
+ 
+ comp.lang.beta is an unmoderated newsgroup which passed its vote for
+ creation by 354:18 as reported in news.announce.newgroups on 30 Aug 1994.
+ 
+ For your newsgroups file:
+ comp.lang.beta		The object-oriented programming language BETA.
+ 
+ The charter, culled from the call for votes:
+ 
+ comp.lang.beta will receive all the postings from comp.lang.misc and
+ comp.object concerning the BETA language and the programs and systems
+ written in or supporting BETA. Discussions concerning object-oriented
+ programming principles based on the concepts known from BETA will also
+ take place, possibly cross-posted to comp.object.
+ 
+ ===

*** ctl/controlperm.eg.mastercopy	Sun Nov 27 20:05:07 1994
--- ctl/controlperm.eg	Wed Nov  2 00:09:38 1994
***************
*** 1,14 ****
  # Dave Lawrence runs the main Usenet hierarchies
! comp,sci,misc,rec,soc,talk	[email-masked]	n	y
  # but his name can be forged, so don't let him rmgroup...
! comp,sci,misc,rec,soc,talk	[email-masked]	r	n
  # and nobody else gets any attention in these hierarchies
! comp,sci,misc,rec,soc,talk	any			nr	nq
  
  # same for Jim McIntosh in bit
  bit				[email-masked]	n	y
  bit				[email-masked]	r	n
  bit				any			nr	nq
  
  # it's really tempting to change this one to nq...
  alt				any			nr	nv
--- 1,21 ----
  # Dave Lawrence runs the main Usenet hierarchies
! comp,sci,misc,news,rec,soc,talk	[email-masked]	n	y
  # but his name can be forged, so don't let him rmgroup...
! comp,sci,misc,news,rec,soc,talk	[email-masked]	r	n
  # and nobody else gets any attention in these hierarchies
! comp,sci,misc,news,rec,soc,talk	any			nr	nq
  
  # same for Jim McIntosh in bit
  bit				[email-masked]	n	y
  bit				[email-masked]	r	n
  bit				any			nr	nq
+ 
+ # ClariNet newgroups come from this address
+ clari				[email-masked]	n	yv
+ # You can turn this on, at the risk of accepting forged rmgroups
+ clari				[email-masked]	r	nv
+ # And that's all for ClariNet.
+ clari				any			nr	nq
  
  # it's really tempting to change this one to nq...
  alt				any			nr	nv

*** expire/README.mastercopy	Sun Nov 27 20:05:08 1994
--- expire/README	Wed Oct 19 00:01:24 1994
***************
*** 3,9 ****
  expire.c	does the real work
  expireiflow	wrapper to run expire only if things are tight
  explist.eg	sample expiry-control file
- mkadir		auxiliary program used to make archiving directories
  pgood		part of the expire regression test
  tgood		part of the expire regression test
  upact		active-file updater, much improved from past incarnations
--- 3,8 ----

*** expire/expire.c.mastercopy	Sun Nov 27 20:05:08 1994
--- expire/expire.c	Tue Oct 18 23:55:56 1994
***************
*** 20,26 ****
  #include "libc.h"
  #include "news.h"
  #include "config.h"
! #include "fgetmfs.h"
  #include "case.h"
  #include "dbz.h"
  #include "ngmatch.h"
--- 20,26 ----
  #include "libc.h"
  #include "news.h"
  #include "config.h"
! #include "fgetfln.h"
  #include "case.h"
  #include "dbz.h"
  #include "ngmatch.h"
***************
*** 47,52 ****
--- 47,54 ----
  	time_t normal;		/* earliest not expired in default case */
  	time_t purge;		/* latest arrival date always expired */
  	char *dir;		/* Archive dir or NULL. */
+ 	long ngroups;		/* for explist, number of groups dealt with */
+ 	int lineno;		/* line number in explist */
  };
  
  /* header for internal form of control file */
***************
*** 144,149 ****
--- 146,152 ----
  void die();
  void control();
  void prime();
+ void checkused();
  void doit();
  void cd();
  time_t readdate();
***************
*** 280,296 ****
  control(f)
  register FILE *f;
  {
- 	char line[200];		/* long enough for any sane line */
  	register char *p;
  	register int gotone = 0;
  
! 	while (fgets(line, sizeof(line), f) != NULL) {
! 		p = &line[strlen(line) - 1];
! 		if (*p != '\n')
! 			die("control line `%.30s...' too long", line);
! 		*p = '\0';
! 		if (line[0] != '#')
! 			ctlline(line);
  		gotone = 1;
  	}
  
--- 283,296 ----
  control(f)
  register FILE *f;
  {
  	register char *p;
  	register int gotone = 0;
+ 	register int lineno = 0;
  
! 	while ((p = fgetline(f, (size_t *)NULL)) != NULL) {
! 		lineno++;
! 		if (*p != '#')
! 			ctlline(p, lineno);
  		gotone = 1;
  	}
  
***************
*** 302,309 ****
   - ctlline - process one control-file line
   */
  void
! ctlline(ctl)
  char *ctl;
  {
  	register struct ctl *ct;
  	char *field[4];
--- 302,310 ----
   - ctlline - process one control-file line
   */
  void
! ctlline(ctl, lineno)
  char *ctl;
+ int lineno;
  {
  	register struct ctl *ct;
  	char *field[4];
***************
*** 379,384 ****
--- 380,388 ----
  		checkadir(ct->dir);
  	}
  
+ 	ct->ngroups = 0;
+ 	ct->lineno = lineno;
+ 
  	/* put it where it belongs */
  	if (STREQ(ct->groups, "/expired/"))
  		holdover = ct;
***************
*** 410,422 ****
  	char *field[NFACT];
  	int nf;
  	register int hash;
- 	register int i;
  
  	af = eufopen(afile, "r");
! 	while ((line = fgetms(af)) != NULL) {
! 		i = strlen(line);
! 		if (i > 0)		/* Geoff's bloody useless \n */
! 			line[i-1] = '\0';
  		nf = split(line, field, NFACT, "");
  		if (nf != NFACT)
  			die("wrong number of fields in active for `%s'", field[0]);
--- 414,422 ----
  	char *field[NFACT];
  	int nf;
  	register int hash;
  
  	af = eufopen(afile, "r");
! 	while ((line = fgetline(af, (size_t *)NULL)) != NULL) {
  		nf = split(line, field, NFACT, "");
  		if (nf != NFACT)
  			die("wrong number of fields in active for `%s'", field[0]);
***************
*** 431,439 ****
  			hash = NHASH-1;
  		ct->next = ngs[hash];
  		ngs[hash] = ct;
- 		free(line);
  	}
  	(void) fclose(af);
  }
  
  /*
--- 431,440 ----
  			hash = NHASH-1;
  		ct->next = ngs[hash];
  		ngs[hash] = ct;
  	}
  	(void) fclose(af);
+ 
+ 	checkused();
  }
  
  /*
***************
*** 453,458 ****
--- 454,460 ----
  			ct->normal = cscan->normal;
  			ct->purge = cscan->purge;
  			ct->dir = cscan->dir;
+ 			cscan->ngroups++;
  			return;
  		}
  
***************
*** 463,468 ****
--- 465,488 ----
  }
  
  /*
+  - checkused - check that all lines of the control file got used
+  */
+ void
+ checkused()
+ {
+ 	register struct ctl *cscan;
+ 	char grump[100];
+ 
+ 	for (cscan = ctls; cscan != NULL; cscan = cscan->next)
+ 		if (cscan->ngroups == 0) {
+ 			sprintf(grump,
+ 	"warning: line %d of control file controls no active newsgroups",
+ 								cscan->lineno);
+ 			complain(grump, "");
+ 		}
+ }
+ 
+ /*
   - doit - file manipulation and master control
   */
  void
***************
*** 1053,1076 ****
  	register char *p;
  
  	ocmd = str3save("PATH=", ctlfile("bin"), ":");
! 	cmd = str3save(ocmd, binfile("expire"), ":");
  	free(ocmd);
  	ocmd = cmd;
  	/* the semicolon here avoids problems with some buggy shells */
! 	cmd = str3save(ocmd, newspath(), " ; mkadir");
  	free(ocmd);
  	ocmd = cmd;
! 	cmd = str3save(ocmd, " ", dir);
  	free(ocmd);
! 	p = strchr(art, '/');
! 	while (p != NULL) {
! 		*p = '\0';
! 		ocmd = cmd;
! 		cmd = str3save(ocmd, " ", art);
! 		free(ocmd);
! 		*p = '/';
! 		p = strchr(p+1, '/');
! 	}
  	(void) system(cmd);
  	free(cmd);
  }
--- 1073,1093 ----
  	register char *p;
  
  	ocmd = str3save("PATH=", ctlfile("bin"), ":");
! 	cmd = str3save(ocmd, binfile((char *)NULL), ":");
  	free(ocmd);
  	ocmd = cmd;
  	/* the semicolon here avoids problems with some buggy shells */
! 	cmd = str3save(ocmd, newspath(), " ; mkpdir ");
  	free(ocmd);
  	ocmd = cmd;
! 	cmd = str3save(ocmd, dir, "/");
  	free(ocmd);
! 	p = strrchr(art, '/');
! 	*p = '\0';
! 	ocmd = cmd;
! 	cmd = str3save(ocmd, art, "");
! 	free(ocmd);
! 	*p = '/';
  	(void) system(cmd);
  	free(cmd);
  }

*** expire/makefile.mastercopy	Sun Nov 27 20:05:09 1994
--- expire/makefile	Sat Oct 22 23:59:20 1994
***************
*** 2,10 ****
  .include "../include/config.make"
  
  BINS=expire
! PROGS=$(BINS) upact doexpire mkadir expireiflow
  DEST=$(NEWSBIN)/expire
  ALL=$(PROGS) explist.eg
  
  all:	$(ALL)
  	$(MX) $(PROGS)
--- 2,12 ----
  .include "../include/config.make"
  
  BINS=expire
! PROGS=$(BINS) upact doexpire expireiflow
  DEST=$(NEWSBIN)/expire
  ALL=$(PROGS) explist.eg
+ UPACTOPT=
+ UPACTBARF=
  
  all:	$(ALL)
  	$(MX) $(PROGS)
***************
*** 34,40 ****
  lint:	expire.c
  	lint $(LINTFLAGS) expire.c 2>&1
  
! explist.reg:
  	rm -f $@
  	echo "/expired/	x	0.08	-" >>$@
  	echo '/bounds/	x	0.01-0.1-0.11	- ' >>$@
--- 36,42 ----
  lint:	expire.c
  	lint $(LINTFLAGS) expire.c 2>&1
  
! explist.regw:
  	rm -f $@
  	echo "/expired/	x	0.08	-" >>$@
  	echo '/bounds/	x	0.01-0.1-0.11	- ' >>$@
***************
*** 46,63 ****
  	echo 'mod	u	0.05	-' >>$@
  	echo 'urp	x	0.01-0.05-0.1	-' >>$@
  	echo "bletch	x	0.1	=`pwd`/arch3/bletch" >>$@
  	echo 'all	x	0.1	@' >>$@
  
  ../util/dbz:
! 	( cd ../util ; $(MAKE) dbz )
  
  # setup for regression test
! rsetup:	$(PROGS) ../util/dbz explist.reg
  	$(MX) $(PROGS) dircheck
  	>history.pag
  	>history.dir
  	mkdir bin
! 	cp mkadir ../util/dbz bin
  	echo 'exit 0' >bin/lock
  	echo 'exit 0' >bin/unlock
  	echo 'echo 10' >bin/spacefor
--- 48,84 ----
  	echo 'mod	u	0.05	-' >>$@
  	echo 'urp	x	0.01-0.05-0.1	-' >>$@
  	echo "bletch	x	0.1	=`pwd`/arch3/bletch" >>$@
+ 	echo 'unused	x	1	-' >>$@
  	echo 'all	x	0.1	@' >>$@
  
+ explist.reg:	explist.regw
+ 	rm -f $@
+ 	egrep -v '^unused' explist.regw >$@
+ 
+ UTILS=../util/dbz ../util/mkpdir
+ 
  ../util/dbz:
! 	cd ../util ; $(MAKE) dbz
! 
! ../util/mkpdir:
! 	cd ../util ; $(MAKE) mkpdir
! 
! BARFS=active.barf active.nobarf
! AB=active.$(UPACTBARF)barf
! 
! active.barf:
! 	echo 'barf.puke 01111 01112 y' >$@
! 
! active.nobarf:
! 	touch $@
  
  # setup for regression test
! rsetup:	$(PROGS) $(UTILS) explist.reg explist.regw $(BARFS)
  	$(MX) $(PROGS) dircheck
  	>history.pag
  	>history.dir
  	mkdir bin
! 	cp ../util/dbz ../util/mkpdir bin
  	echo 'exit 0' >bin/lock
  	echo 'exit 0' >bin/unlock
  	echo 'echo 10' >bin/spacefor
***************
*** 65,72 ****
  	mkdir arts arts/foo arts/bar arts/bar/ugh arts/urp arch arch2
  	mkdir arts/mod arts/mod/mod arts/mod/unmod arch3 arch3/bletch
  	mkdir arts/bletch arts/lost+found arts/barf arts/barf/puke
! 	echo 'foo 00099 00000 y ' >>active
! 	echo 'foo 00099 00001 y' >>active.after
  	echo 'bar 00099 00000 m' >>active
  	echo 'bar 00099 00100 m' >>active.after
  	echo 'bar.ugh 00099 00000 m' >>active
--- 86,93 ----
  	mkdir arts arts/foo arts/bar arts/bar/ugh arts/urp arch arch2
  	mkdir arts/mod arts/mod/mod arts/mod/unmod arch3 arch3/bletch
  	mkdir arts/bletch arts/lost+found arts/barf arts/barf/puke
! 	echo 'foo 00103 00000 y ' >>active
! 	echo 'foo 00103 00098 y' >>active.after
  	echo 'bar 00099 00000 m' >>active
  	echo 'bar 00099 00100 m' >>active.after
  	echo 'bar.ugh 00099 00000 m' >>active
***************
*** 79,94 ****
  	echo 'mod.unmod 00016 00016 y' >>active.after
  	echo 'bletch 00099 00000 y' >>active
  	echo 'bletch 00099 00100 y' >>active.after
! 	echo 'barf.puke 01111 01112 y' >>active
! 	echo 'barf.puke 01111 01112 y' >>active.after
  	echo nevermore >arts/lost+found/1
! 	echo '<wont1>	9999~-	foo/1' >>history.proto
! 	echo :foo/1: >arts/foo/1
! 	echo 'MeSsAge-ID: <wont1>' >>arts/foo/1
! 	echo '<will2>	1000~-	foo/2' >>history.proto
! 	echo foo/2 >arts/foo/2
! 	echo '<will3>	1000~100	foo/3' >>history.proto
! 	echo foo/3 >arts/foo/3
  	echo '<two4>	100	bar/4' >>history.proto
  	echo :bar/4: >arts/bar/4
  	echo 'SuBjeCt: yes' >>arts/bar/4
--- 100,115 ----
  	echo 'mod.unmod 00016 00016 y' >>active.after
  	echo 'bletch 00099 00000 y' >>active
  	echo 'bletch 00099 00100 y' >>active.after
! 	cat $(AB) >>active
! 	cat $(AB) >>active.after
  	echo nevermore >arts/lost+found/1
! 	echo '<wont1>	9999~-	foo/98' >>history.proto
! 	echo :foo/98: >arts/foo/98
! 	echo 'MeSsAge-ID: <wont1>' >>arts/foo/98
! 	echo '<will2>	1000~-	foo/99' >>history.proto
! 	echo foo/99 >arts/foo/99
! 	echo '<will3>	1000~100	foo/100' >>history.proto
! 	echo foo/100 >arts/foo/100
  	echo '<two4>	100	bar/4' >>history.proto
  	echo :bar/4: >arts/bar/4
  	echo 'SuBjeCt: yes' >>arts/bar/4
***************
*** 105,118 ****
  	echo '<gone8>	100~20000	urp/8' >>history.proto
  	echo urp/8 >arts/urp/8
  	echo '<gone9>	100~-	urp/9' >>history.proto
! 	echo '<wont10>	1000~20000	foo/10' >>history.proto
! 	echo :foo/10: >arts/foo/10
! 	echo 'Message-ID: <wont10>' >>arts/foo/10
! 	echo 'Expires:  20000' >>arts/foo/10
! 	echo 'Supersedes: <wont1>' >>arts/foo/10
! 	echo >>arts/foo/10
! 	echo '<will11>	100~20000	foo/11' >>history.proto
! 	echo foo/11 >arts/foo/11
  	echo '<will12>	100~-	mod.mod/12' >>history.proto
  	echo mod/mod/12 >arts/mod/mod/12
  	echo '<wont13>	2000	mod.mod/13' >>history.proto
--- 126,139 ----
  	echo '<gone8>	100~20000	urp/8' >>history.proto
  	echo urp/8 >arts/urp/8
  	echo '<gone9>	100~-	urp/9' >>history.proto
! 	echo '<wont10>	1000~20000	foo/101' >>history.proto
! 	echo :foo/101: >arts/foo/101
! 	echo 'Message-ID: <wont10>' >>arts/foo/101
! 	echo 'Expires:  20000' >>arts/foo/101
! 	echo 'Supersedes: <wont1>' >>arts/foo/101
! 	echo >>arts/foo/101
! 	echo '<will11>	100~20000	foo/102' >>history.proto
! 	echo foo/102 >arts/foo/102
  	echo '<will12>	100~-	mod.mod/12' >>history.proto
  	echo mod/mod/12 >arts/mod/mod/12
  	echo '<wont13>	2000	mod.mod/13' >>history.proto
***************
*** 133,145 ****
  	echo '<gone98>	5000~-	urp/98' >>history.proto
  	echo '<gone98>	5000~-' >>history.after
  	echo urp/98 >arts/urp/98
! 	echo '<multi99>	5000~-	bar/99, bar.ugh/99  foo/99 urp/99' >>history.proto
! 	echo '<multi99>	5000~-	bar.ugh/99 foo/99' >>history.after
! 	echo :foo/99:bar/99:bar/ugh/99:urp/99: >arts/foo/99
! 	echo 'Message-ID:  <multi99>' >>arts/foo/99
! 	ln arts/foo/99 arts/bar/99
! 	ln arts/foo/99 arts/bar/ugh/99
! 	ln arts/foo/99 arts/urp/99
  	cp history.proto history
  
  # regression test machinery
--- 154,166 ----
  	echo '<gone98>	5000~-	urp/98' >>history.proto
  	echo '<gone98>	5000~-' >>history.after
  	echo urp/98 >arts/urp/98
! 	echo '<multi99>	5000~-	bar/99, bar.ugh/99  foo/103 urp/99' >>history.proto
! 	echo '<multi99>	5000~-	bar.ugh/99 foo/103' >>history.after
! 	echo :foo/103:bar/99:bar/ugh/99:urp/99: >arts/foo/103
! 	echo 'Message-ID:  <multi99>' >>arts/foo/103
! 	ln arts/foo/103 arts/bar/99
! 	ln arts/foo/103 arts/bar/ugh/99
! 	ln arts/foo/103 arts/urp/99
  	cp history.proto history
  
  # regression test machinery
***************
*** 160,166 ****
  
  # the regression test proper
  r:	$(PROGS) rclean rsetup dircheck tgood pgood
! 	$(RUN) -c explist.reg
  	: "okay, it's sane"
  	$(RUN) -t explist.reg >test.out 2>&1
  	sed $(FIXPATHS) test.out | cmp - tgood
--- 181,189 ----
  
  # the regression test proper
  r:	$(PROGS) rclean rsetup dircheck tgood pgood
! 	$(RUN) -c explist.regw >test.out 2>test.stderr
! 	test ! -s test.out ;
! 	cmp wgood test.stderr || diff wgood test.stderr
  	: "okay, it's sane"
  	$(RUN) -t explist.reg >test.out 2>&1
  	sed $(FIXPATHS) test.out | cmp - tgood
***************
*** 178,198 ****
  	egrep 'will|wont|gone|three' history.proto | ./dircheck -n arch2
  	egrep three history.proto | ./dircheck arch3
  	egrep 'will|wont|gone|two' history.proto | ./dircheck -n arch3
! 	test -f arts/foo/99 ;
  	test -f arts/bar/ugh/99 ;
  	test -f arch2/bar/99 ;
  	test ! -f arts/urp/99 ;
  	cmp history history.after
  	: "that's it for expire, on to upact"
! 	$(HERE) ./upact '-#'
! 	cmp active.tmp active.after
  	test ! -s active.errs ;
  	mv active.tmp active
! 	$(HERE) ./upact
! 	cmp active active.after
! 	sed '/^foo /s/99/09/' active.after >active
! 	$(HERE) ./upact -b
! 	cmp active active.after
  	: "success!"
  
  rclean:
--- 201,221 ----
  	egrep 'will|wont|gone|three' history.proto | ./dircheck -n arch2
  	egrep three history.proto | ./dircheck arch3
  	egrep 'will|wont|gone|two' history.proto | ./dircheck -n arch3
! 	test -f arts/foo/103 ;
  	test -f arts/bar/ugh/99 ;
  	test -f arch2/bar/99 ;
  	test ! -f arts/urp/99 ;
  	cmp history history.after
  	: "that's it for expire, on to upact"
! 	$(HERE) ./upact $(UPACTOPT) '-#'
! 	cmp active.after active.tmp || diff active.after active.tmp
  	test ! -s active.errs ;
  	mv active.tmp active
! 	$(HERE) ./upact $(UPACTOPT)
! 	cmp active.after active || diff active.after active
! 	sed '/^foo /s/103/009/' active.after >active
! 	$(HERE) ./upact -b $(UPACTOPT)
! 	cmp active.after active || diff active.after active
  	: "success!"
  
  rclean:
***************
*** 199,205 ****
  	rm -f junk history history.pag history.dir history.o active active.tmp
  	rm -f history.n* *mon.out history.proto history.after test.out doit
  	rm -f active.old active.new explist.reg lint active.after test.stderr
! 	rm -f active.errs
  	rm -rf arts arch arch2 arch3 bin
  
  clean:	rclean
--- 222,228 ----
  	rm -f junk history history.pag history.dir history.o active active.tmp
  	rm -f history.n* *mon.out history.proto history.after test.out doit
  	rm -f active.old active.new explist.reg lint active.after test.stderr
! 	rm -f active.errs explist.regw $(BARFS)
  	rm -rf arts arch arch2 arch3 bin
  
  clean:	rclean

*** expire/tgood.mastercopy	Sun Nov 27 20:05:10 1994
--- expire/tgood	Sat Oct 22 22:51:32 1994
***************
*** 1,11 ****
! copy foo/2 P/arch ; remove foo/2
! copy foo/3 P/arch ; remove foo/3
  copy bar/4 P/arch2 ; remove bar/4
  copy bar/ugh/5 P/arch ; remove bar/ugh/5
  remove urp/6
  remove urp/8
  remove urp/9
! copy foo/11 P/arch ; remove foo/11
  copy mod/mod/12 P/arch ; remove mod/mod/12
  remove mod/unmod/14
  remove mod/unmod/15
--- 1,11 ----
! copy foo/99 P/arch ; remove foo/99
! copy foo/100 P/arch ; remove foo/100
  copy bar/4 P/arch2 ; remove bar/4
  copy bar/ugh/5 P/arch ; remove bar/ugh/5
  remove urp/6
  remove urp/8
  remove urp/9
! copy foo/102 P/arch ; remove foo/102
  copy mod/mod/12 P/arch ; remove mod/mod/12
  remove mod/unmod/14
  remove mod/unmod/15

*** expire/pgood.mastercopy	Sun Nov 27 20:05:10 1994
--- expire/pgood	Sat Oct 22 22:52:23 1994
***************
*** 1,8 ****
! foo/2	<will2>	1-Jan-1970	???
! foo/3	<will3>	1-Jan-1970	???
  bar/4	<two4>	1-Jan-1970	yes
  bar/ugh/5	<will5>	1-Jan-1970	???
! foo/11	<will11>	1-Jan-1970	???
  mod/mod/12	<will12>	1-Jan-1970	???
  bletch/17	<three17>	1-Jan-1970	???
  bar/99	<multi99>	1-Jan-1970	???
--- 1,8 ----
! foo/99	<will2>	1-Jan-1970	???
! foo/100	<will3>	1-Jan-1970	???
  bar/4	<two4>	1-Jan-1970	yes
  bar/ugh/5	<will5>	1-Jan-1970	???
! foo/102	<will11>	1-Jan-1970	???
  mod/mod/12	<will12>	1-Jan-1970	???
  bletch/17	<three17>	1-Jan-1970	???
  bar/99	<multi99>	1-Jan-1970	???

*** expire/doexpire.mastercopy	Sun Nov 27 20:05:11 1994
--- expire/doexpire	Fri Nov 11 11:58:02 1994
***************
*** 100,106 ****
  
  if test -s /tmp/doex$$
  then
! 	report 'possible expire problems' </tmp/doex$$
  else
  	status=0
  fi
--- 100,106 ----
  
  if test -s /tmp/doex$$
  then
! 	report -u 'possible expire problems' </tmp/doex$$
  else
  	status=0
  fi

*** expire/upact.mastercopy	Sun Nov 27 20:05:11 1994
--- expire/upact	Thu Nov 10 10:10:29 1994
***************
*** 4,10 ****
  # =()<. ${NEWSCONFIG-@<NEWSCONFIG>@}>()=
  . ${NEWSCONFIG-/etc/news/bin/config}
  
! PATH=$NEWSCTL/bin:$NEWSBIN:$NEWSPATH ; export PATH
  umask $NEWSUMASK
  
  maxlen=200			# max length for shell cmd; 200 is pretty safe
--- 4,10 ----
  # =()<. ${NEWSCONFIG-@<NEWSCONFIG>@}>()=
  . ${NEWSCONFIG-/etc/news/bin/config}
  
! PATH=$NEWSCTL/bin:$NEWSBIN/maint:$NEWSBIN:$NEWSPATH ; export PATH
  umask $NEWSUMASK
  
  maxlen=200			# max length for shell cmd; 200 is pretty safe
***************
*** 29,43 ****
  cd $NEWSCTL
  
  # check out the active file
! nf=`sed 1q active | awk '{print NF}'`
! if test $nf -ne 4
  then
! 	echo "$0: active file has other than 4 fields" >&2
  	exit 1
  fi
  if test " `awk '{print $1}' active | sort | uniq -d`" != " "
  then
! 	echo "$0: duplicate entries in active file, unable to run" >&2
  	exit 1
  fi
  
--- 29,45 ----
  cd $NEWSCTL
  
  # check out the active file
! checkactive -q >active.eek
! if test -s active.eek
  then
! 	echo "$0: problems in active file -- aborting" >&2
! 	cat active.eek >&2
! 	rm -f active.eek
  	exit 1
  fi
  if test " `awk '{print $1}' active | sort | uniq -d`" != " "
  then
! 	echo "$0: duplicate newsgroups in active file, unable to run" >&2
  	exit 1
  fi
  
***************
*** 81,90 ****
  		dir = ""
  	}
  	$0 ~ /^[0-9]+$/ {
! 		if ($0 < lowest)
! 			lowest = $0
! 		if ($0 > highest)
! 			highest = $0
  		next
  	}
  	$0 ~ /\/\.:$/ {
--- 83,93 ----
  		dir = ""
  	}
  	$0 ~ /^[0-9]+$/ {
! 		# some old awks do not think $0 is numeric, so use $1
! 		if ($1 < lowest)
! 			lowest = $1
! 		if ($1 > highest)
! 			highest = $1
  		next
  	}
  	$0 ~ /\/\.:$/ {
***************
*** 135,144 ****
  	}' >active.tmp
  
  # check that everything looks okay
! awk '$2 ~ /e/ || $3 ~ /e/' active.tmp >active.eek
  if test -s active.eek
  then
! 	echo "$0: setting awk OFMT doesn't work -- aborting" >&2
  	exit			# with status=1
  fi
  if test `wc -l <active.tmp` -lt `wc -l <active`
--- 138,148 ----
  	}' >active.tmp
  
  # check that everything looks okay
! checkactive -q active.tmp >active.eek
  if test -s active.eek
  then
! 	echo "$0: errors in active.tmp -- aborting" >&2
! 	cat active.eek >&2
  	exit			# with status=1
  fi
  if test `wc -l <active.tmp` -lt `wc -l <active`

*** expire/wgood.mastercopy	Sun Nov 27 20:05:12 1994
--- expire/wgood	Tue Oct 18 13:47:17 1994
***************
*** 0 ****
--- 1 ----
+ ./expire: warning: line 11 of control file controls no active newsgroups

*** explode/makefile.mastercopy	Sun Nov 27 20:05:12 1994
--- explode/makefile	Sun Nov  6 21:32:16 1994
***************
*** 35,41 ****
  	echo "exit 0" >bin/unlock
  	echo "echo 5" >bin/sizeof
  	echo "echo 1000" >bin/spacefor
! 	echo "( echo \"$$*\" ; echo ::: ; cat ) >&2" >bin/report
  	cp $(BINS) bin
  	$(MX) bin/*
  	echo hostb >whoami
--- 35,42 ----
  	echo "exit 0" >bin/unlock
  	echo "echo 5" >bin/sizeof
  	echo "echo 1000" >bin/spacefor
! 	echo "( echo \"\$$*\" ; echo ::: ; cat ) >&2" >bin/report
! 	echo "echo 12345" >bin/now
  	cp $(BINS) bin
  	$(MX) bin/*
  	echo hostb >whoami
***************
*** 43,48 ****
--- 44,59 ----
  	cp om.0 arts/out.master/0
  	mkdir arts/out.going
  	mkdir arts/out.going/foo arts/out.going/bar arts/out.going/baz
+ 	$(HERE) ./doexplode >stdout 2>stderr
+ 	test ! -s stdout ;
+ 	cmp om.err stderr || diff om.err stderr
+ 	test " `ls arts/out.master`" = " 0.12345" ;
+ 	cmp om.0 arts/out.master/0.12345 || diff om.0 arts/out.master/0.12345
+ 	cmp og.foo arts/out.going/foo/togo || diff og.foo arts/out.going/foo/togo
+ 	cmp og.bar arts/out.going/bar/togo || diff og.bar arts/out.going/bar/togo
+ 	cmp og.baz arts/out.going/baz/togo || diff og.baz arts/out.going/baz/togo
+ 	rm -f arts/out.master/0.12345 arts/out.going/*/togo stdout stderr
+ 	egrep -v nope om.0 >arts/out.master/0
  	$(HERE) ./doexplode >stdout 2>stderr
  	test ! -s stdout ;
  	test ! -s stderr ;

*** explode/trbatch.c.mastercopy	Sun Nov 27 20:05:13 1994
--- explode/trbatch.c	Mon Nov  7 00:01:28 1994
***************
*** 40,46 ****
  	bf = bfincache(name);
  	if (bf->bf_str == NULL) {
  		bf->bf_str = fopenclex(name, "a");	/* silent try */
! 		if (bf->bf_str == NULL) {
  			if (bfrclose() != ST_OKAY)
  				return NULL;
  			errno = 0;
--- 40,47 ----
  	bf = bfincache(name);
  	if (bf->bf_str == NULL) {
  		bf->bf_str = fopenclex(name, "a");	/* silent try */
! 		if (bf->bf_str == NULL && errno == EMFILE) {
! 			/* try to free up a descriptor */
  			if (bfrclose() != ST_OKAY)
  				return NULL;
  			errno = 0;
***************
*** 47,53 ****
  			warning(
  	"had to close a descriptor to reuse it; this should not happen!", "");
  				/* bad input? canthappen? */
! 			/* retry, may bitch */
  			bf->bf_str = fopenwclex(name, "a");
  		}
  		if (bf->bf_str != NULL)
--- 48,56 ----
  			warning(
  	"had to close a descriptor to reuse it; this should not happen!", "");
  				/* bad input? canthappen? */
! 		}
! 		if (bf->bf_str == NULL) {
! 			/* retry, noisily this time */
  			bf->bf_str = fopenwclex(name, "a");
  		}
  		if (bf->bf_str != NULL)

*** explode/doexplode.mastercopy	Sun Nov 27 20:05:13 1994
--- explode/doexplode	Sun Nov  6 19:18:26 1994
***************
*** 33,39 ****
  				report -u "explode unable to rename file"
  		exit
  	fi
! 	if explode out.master/$work 2>/tmp/ex$$
  	then
  		rm -f out.master/$work
  	else
--- 33,39 ----
  				report -u "explode unable to rename file"
  		exit
  	fi
! 	if explode out.master/$work 2>/tmp/ex$$ && test ! -s /tmp/ex$$
  	then
  		rm -f out.master/$work
  	else

*** explode/om.0.mastercopy	Sun Nov 27 20:05:14 1994
--- explode/om.0	Sun Nov  6 21:21:18 1994
***************
*** 13,18 ****
--- 13,19 ----
  f out.going/foo/togo
  f out.going/bar/togo
  f out.going/baz/togo
+ f out.going/nope/togo
  <#5@host> control/1 192
  f out.going/foo/togo
  f out.going/bar/togo

*** explode/om.err.mastercopy	Sun Nov 27 20:05:14 1994
--- explode/om.err	Sun Nov  6 23:55:59 1994
***************
*** 0 ****
--- 1,3 ----
+ -u explode failed on out.master/0.12345
+ :::
+ explode: can't open `out.going/nope/togo' (No such file or directory)

*** input/makefile.mastercopy	Sun Nov 27 20:05:15 1994
--- input/makefile	Sun Oct 23 00:58:44 1994
***************
*** 8,18 ****
  DEST=$(NEWSBIN)/input
  DBIN=$(NEWSBIN)/decompressors
  DECS=c7decode bdecode gunzip
  
  BATCH=../batch
  
  all:	$(ALL)
! 	$(MX) $(PROGS)
  
  install:	$(PROGS)
  	$(MKDIR) $(DEST) $(DBIN)
--- 8,19 ----
  DEST=$(NEWSBIN)/input
  DBIN=$(NEWSBIN)/decompressors
  DECS=c7decode bdecode gunzip
+ PGMS=$(PROGS) $(DECS)
  
  BATCH=../batch
  
  all:	$(ALL)
! 	$(MX) $(PGMS)
  
  install:	$(PROGS)
  	$(MKDIR) $(DEST) $(DBIN)
***************
*** 104,110 ****
  	echo 'here is a phony third batch' >>$@
  
  rsetup:	$(ALL) rclean
! 	$(MX) $(PROGS)
  	mkdir bin
  	echo "shift;shift;shift;cat \$$* >>`pwd`/tmp.1" >bin/relaynews
  	echo "echo 10" >bin/spacefor
--- 105,111 ----
  	echo 'here is a phony third batch' >>$@
  
  rsetup:	$(ALL) rclean
! 	$(MX) $(PGMS)
  	mkdir bin
  	echo "shift;shift;shift;cat \$$* >>`pwd`/tmp.1" >bin/relaynews
  	echo "echo 10" >bin/spacefor

*** libcnews/mkinperm.c.mastercopy	Sun Nov 27 20:05:15 1994
--- libcnews/mkinperm.c	Tue Nov  8 22:33:43 1994
***************
*** 22,29 ****
  #define	MAXTRIES	100	/* limit on attempts to make links */
  #endif
  
- #define JAN1991 (time_t)662706000
- 
  int mkinpdebug = 0;
  char *progname;
  
--- 22,27 ----
***************
*** 44,50 ****
  	(void) strcpy(name, p);
  	p = name + strlen(name);
  
! 	now = time((time_t *)NULL) - JAN1991;	/* reduce range */
  	for (ntries = 0; ; ntries++) {
  		(void) sprintf(p, "%s%ld%c%s", grade, now, uniq, class);
  		if (mkinpdebug)
--- 42,48 ----
  	(void) strcpy(name, p);
  	p = name + strlen(name);
  
! 	now = time((time_t *)NULL);
  	for (ntries = 0; ; ntries++) {
  		(void) sprintf(p, "%s%ld%c%s", grade, now, uniq, class);
  		if (mkinpdebug)
***************
*** 63,69 ****
  			uniq = 'A';
  		else if (uniq == 'Z'+1) {
  			(void) sleep(2);
! 			now = time((time_t *)NULL) - JAN1991; /* reduce range */
  			uniq = '0';
  		}
  		if (mkinpdebug)
--- 61,67 ----
  			uniq = 'A';
  		else if (uniq == 'Z'+1) {
  			(void) sleep(2);
! 			now = time((time_t *)NULL);
  			uniq = '0';
  		}
  		if (mkinpdebug)

*** libdbz/dbz.c.mastercopy	Sun Nov 27 20:05:17 1994
--- libdbz/dbz.c	Tue Nov 15 12:49:25 1994
***************
*** 518,524 ****
  	stop <<= 1;
  
  	/* try odd numbers up to stop */
! 	for (div = *--ip; div < stop; div += 2)
  		if (x%div == 0)
  			return(0);
  
--- 518,524 ----
  	stop <<= 1;
  
  	/* try odd numbers up to stop */
! 	for (div = *--ip + 2; div < stop; div += 2)
  		if (x%div == 0)
  			return(0);

*** libdbz/makefile.mastercopy	Sun Nov 27 20:05:18 1994
--- libdbz/makefile	Tue Oct 25 15:47:40 1994
***************
*** 42,58 ****
  rdbz.o:	dbz.c
  	cp dbz.c rdbz.c
  	$(CC) $(CFLAGS) $(DEBUG) -DDEFSIZE=$(RSIZE) -c rdbz.c
! 	rm rdbz.c
  
  rdbzmain.o:	dbzmain.c
  	cp dbzmain.c rdbzmain.c
  	$(CC) $(CFLAGS) $(RFC) -c rdbzmain.c
! 	rm rdbzmain.c
  
  tdbz.o:	dbz.c
  	cp dbz.c tdbz.c
  	$(CC) $(CFLAGS) -DDEFSIZE=$(TSIZE) -c tdbz.c
! 	rm tdbz.c
  
  tdbz:	dbzmain.o tdbz.o dbzdbm.o
  	$(CC) $(LDFLAGS) dbzmain.o tdbz.o dbzdbm.o $(LIBS) -o $@
--- 42,58 ----
  rdbz.o:	dbz.c
  	cp dbz.c rdbz.c
  	$(CC) $(CFLAGS) $(DEBUG) -DDEFSIZE=$(RSIZE) -c rdbz.c
! 	rm -f rdbz.c
  
  rdbzmain.o:	dbzmain.c
  	cp dbzmain.c rdbzmain.c
  	$(CC) $(CFLAGS) $(RFC) -c rdbzmain.c
! 	rm -f rdbzmain.c
  
  tdbz.o:	dbz.c
  	cp dbz.c tdbz.c
  	$(CC) $(CFLAGS) -DDEFSIZE=$(TSIZE) -c tdbz.c
! 	rm -f tdbz.c
  
  tdbz:	dbzmain.o tdbz.o dbzdbm.o
  	$(CC) $(LDFLAGS) dbzmain.o tdbz.o dbzdbm.o $(LIBS) -o $@
***************
*** 80,86 ****
  	: crude check of synthetic history file
  	( sed 25q $(RHIST) ; tail -25 $(RHIST) ) >histjunk
  	cmp histjunk firstlast25
! 	rm histjunk
  	: basic tests, exercising as many options as possible
  	cp $(RHIST) dbase
  	mkdir xx
--- 80,86 ----
  	: crude check of synthetic history file
  	( sed 25q $(RHIST) ; tail -25 $(RHIST) ) >histjunk
  	cmp histjunk firstlast25
! 	rm -f histjunk
  	: basic tests, exercising as many options as possible
  	cp $(RHIST) dbase
  	mkdir xx
***************
*** 159,165 ****
  
  rclean:
  	rm -f dbase dbase[23] dbase.* dbase[23].* fake fake.o random.o
! 	rm -f rdbz rdbz.o rdbzmain.o $(RHIST) $(R2HIST) byteflip byteflip.o
  	rm -f histjunk core
  	test ! -d xx || rmdir xx
  
--- 159,165 ----
  
  rclean:
  	rm -f dbase dbase[23] dbase.* dbase[23].* fake fake.o random.o
! 	rm -f rdbz rdbz.o rdbzmain.? $(RHIST) $(R2HIST) byteflip byteflip.o
  	rm -f histjunk core
  	test ! -d xx || rmdir xx