[news.software.b] C News patch of 7-Jul-1989

henry@utzoo.uucp (Henry Spencer) (07/08/89)

Here is another C News patch.  This one is mostly small stuff; in particular,
we haven't had time to work dbz in as we intend, so that's postponed to the
next one.  This patch:

	- fixes some small bugs in the software
	- revises batcher logging and error reporting
	- provides for use of non-standard system libraries
	- works around the SVID violation in many System V makes (which
		shows up if your machine has no /bin/test)
	- augments the stdio-compatibility checker so it catches the
		compatibility problem on A/UX (but not, yet, SunOS 4.0)
	- adds documentation on the log formats
	- makes assorted minor fixes to documentation

start of patch 7-Jul-1989
this should be run with   patch -p0 <thisfile

The following are obsolete and should be deleted (there is no
easy way we can convince patch to do this automatically):
notebook/tmac.pic

Like to use Prereq, but it is broken in some versions of patch.
*** tmp.dates.with.really.long.filename.for.patch	Fri Jul  7 15:27:01 1989
--- PATCHDATES	Fri Jul  7 15:27:01 1989
***************
*** 1 ****
--- 1,2 ----
  23-Jun-1989
+ 7-Jul-1989

Changed files, if any:

*** cnpatch/tmp.file	Fri Jul  7 15:27:05 1989
--- batch/Makefile	Tue Jul  4 17:35:04 1989
***************
*** 26,38 ****
  	chmod +x $(PGMS)
  
  batcher:	batcher.o $(LIBS)
! 	$(CC) $(CFLAGS) $(LDFLAGS) batcher.o $(LIBS) -o $@
  
  c7encode:	c7encode.o $(LIBS)
! 	$(CC) $(CFLAGS) $(LDFLAGS) c7encode.o $(LIBS) -o $@
  
  bencode:	bencode.o crctab.o $(LIBS)
! 	$(CC) $(CFLAGS) bencode.o crctab.o $(LIBS) -o $@
  
  bencode.o:	coder.h
  
--- 26,38 ----
  	chmod +x $(PGMS)
  
  batcher:	batcher.o $(LIBS)
! 	$(CC) $(CFLAGS) $(LDFLAGS) batcher.o $(PRE) $(LIBS) $(POST) -o $@
  
  c7encode:	c7encode.o $(LIBS)
! 	$(CC) $(CFLAGS) $(LDFLAGS) c7encode.o $(PRE) $(LIBS) $(POST) -o $@
  
  bencode:	bencode.o crctab.o $(LIBS)
! 	$(CC) $(CFLAGS) bencode.o crctab.o $(PRE) $(LIBS) $(POST) -o $@
  
  bencode.o:	coder.h
  
***************
*** 135,144 ****
  	echo bletch >test.good
  	cmp test.out test.good
  	>batchlog
- 	>batchlog.o
  	NEWSARTS=`pwd` NEWSCTL=`pwd` ./sendbatches
! 	test ! -s out.going/foo/output
! 	test ! -s out.going/bar/output
  	echo `pwd`/test.1 200 >out.going/foo/togo
  	echo `pwd`/test.2 200 >>out.going/foo/togo
  	echo `pwd`/test.3 200 >>out.going/foo/togo
--- 135,143 ----
  	echo bletch >test.good
  	cmp test.out test.good
  	>batchlog
  	NEWSARTS=`pwd` NEWSCTL=`pwd` ./sendbatches
! 	test ! -s out.going/foo/output ;
! 	test ! -s out.going/bar/output ;
  	echo `pwd`/test.1 200 >out.going/foo/togo
  	echo `pwd`/test.2 200 >>out.going/foo/togo
  	echo `pwd`/test.3 200 >>out.going/foo/togo
***************
*** 149,160 ****
  	NEWSARTS=`pwd` NEWSCTL=`pwd` ./sendbatches
  	cmp out.going/foo/output test.out1
  	cmp out.going/bar/output test.out2
! 	test ! -s out.going/foo/togo
! 	test ! -s out.going/bar/togo
  	cmp test.left out.going/bar/togo.2
! 	sed 1d batchlog.o >test.log
! 	test ! -s test.log
! 	sed 1d batchlog >test.log
  	echo 'bar	backlog 1 (batches flowing)' >test.good
  	cmp test.good test.log
  	rm -rf test.* togo out.going bin batchparms batchlog batchlog.*
--- 148,159 ----
  	NEWSARTS=`pwd` NEWSCTL=`pwd` ./sendbatches
  	cmp out.going/foo/output test.out1
  	cmp out.going/bar/output test.out2
! 	test ! -s out.going/foo/togo ;
! 	test ! -s out.going/bar/togo ;
  	cmp test.left out.going/bar/togo.2
! 	sed '/^$$/q' batchlog | sed '1d;$$d' >test.log
! 	test ! -s test.log ;
! 	sed '1,/^$$/d' batchlog | sed '1d;$$d' >test.log
  	echo 'bar	backlog 1 (batches flowing)' >test.good
  	cmp test.good test.log
  	rm -rf test.* togo out.going bin batchparms batchlog batchlog.*

*** cnpatch/tmp.file	Fri Jul  7 15:27:07 1989
--- batch/batchsplit	Wed Jul  5 00:03:29 1989
***************
*** 55,61 ****
  		if (NF == 1)
  			size = 3000	# Arbitrary guess.
  		else
! 			size = $2
  		if (total + size > limit && ninbatch > 0) {
  			# Go to next batch.
  			bno++
--- 55,61 ----
  		if (NF == 1)
  			size = 3000	# Arbitrary guess.
  		else
! 			size = $NF
  		if (total + size > limit && ninbatch > 0) {
  			# Go to next batch.
  			bno++

*** cnpatch/tmp.file	Fri Jul  7 15:27:12 1989
--- batch/sendbatches	Thu Jun 29 14:36:38 1989
***************
*** 10,16 ****
  origpath="$PATH"
  
  parms=$NEWSCTL/batchparms
! log=$NEWSCTL/batchlog		# also same with suffixes .o and .oo
  
  # lock against multiple simultaneous execution
  lock="$NEWSCTL/LOCKbatch"
--- 10,16 ----
  origpath="$PATH"
  
  parms=$NEWSCTL/batchparms
! log=$NEWSCTL/batchlog
  
  # lock against multiple simultaneous execution
  lock="$NEWSCTL/LOCKbatch"
***************
*** 61,69 ****
  esac
  
  # Start up logging.
! mv $log.o $log.oo
! mv $log $log.o
! date >$log
  
  # Run through them.
  for sys in $syses
--- 61,67 ----
  esac
  
  # Start up logging.
! date >>$log
  
  # Run through them.
  for sys in $syses
***************
*** 72,78 ****
  	here=$NEWSARTS/out.going/$sys
  	if test ! -d $here
  	then
! 		echo "$0: cannot find batch directory for \`$sys'" >>$log
  		continue
  	fi
  	cd $here
--- 70,77 ----
  	here=$NEWSARTS/out.going/$sys
  	if test ! -d $here
  	then
! 		echo "$0: cannot find batch directory for \`$sys'" |
! 							mail $NEWSMASTER
  		continue
  	fi
  	cd $here
***************
*** 95,101 ****
  	set $ctlline
  	if test " $#" -ne 6
  	then
! 		echo "$0: bad or missing batchparms line for \`$sys'" >>$log
  		continue
  	fi
  	batchsize=$2
--- 94,101 ----
  	set $ctlline
  	if test " $#" -ne 6
  	then
! 		echo "$0: bad or missing batchparms line for \`$sys'" |
! 							mail $NEWSMASTER
  		continue
  	fi
  	batchsize=$2
***************
*** 143,153 ****
  		them=`ls | egrep '^togo\.[0-9]' | sed "${nbatch}q"`
  		for f in $them
  		do
! 			if $batcher -d $NEWSARTS $f | $muncher | $sender $sys
  			then
! 				rm $f
  			else
! 				echo "$0: batching for \`$sys' failed" >>$log
  				exit 1
  			fi
  		done
--- 143,159 ----
  		them=`ls | egrep '^togo\.[0-9]' | sed "${nbatch}q"`
  		for f in $them
  		do
! 			( $batcher -d $NEWSARTS $f | $muncher |
! 						$sender $sys ) >/tmp/nb$$ 2>&1
! 			if test $? -eq 0 -a ! -s /tmp/nb$$
  			then
! 				rm $f /tmp/nb$$
  			else
! 				(
! 					echo "$0: batching $f for \`$sys' failed"
! 					cat /tmp/nb$$
! 					echo "$0: aborting"
! 				) | mail $NEWSMASTER
  				exit 1
  			fi
  		done
***************
*** 169,171 ****
--- 175,179 ----
  		echo "$sys	backlog $nart ($status)" >>$log
  	fi
  done
+ 
+ echo >>$log

*** cnpatch/tmp.file	Fri Jul  7 15:27:13 1989
--- batch/viainews	Tue Jul  4 19:18:17 1989
***************
*** 1,4 ****
  #! /bin/sh
  # Feed batch to inews, for ihave/sendme mostly.
  
! exec inews -h -W
--- 1,4 ----
  #! /bin/sh
  # Feed batch to inews, for ihave/sendme mostly.
  
! exec inews -h -W -A

*** cnpatch/tmp.file	Fri Jul  7 15:27:15 1989
--- conf/Makefile	Tue Jul  4 17:34:12 1989
***************
*** 32,38 ****
  	chmod +x subst
  	: too late for h and hfake, include has already been built
  	-egrep '^(h|hfake)/' subst.hs subst.gc >junk
! 	test ! -s junk
  	rm -f junk
  	./subst -f substitutions `sed 's;^;../;' subst.hs subst.gc`
  
--- 32,38 ----
  	chmod +x subst
  	: too late for h and hfake, include has already been built
  	-egrep '^(h|hfake)/' subst.hs subst.gc >junk
! 	test ! -s junk ;
  	rm -f junk
  	./subst -f substitutions `sed 's;^;../;' subst.hs subst.gc`
  
***************
*** 65,71 ****
  	echo 'echo 0' >>$@
  
  setnewsids:	setnewsids.o $(LIBS)
! 	$(CC) $(CFLAGS) setnewsids.o $(LIBS) -o $@
  
  ../ranlibed:	../libcnews.a
  	ranlib ../libcnews.a
--- 65,71 ----
  	echo 'echo 0' >>$@
  
  setnewsids:	setnewsids.o $(LIBS)
! 	$(CC) $(CFLAGS) setnewsids.o $(PRE) $(LIBS) $(POST) -o $@
  
  ../ranlibed:	../libcnews.a
  	ranlib ../libcnews.a

*** cnpatch/tmp.file	Fri Jul  7 15:27:17 1989
--- conf/build	Tue Jul  4 17:50:04 1989
***************
*** 381,387 ****
  ./query 'Do you want to use our fast stdio library [yes]? '
  read libstdio
  case "$libstdio" in
! y*|Y*|'')	libstdio=libstdio	;;
  *)		libstdio=		;;
  esac
  
--- 381,391 ----
  ./query 'Do you want to use our fast stdio library [yes]? '
  read libstdio
  case "$libstdio" in
! y*|Y*|'')	libstdio=libstdio
! 		echo 'Beware that the compatibility check will work best if'
! 		echo 'the output of doit.bin is NOT redirected into a file'
! 		echo 'or a pipe.'
! 		;;
  *)		libstdio=		;;
  esac
  
***************
*** 513,518 ****
--- 517,534 ----
  esac
  
  echo
+ echo 'On unusual systems it may be necessary to link C News programs with'
+ echo 'libraries other than the usual C library.  These can be specified as'
+ echo 'either full pathnames or -l... options.  What libraries, in addition'
+ echo 'to the one(s) picked up automatically by the compiler, should be used'
+ ./query 'when linking C News [none]? '
+ read postlibs
+ case "$postlibs" in
+ '')	;;
+ *)	postlibs="POST='$postlibs'"	;;
+ esac
+ 
+ echo
  ./query 'Does your system have a "hostname" command [yes]? '
  read hostname
  case "$hostname" in
***************
*** 846,852 ****
  	echo "for dir in lib$unixkind lib$addrsize libc libcnews $libstdio"
  	echo "do"
  	echo "	cd ../\$dir"
! 	echo "	make u $cc $copts || exit 1"
  	echo "done"
  	echo "cd ../libfake"
  	echo "ed - Makefile <<'!'"
--- 862,868 ----
  	echo "for dir in lib$unixkind lib$addrsize libc libcnews $libstdio"
  	echo "do"
  	echo "	cd ../\$dir"
! 	echo "	make u $cc $copts $postlibs || exit 1"
  	echo "done"
  	echo "cd ../libfake"
  	echo "ed - Makefile <<'!'"
***************
*** 853,859 ****
  	echo "/NEEDED =/s/.*/NEEDED = $fake/"
  	echo "w"
  	echo "!"
! 	echo "make u $cc $copts || exit 1"
  	echo "cd ../conf"
  	if test " $ranlib" = " y"
  	then
--- 869,875 ----
  	echo "/NEEDED =/s/.*/NEEDED = $fake/"
  	echo "w"
  	echo "!"
! 	echo "make u $cc $copts $postlibs || exit 1"
  	echo "cd ../conf"
  	if test " $ranlib" = " y"
  	then
***************
*** 864,870 ****
  	then
  		echo ': testing libstdio'
  		echo 'cd ../libstdio'
! 		echo "make trials $cc $copts || exit 1"
  		echo ': done'
  	fi
  	echo ': building programs'
--- 880,889 ----
  	then
  		echo ': testing libstdio'
  		echo 'cd ../libstdio'
! 		echo ': produces some meaningless-looking output on terminal,'
! 		echo ': but do not redirect it -- it is important that stdio'
! 		echo ': think output is going to a terminal.'
! 		echo "make trials $cc $copts $postlibs || exit 1"
  		echo ': done'
  	fi
  	echo ': building programs'
***************
*** 871,882 ****
  	echo 'cd ../conf'
  	if test " $sete" != " y"
  	then
! 		echo "make setnewsids NEWSUSER=$newsuid NEWSGROUP=$newsgid $cc $copts"
  	fi
  	echo "for dir in $pgmdirs"
  	echo "do"
  	echo "	cd ../\$dir"
! 	echo "	make all $dbm $cc $copts"
  	echo "done"
  	echo ": done"
  	echo ": building prototype control files"
--- 890,901 ----
  	echo 'cd ../conf'
  	if test " $sete" != " y"
  	then
! 		echo "make setnewsids NEWSUSER=$newsuid NEWSGROUP=$newsgid $cc $copts $postlibs"
  	fi
  	echo "for dir in $pgmdirs"
  	echo "do"
  	echo "	cd ../\$dir"
! 	echo "	make all $dbm $cc $copts $postlibs"
  	echo "done"
  	echo ": done"
  	echo ": building prototype control files"

*** cnpatch/tmp.file	Fri Jul  7 15:27:37 1989
--- doc/interface	Tue Jul  4 16:37:34 1989
***************
*** 1,4 ****
! .DA "9 June 1989"
  .TL
  The Interface Between C News And The Outside World
  .AU
--- 1,4 ----
! .DA "4 July 1989"
  .TL
  The Interface Between C News And The Outside World
  .AU
***************
*** 71,79 ****
  You need a standard shell.
  .PP
  To the best of our ability, all our shell files begin with ``#!\ /bin/sh''.
! If your shell misinterprets this as a request to run the C shell, you're
! in trouble.
! If your shell doesn't know about ``#'' comments at all, you're in trouble.
  We hope that no modern shell makes either of these mistakes.
  .PP
  We believe that none of our stuff relies on relatively modern shell features
--- 71,95 ----
  You need a standard shell.
  .PP
  To the best of our ability, all our shell files begin with ``#!\ /bin/sh''.
! As far as we know, nothing actually relies on being able to \fIexec\fR a
! shell file; that is, if ``#!\ /bin/sh'' is just a comment to your shell,
! that should be okay.
! If your shell misinterprets it as a request to run the C shell, however,
! you're in trouble.
! Running the following might help:
! .DS
! for f in `find . \-type f \-print`
! do
! 	if test " `sed 1q $f`" = "#! /bin/sh"
! 	then
! 		ed $f <<'!'
! 1s/#!/: use/
! w
! !
! 	fi
! done
! .DE
! If your shell doesn't know about ``#'' comments at all, again you're in trouble.
  We hope that no modern shell makes either of these mistakes.
  .PP
  We believe that none of our stuff relies on relatively modern shell features

*** cnpatch/tmp.file	Fri Jul  7 15:27:38 1989
--- expire/Makefile	Tue Jul  4 17:36:01 1989
***************
*** 34,52 ****
  	-for f in $(THEM) ; do cmp $$f $(NEWSBIN)/expire/$$f ; done
  
  expire: expire.o $(LIBS)
! 	$(CC) $(LDFLAGS) expire.o $(LIBS) $(DBM) -o $@
  
  histinfo: histinfo.o $(LIBS)
! 	$(CC) $(LDFLAGS) histinfo.o $(LIBS) -o $@
  
  lowest:	lowest.o $(LIBS)
! 	$(CC) $(LDFLAGS) lowest.o $(LIBS) -o $@
  
  histslash:	histslash.o $(LIBS)
! 	$(CC) $(LDFLAGS) histslash.o $(LIBS) -o $@
  
  mkdbm:	mkdbm.o $(LIBS)
! 	$(CC) $(LDFLAGS) mkdbm.o $(LIBS) $(DBM) -o $@
  
  lint:	expire.c
  	lint -ha $(LINTFLAGS) expire.c 2>&1 | egrep -v $(JUNKLINT) | tee $@
--- 34,52 ----
  	-for f in $(THEM) ; do cmp $$f $(NEWSBIN)/expire/$$f ; done
  
  expire: expire.o $(LIBS)
! 	$(CC) $(LDFLAGS) expire.o $(PRE) $(LIBS) $(DBM) $(POST) -o $@
  
  histinfo: histinfo.o $(LIBS)
! 	$(CC) $(LDFLAGS) histinfo.o $(PRE) $(LIBS) $(POST) -o $@
  
  lowest:	lowest.o $(LIBS)
! 	$(CC) $(LDFLAGS) lowest.o $(PRE) $(LIBS) $(POST) -o $@
  
  histslash:	histslash.o $(LIBS)
! 	$(CC) $(LDFLAGS) histslash.o $(PRE) $(LIBS) $(POST) -o $@
  
  mkdbm:	mkdbm.o $(LIBS)
! 	$(CC) $(LDFLAGS) mkdbm.o $(PRE) $(LIBS) $(DBM) $(POST) -o $@
  
  lint:	expire.c
  	lint -ha $(LINTFLAGS) expire.c 2>&1 | egrep -v $(JUNKLINT) | tee $@
***************
*** 194,202 ****
  	sed $(FIXPATHS) test.out | cmp - tgood
  	: "okay, it seems to know what it's doing -- now, can it do it?"
  	$(RUN) -p explist >test.out 2>test.stderr
! 	test ! -s test.stderr
  	cmp test.out pgood
! 	test ! -f history.n
  	cmp history.proto history.o
  	egrep wont history.proto | ./dircheck arts
  	egrep 'will|two|gone|three' history.proto | ./dircheck -n arts
--- 194,202 ----
  	sed $(FIXPATHS) test.out | cmp - tgood
  	: "okay, it seems to know what it's doing -- now, can it do it?"
  	$(RUN) -p explist >test.out 2>test.stderr
! 	test ! -s test.stderr ;
  	cmp test.out pgood
! 	test ! -f history.n ;
  	cmp history.proto history.o
  	egrep wont history.proto | ./dircheck arts
  	egrep 'will|two|gone|three' history.proto | ./dircheck -n arts
***************
*** 206,215 ****
  	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"
  	$(D) ./upact
--- 206,215 ----
  	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"
  	$(D) ./upact
***************
*** 219,232 ****
  	rm -f history.pag history.dir
  	$(D) ./mkhistory
  	sort history | sed $(FIXMIDFIELD) | cmp - history.after
! 	test -r history.pag
! 	test -r history.dir
  	: "and that's mkhistory done, finally try superkludge"
! 	test -r arts/foo/1
! 	test -r arts/foo/10
  	$(D) ./superkludge foo
! 	test ! -r arts/foo/1
! 	test -r arts/foo/10
  	: "success!"
  
  tidy:
--- 219,232 ----
  	rm -f history.pag history.dir
  	$(D) ./mkhistory
  	sort history | sed $(FIXMIDFIELD) | cmp - history.after
! 	test -r history.pag ;
! 	test -r history.dir ;
  	: "and that's mkhistory done, finally try superkludge"
! 	test -r arts/foo/1 ;
! 	test -r arts/foo/10 ;
  	$(D) ./superkludge foo
! 	test ! -r arts/foo/1 ;
! 	test -r arts/foo/10 ;
  	: "success!"
  
  tidy:

*** cnpatch/tmp.file	Fri Jul  7 15:27:43 1989
--- expire/mkhistory	Tue Jun 27 16:47:59 1989
***************
*** 29,34 ****
--- 29,35 ----
  if egrep '^<swill@trash>	' history.n >/dev/null
  then
  	echo "$0: <swill@trash> found in history.n -- aborting" >&2
+ 	echo "$0: (some article lacks a Message-ID)" >&2
  	exit 1
  fi
  mkdbm <history.n

*** cnpatch/tmp.file	Fri Jul  7 15:27:49 1989
--- input/Makefile	Tue Jul  4 17:36:58 1989
***************
*** 39,51 ****
  	: nothing
  
  newsspool: newsspool.o $(LIBS)
! 	$(CC) $(LDFLAGS) newsspool.o $(LIBS) -o $@
  
  c7decode: c7decode.o $(LIBS)
! 	$(CC) $(LDFLAGS) c7decode.o $(LIBS) -o $@
  
  bdecode: bdecode.o $(BATCH)/crctab.o $(LIBS)
! 	$(CC) $(LDFLAGS) bdecode.o $(BATCH)/crctab.o $(LIBS) -o $@
  
  $(BATCH)/crctab.o:	$(BATCH)/crctab.c
  	( cd $(BATCH) ; make crctab.o )
--- 39,51 ----
  	: nothing
  
  newsspool: newsspool.o $(LIBS)
! 	$(CC) $(LDFLAGS) newsspool.o $(PRE) $(LIBS) $(POST) -o $@
  
  c7decode: c7decode.o $(LIBS)
! 	$(CC) $(LDFLAGS) c7decode.o $(PRE) $(LIBS) $(POST) -o $@
  
  bdecode: bdecode.o $(BATCH)/crctab.o $(LIBS)
! 	$(CC) $(LDFLAGS) bdecode.o $(BATCH)/crctab.o $(PRE) $(LIBS) $(POST) -o $@
  
  $(BATCH)/crctab.o:	$(BATCH)/crctab.c
  	( cd $(BATCH) ; make crctab.o )
***************
*** 118,136 ****
  	NEWSARTS=`pwd` NEWSCTL=`pwd` ./rnews.batch <test.3
  	cmp `ls -t in.coming | sed -n '1s;^;in.coming/;p'` test.3c
  	NEWSARTS=`pwd` NEWSCTL=`pwd` ./newsrunning off
! 	test -r in.coming/stop
  	NEWSARTS=`pwd` NEWSCTL=`pwd` ./newsrunning on
! 	test ! -r in.coming/stop
  	mkdir in.coming/bad
  	NEWSARTS=`pwd` NEWSCTL=`pwd` ./newsrun
  	cmp tmp.1 test.out
! 	test " `echo in.coming/*`" = ' in.coming/bad'
  	rm tmp.1
  	NEWSARTS=`pwd` NEWSCTL=`pwd` ./rnews.batch <test.1
  	NEWSARTS=`pwd` NEWSCTL=`pwd` ./rnews.batch <test.2
  	NEWSARTS=`pwd` NEWSCTL=`pwd` NEWSBIN=`pwd`/bin ./rnews.immed <test.3
  	cmp tmp.1 test.out
! 	test " `echo in.coming/*`" = ' in.coming/bad'
  	rm tmp.1
  	rm -r bin in.coming
  
--- 118,136 ----
  	NEWSARTS=`pwd` NEWSCTL=`pwd` ./rnews.batch <test.3
  	cmp `ls -t in.coming | sed -n '1s;^;in.coming/;p'` test.3c
  	NEWSARTS=`pwd` NEWSCTL=`pwd` ./newsrunning off
! 	test -r in.coming/stop ;
  	NEWSARTS=`pwd` NEWSCTL=`pwd` ./newsrunning on
! 	test ! -r in.coming/stop ;
  	mkdir in.coming/bad
  	NEWSARTS=`pwd` NEWSCTL=`pwd` ./newsrun
  	cmp tmp.1 test.out
! 	test " `echo in.coming/*`" = ' in.coming/bad' ;
  	rm tmp.1
  	NEWSARTS=`pwd` NEWSCTL=`pwd` ./rnews.batch <test.1
  	NEWSARTS=`pwd` NEWSCTL=`pwd` ./rnews.batch <test.2
  	NEWSARTS=`pwd` NEWSCTL=`pwd` NEWSBIN=`pwd`/bin ./rnews.immed <test.3
  	cmp tmp.1 test.out
! 	test " `echo in.coming/*`" = ' in.coming/bad' ;
  	rm tmp.1
  	rm -r bin in.coming
  

*** cnpatch/tmp.file	Fri Jul  7 15:28:26 1989
--- libstdio/Makefile	Tue Jul  4 17:38:07 1989
***************
*** 16,34 ****
  
  trials:	all
  	chmod +x runtrials
  	./runtrials >junk
! 	test ! -s junk
! 	rm stdiock.stock stdiock.fast junk trial.out
  
  lint:
! 	lint $(LINTFLAGS) -u $(SRC)
  lintport:
! 	lint -p $(LINTFLAGS) -u $(SRC)
  
  stdiock.stock: stdiock.o $(LIBS)
! 	$(CC) $(CFLAGS) stdiock.o $(LIBS) -o $@
  stdiock.fast: stdiock.o $(OBJ) $(LIBS)
! 	$(CC) $(CFLAGS) stdiock.o $(OBJ) $(LIBS) -o $@
  
  clean:
! 	rm -f *.o stdiock stdiock.fast stdiock.stock *mon.out trial.out
--- 16,40 ----
  
  trials:	all
  	chmod +x runtrials
+ 	: run first with stdout directed to a plain file
  	./runtrials >junk
! 	: and again with stdout directed to a tty, we hope.
! 	: do not panic.  you can ignore the output of runtrials.
! 	: only its exit status really matters.
! 	./runtrials
! 	rm stdiock.stock stdiock.fast junk
  
  lint:
! 	lint $(LINTFLAGS) $(SRC) stdiock.c
  lintport:
! 	lint -p $(LINTFLAGS) $(SRC) stdiock.c
  
  stdiock.stock: stdiock.o $(LIBS)
! 	: search -lc before libcnews.a to get stock stdio
! 	$(CC) $(CFLAGS) stdiock.o $(PRE) -lc $(LIBS) $(POST) -o $@
  stdiock.fast: stdiock.o $(OBJ) $(LIBS)
! 	: load *.o by hand to get tuned stdio
! 	$(CC) $(CFLAGS) stdiock.o $(OBJ) $(PRE) $(LIBS) $(POST) -o $@
  
  clean:
! 	rm -f *.o stdiock stdiock.fast stdiock.stock junk *mon.out

*** cnpatch/tmp.file	Fri Jul  7 15:28:27 1989
--- libstdio/README	Tue Jun 27 13:41:06 1989
***************
*** 1,4 ****
! This directory does not form a library; fgets.o, fputs.o and rdwr.o
! constitute re-written stdio guts, thought to be compatible with the
! usual UNIX stdio implementation but a good deal faster than old
! versions.
--- 1,3 ----
! fgets.o, fputs.o and rdwr.o are re-implemented stdio guts, thought to be
! compatible with the usual UNIX stdio implementation but a good deal
! faster than old versions.

*** cnpatch/tmp.file	Fri Jul  7 15:28:29 1989
--- libstdio/runtrials	Tue Jun 27 13:41:07 1989
***************
*** 6,16 ****
  		for buf in "" -u
  		do
  			echo stdiock.$whose $fp $buf:
! 			./stdiock.$whose $fp $buf <<!
  a line
  !
  			echo ''
  		done
  	done
! done | tee trial.out | egrep 'incompat|bugger'
! exit 0				# exit status of pipe is unportable anyway
--- 6,21 ----
  		for buf in "" -u
  		do
  			echo stdiock.$whose $fp $buf:
! 			if ./stdiock.$whose $fp $buf <<!
  a line
  !
+ 			then
+ 				: passed
+ 			else
+ 				exit 1		# something amiss
+ 			fi
  			echo ''
  		done
  	done
! done
! exit 0

*** cnpatch/tmp.file	Fri Jul  7 15:28:30 1989
--- libstdio/stdiock.c	Tue Jun 27 13:41:08 1989
***************
*** 7,12 ****
--- 7,13 ----
  #include <stdio.h>
  
  FILE *fp = stdout;
+ int status = 0;
  
  main(argc, argv)
  char **argv;
***************
*** 40,47 ****
  		(void) fgets(line, sizeof line, fp);
  		evalfile("fgets");
  	} else {
! 		if (fwrite("your", 1, 4, fp) != 4)
  			(void) write(1, buggered, strlen(buggered));
  		evalfile("fwrite");
  
  		(void) fputs(" stdio seems to be ", stdout);
--- 41,50 ----
  		(void) fgets(line, sizeof line, fp);
  		evalfile("fgets");
  	} else {
! 		if (fwrite("your", 1, 4, fp) != 4) {
! 			status = 1;
  			(void) write(1, buggered, strlen(buggered));
+ 		}
  		evalfile("fwrite");
  
  		(void) fputs(" stdio seems to be ", stdout);
***************
*** 48,61 ****
  		evalfile("fputs");
  	}
  
! 	if (wantbuf && fp->_ptr == NULL)
  		(void) fputs("incompatible (_ptr) ", stdout);
! 	else
  		(void) fputs("compatible (_ptr) ", stdout);
  	if (fp->_cnt >= 0 && fp->_cnt <= BUFSIZ)
  		(void) fputs("compatible (_cnt)", stdout);
! 	else
  		(void) fputs("incompatible (_cnt)", stdout);
  	evalfile("test");
  
  	(void) fputs(" with stdio.fast\n", stdout);
--- 51,67 ----
  		evalfile("fputs");
  	}
  
! 	if (wantbuf && fp->_ptr == NULL) {
! 		status = 1;
  		(void) fputs("incompatible (_ptr) ", stdout);
! 	} else
  		(void) fputs("compatible (_ptr) ", stdout);
  	if (fp->_cnt >= 0 && fp->_cnt <= BUFSIZ)
  		(void) fputs("compatible (_cnt)", stdout);
! 	else {
! 		status = 1;
  		(void) fputs("incompatible (_cnt)", stdout);
+ 	}
  	evalfile("test");
  
  	(void) fputs(" with stdio.fast\n", stdout);
***************
*** 65,71 ****
  	(void) fflush(stdout);
  	evalfile("fflush");
  
! 	exit(0);
  }
  
  /* write on stdout with using stdio. ugh */
--- 71,80 ----
  	(void) fflush(stdout);
  	evalfile("fflush");
  
! 	exit(status);
! 
! 	/* next line is not executed, but drags in the appropriate fread */
! 	(void) fread(buf, 1, sizeof buf, stdin);
  }
  
  /* write on stdout with using stdio. ugh */
***************
*** 81,88 ****
  	if (fp->_ptr != NULL && fp->_cnt != 0) {
  		if (bufend == NULL)
  			bufend = (char *)fp->_ptr + fp->_cnt;
! 		if (bufend != (char *)fp->_ptr + fp->_cnt)
  			(void) write(1, buggered, strlen(buggered));
  	}
  
  	(void) write(1, s, strlen(s));
--- 90,99 ----
  	if (fp->_ptr != NULL && fp->_cnt != 0) {
  		if (bufend == NULL)
  			bufend = (char *)fp->_ptr + fp->_cnt;
! 		if (bufend != (char *)fp->_ptr + fp->_cnt) {
! 			status = 1;
  			(void) write(1, buggered, strlen(buggered));
+ 		}
  	}
  
  	(void) write(1, s, strlen(s));

*** cnpatch/tmp.file	Fri Jul  7 15:28:37 1989
--- man/inews.1	Thu Jul  6 17:46:09 1989
***************
*** 6,14 ****
  .ds c /usr/lib/news
  .\" =()<.ds m @<NEWSMASTER>@>()=
  .ds m usenet
! .TH INEWS 1 "7 June 1989" "C News"
  .SH NAME
! inews \- `user-friendly' news-posting front-end for rnews
  .SH SYNOPSIS
  .B inews
  .B \-p
--- 6,14 ----
  .ds c /usr/lib/news
  .\" =()<.ds m @<NEWSMASTER>@>()=
  .ds m usenet
! .TH INEWS 1 "6 July 1989" "C News"
  .SH NAME
! inews \- `user-friendly' news-posting front-end for relaynews
  .SH SYNOPSIS
  .B inews
  .B \-p
***************
*** 85,129 ****
  ]
  .SH DESCRIPTION
  .I Inews
! installs locally
! and
! broadcasts a (network) news article
! (\fIi\fPnjects it into the
  .I news
! flow),
! read from
  .IR file s
! or standard input if none,
! normally
! by giving it as standard input to
! .IR rnews (1),
! after adding and altering headers,
  notably
  .BR Message-ID: ,
  .BR From:
  and
  .BR Path: ,
! deleting invisible characters,
  and
! appending the first four lines of
  .BR $HOME/.signature ,
! if any.
! The article will instead be mailed
  to the moderators of the moderated newsgroups in the
  .B Newsgroups:
! header,
! if any are found.
  .PP
  .B "inews -p"
  is exactly equivalent to
! .BR rnews .
! Normal usage is simply
  .BR "inews -h" ,
  which assumes the presence of at least
  .B Subject:
  and
  .B Newsgroups:
! headers.
  .B \-h
  tells
  .I inews
--- 85,132 ----
  ]
  .SH DESCRIPTION
  .I Inews
! \fIi\fPnjects an article into the
  .I news
! flow,
! installing it locally
! and
! broadcasting it (if appropriate) onto the network.
! The article is read from
  .IR file s
! or standard input if none.
! .I Inews
! adds and alters headers,
  notably
  .BR Message-ID: ,
  .BR From:
  and
  .BR Path: ,
! deletes invisible characters,
  and
! appends the first four lines of
  .BR $HOME/.signature ,
! if any,
! to the article, and then hands it to
! .IR relaynews (8),
! provided the newsgroup(s) are unmoderated.
! If the groups are moderated,
! the article will instead be mailed
  to the moderators of the moderated newsgroups in the
  .B Newsgroups:
! header.
  .PP
  .B "inews -p"
  is exactly equivalent to
! invoking
! .BR rnews (8);
! this is seldom useful in C News.
! Normal usage is
  .BR "inews -h" ,
  which assumes the presence of at least
  .B Subject:
  and
  .B Newsgroups:
! headers in the article.
  .B \-h
  tells
  .I inews
***************
*** 156,162 ****
  to complete,
  instead of running it in the background and not waiting.
  .PP
! The remaining options are inherited from B news
  and exist only for backward-compatibility with news readers.
  .I "They should not be used by humans,"
  as they are equivalent to
--- 159,165 ----
  to complete,
  instead of running it in the background and not waiting.
  .PP
! The rest of the options are inherited from B news
  and exist only for backward-compatibility with news readers.
  .I "They should not be used by humans,"
  as they are equivalent to
***************
*** 230,234 ****
  most novices use
  .IR Pnews ,
  which could invoke
! .I rnews
  directly.
--- 233,237 ----
  most novices use
  .IR Pnews ,
  which could invoke
! .I relaynews
  directly.

*** cnpatch/tmp.file	Fri Jul  7 15:28:40 1989
--- man/newsaux.8	Tue Jul  4 19:30:11 1989
***************
*** 6,12 ****
  .ds c /usr/lib/news
  .\" =()<.ds m @<NEWSMASTER>@>()=
  .ds m usenet
! .TH NEWSAUX 8 "22 June 1989" "C News"
  .SH NAME
  spacefor \- check available space for news
  .br
--- 6,12 ----
  .ds c /usr/lib/news
  .\" =()<.ds m @<NEWSMASTER>@>()=
  .ds m usenet
! .TH NEWSAUX 8 "4 July 1989" "C News"
  .SH NAME
  spacefor \- check available space for news
  .br
***************
*** 147,156 ****
  performs minor maintenance chores
  that typically should be done once a day for the news system:
  saving copies of log files and truncating them,
! reporting logged errors, and checking for anomalies suggesting something
! is wrong.
  \fINewsdaily\fR saves one generation of old \fIlog\fR files and three
! generations of old \fIerrlog\fR files.
  It reports problems to the named \fIguru\fRs
  (default:  `\*m').
  .PP
--- 147,156 ----
  performs minor maintenance chores
  that typically should be done once a day for the news system:
  saving copies of log files and truncating them,
! reporting logged errors, checking for anomalies suggesting something
! is wrong, and cleaning out leftover files.
  \fINewsdaily\fR saves one generation of old \fIlog\fR files and three
! generations of old \fIerrlog\fR and \fIbatchlog\fR files.
  It reports problems to the named \fIguru\fRs
  (default:  `\*m').
  .PP
***************
*** 193,198 ****
--- 193,200 ----
  \*c/log.o	previous news log
  \*c/errlog	current news-error log
  \*c/errlog.o*	old news-error logs
+ \*c/batchlog	current news-batcher log
+ \*c/batchlog.o*	old news-batcher logs
  \*a/in.coming	input-spooling area
  \*a/out.going	output-batching area
  \*c/watchtime	last time \fInewswatch\fR was run
***************
*** 218,226 ****
  The need for \fIsizeof\fR and \fInewslock\fR is a botch.
  .PP
  \fILocknews\fR is a bit crude.
- .PP
- \fIAddgroup\fR does not create the directory(-ies) for the new group;
- C News creates them as necessary but some news-reader programs disapprove.
  .PP
  \fIDelgroup\fR does not remove files or directories from \*a, although it
  prints a reminder to do so.
--- 220,225 ----

*** cnpatch/tmp.file	Fri Jul  7 15:28:44 1989
--- man/newsbatch.8	Tue Jul  4 19:30:20 1989
***************
*** 6,12 ****
  .ds c /usr/lib/news
  .\" =()<.ds m @<NEWSMASTER>@>()=
  .ds m usenet
! .TH NEWSBATCH 8 "28 May 1989" "C News"
  .SH NAME
  sendbatches, batchsplit \- news batching to other sites
  .br
--- 6,12 ----
  .ds c /usr/lib/news
  .\" =()<.ds m @<NEWSMASTER>@>()=
  .ds m usenet
! .TH NEWSBATCH 8 "4 July 1989" "C News"
  .SH NAME
  sendbatches, batchsplit \- news batching to other sites
  .br
***************
*** 121,127 ****
  \fIsendbatches\fR when invoked without arguments; see above.)
  The second field is the size of batches to be prepared (before compression),
  in bytes.
! The third field is the maximum number of batches to be queued up for
  transmission to that site.
  The fourth, fifth, and sixth fields are the names of the programs to
  be used to build, compress, and transmit (respectively) batches to that site.
--- 121,127 ----
  \fIsendbatches\fR when invoked without arguments; see above.)
  The second field is the size of batches to be prepared (before compression),
  in bytes.
! The third field is the maximum length of the output queue for
  transmission to that site.
  The fourth, fifth, and sixth fields are the names of the programs to
  be used to build, compress, and transmit (respectively) batches to that site.
***************
*** 132,138 ****
  finds the \fIbatchparms\fR line for that site
  and
  invokes \fIqueuelen\fR (see \fInewsaux\fR(8))
! to find out how many batches are in the outbound queue for it already.
  \fISendbatches\fR limits the number of batches prepared to the minimum of
  the limits implied by queue lengths and available space.
  .PP
--- 132,138 ----
  finds the \fIbatchparms\fR line for that site
  and
  invokes \fIqueuelen\fR (see \fInewsaux\fR(8))
! to find out the size of the outbound queue for the site.
  \fISendbatches\fR limits the number of batches prepared to the minimum of
  the limits implied by queue lengths and available space.
  .PP
***************
*** 220,227 ****
  This ought to suffice to get data through almost any network.
  .PP
  \fISendbatches\fR logs some information about sites with backlogs in
! \fI\*c/batchlog\fR, keeping the previous \fIbatchlog\fR in
! \fIbatchlog.o\fR and the one before that in \fIbatchlog.oo\fR.
  This is intended to help detection and diagnosis of flow problems.
  .SH FILES
  .ta \w'\*a/out.going/*'u+2n
--- 220,226 ----
  This ought to suffice to get data through almost any network.
  .PP
  \fISendbatches\fR logs some information about sites with backlogs in
! \fI\*c/batchlog\fR (see also \fInewsdaily\fR(8)).
  This is intended to help detection and diagnosis of flow problems.
  .SH FILES
  .ta \w'\*a/out.going/*'u+2n
***************
*** 235,240 ****
--- 234,242 ----
  also see text
  .SH SEE ALSO
  inews(1), compress(1), uux(1), relaynews(8), rnews(8)
+ .SH DIAGNOSTICS
+ Complaints, if any,
+ from \fIsendbatches\fR and its auxiliaries are mailed to `\*m'.
  .SH HISTORY
  Written at University of Toronto as part of the C News project.
  A number of the ideas came from Chris Lewis, who was then with Motorola.

*** cnpatch/tmp.file	Fri Jul  7 15:28:49 1989
--- man/relaynews.8	Tue Jul  4 19:43:15 1989
***************
*** 6,12 ****
  .ds c /usr/lib/news
  .\" =()<.ds m @<NEWSMASTER>@>()=
  .ds m usenet
! .TH RELAYNEWS 8 "28 May 1989" "C News"
  .SH NAME
  relaynews \- store and forward netnews articles
  .SH SYNOPSIS
--- 6,12 ----
  .ds c /usr/lib/news
  .\" =()<.ds m @<NEWSMASTER>@>()=
  .ds m usenet
! .TH RELAYNEWS 8 "4 July 1989" "C News"
  .SH NAME
  relaynews \- store and forward netnews articles
  .SH SYNOPSIS
***************
*** 31,37 ****
  Typically the articles will be in a batch
  (see
  .IR news (5)),
! which may
  .I not
  be compressed
  (see
--- 31,37 ----
  Typically the articles will be in a batch
  (see
  .IR news (5)),
! which must
  .I not
  be compressed
  (see
***************
*** 63,69 ****
  enables ``NNTP mode''
  in which history entries are generated as articles are rejected.
  .B \-s
! makes discarding an article a serious matter.
  .B \-x
  excludes
  .I excluded-site
--- 63,71 ----
  enables ``NNTP mode''
  in which history entries are generated as articles are rejected.
  .B \-s
! makes discarding an article a serious matter,
! justifying a non-zero exit status (for the benefit of
! .IR inews ).
  .B \-x
  excludes
  .I excluded-site
***************
*** 74,80 ****
  .B Control:
  headers
  (or
! .B "for backward compatibility ONLY"
  a
  .B Newsgroups:
  header containing a single newsgroup ending in
--- 76,82 ----
  .B Control:
  headers
  (or
! .I "for backward compatibility ONLY"
  a
  .B Newsgroups:
  header containing a single newsgroup ending in
***************
*** 106,113 ****
  .B junk
  pseudo-group,
  and forwarded as usual.
! In particular,
! if all newsgroups in the article are refused by
  the local subscription list
  or
  are refused by an
--- 108,114 ----
  .B junk
  pseudo-group,
  and forwarded as usual.
! If all newsgroups in the article are refused by
  the local subscription list
  or
  are refused by an
***************
*** 184,190 ****
  and its subdirectories
  .TP
  .B \*b/ctl
! common directory of programs to implement control messages
  .TP
  .B \*b/relay/relaynews
  the lean, mean news-relayin' machine
--- 185,191 ----
  and its subdirectories
  .TP
  .B \*b/ctl
! directory of programs to implement control messages
  .TP
  .B \*b/relay/relaynews
  the lean, mean news-relayin' machine

*** cnpatch/tmp.file	Fri Jul  7 15:28:52 1989
--- misc/Makefile	Tue Jul  4 17:39:13 1989
***************
*** 30,45 ****
  	: nothing
  
  gngp:	gngp.o $(LIBS)
! 	$(CC) $(CFLAGS) gngp.o $(LIBS) -o $@
  
  ctime:	ctime.o $(LIBS)
! 	$(CC) $(CFLAGS) ctime.o $(LIBS) -o $@
  
  getdate:	getdate.o $(LIBS)
! 	$(CC) $(CFLAGS) getdate.o $(LIBS) -o $@
  
  newslock:	newslock.o $(LIBS)
! 	$(CC) $(CFLAGS) newslock.o $(LIBS) -o $@
  
  NHCFLAGS = -I$(RN) $(CFLAGS)
  RNEWSOBJS = $(RN)/history.o $(RN)/article.o $(RN)/hdrcommon.o \
--- 30,45 ----
  	: nothing
  
  gngp:	gngp.o $(LIBS)
! 	$(CC) $(CFLAGS) gngp.o $(PRE) $(LIBS) $(POST) -o $@
  
  ctime:	ctime.o $(LIBS)
! 	$(CC) $(CFLAGS) ctime.o $(PRE) $(LIBS) $(POST) -o $@
  
  getdate:	getdate.o $(LIBS)
! 	$(CC) $(CFLAGS) getdate.o $(PRE) $(LIBS) $(POST) -o $@
  
  newslock:	newslock.o $(LIBS)
! 	$(CC) $(CFLAGS) newslock.o $(PRE) $(LIBS) $(POST) -o $@
  
  NHCFLAGS = -I$(RN) $(CFLAGS)
  RNEWSOBJS = $(RN)/history.o $(RN)/article.o $(RN)/hdrcommon.o \
***************
*** 46,52 ****
   $(RN)/io.o $(RN)/msgs.o
  NHLIBS = $(LIBS) $(DBM)
  newshist:	newshist.o $(RNEWSOBJS) $(LIBS)
! 	$(CC) $(NHCFLAGS) newshist.o $(RNEWSOBJS) $(NHLIBS) -o $@
  
  newshist.o:	newshist.c
  	$(CC) $(NHCFLAGS) -c newshist.c
--- 46,52 ----
   $(RN)/io.o $(RN)/msgs.o
  NHLIBS = $(LIBS) $(DBM)
  newshist:	newshist.o $(RNEWSOBJS) $(LIBS)
! 	$(CC) $(NHCFLAGS) newshist.o $(RNEWSOBJS) $(PRE) $(NHLIBS) $(POST) -o $@
  
  newshist.o:	newshist.c
  	$(CC) $(NHCFLAGS) -c newshist.c

*** cnpatch/tmp.file	Fri Jul  7 15:29:00 1989
--- misc/newsdaily	Thu Jun 29 14:22:36 1989
***************
*** 31,38 ****
  rm log.o
  mv log log.o && >log
  
  # report any errors
! sleep 500			# hope that log.o is quiescent after this
  if test -s errlog.o
  then
  	(
--- 31,44 ----
  rm log.o
  mv log log.o && >log
  
+ # keep several generations of batchlog for statistics
+ rm -f batchlog.ooo
+ mv batchlog.oo batchlog.ooo
+ mv batchlog.o batchlog.oo
+ mv batchlog batchlog.o && >batchlog
+ 
  # report any errors
! sleep 500			# hope that errlog.o is quiescent after this
  if test -s errlog.o
  then
  	(

*** cnpatch/tmp.file	Fri Jul  7 15:29:11 1989
--- notebook/README	Wed Jul  5 11:57:59 1989
***************
*** 9,15 ****
  
  Ihave.pic.in is an illustration for ihave; ihave.pic is what you get after
  you run ihave.pic.in through pic (in case you have a troff that knows about
! the graphics commands but don't have pic); tmac.pic is extra macros for
! use in troffing pic stuff.
  
  Config and newslock need tbl.  Nothing here uses eqn.
--- 9,14 ----
  
  Ihave.pic.in is an illustration for ihave; ihave.pic is what you get after
  you run ihave.pic.in through pic (in case you have a troff that knows about
! the graphics commands but don't have pic).
  
  Config and newslock need tbl.  Nothing here uses eqn.

*** cnpatch/tmp.file	Fri Jul  7 15:29:34 1989
--- relay/ctl/newgroup	Sun Jun 25 13:41:31 1989
***************
*** 46,52 ****
  	moderated)	flag=m ;;
  	*)		flag=y ;;
  	esac
! 	echo "$1 0000000000 00000 $flag" >>$NEWSCTL/active
  	(echo "$1 `getdate now` $SENDER" >>$NEWSCTL/active.times)  # rn hook
  	# make the directory since rn will bitch if it's missing
  	mkpdir $NEWSARTS/`echo $1 | tr . / `
--- 46,52 ----
  	moderated)	flag=m ;;
  	*)		flag=y ;;
  	esac
! 	echo "$1 0000000000 0000000000 $flag" >>$NEWSCTL/active
  	(echo "$1 `getdate now` $SENDER" >>$NEWSCTL/active.times)  # rn hook
  	# make the directory since rn will bitch if it's missing
  	mkpdir $NEWSARTS/`echo $1 | tr . / `

*** cnpatch/tmp.file	Fri Jul  7 15:29:41 1989
--- relay/makefile	Tue Jul  4 17:40:12 1989
***************
*** 38,44 ****
  OBJ=relaynews.o active.o article.o caches.o mkdirs.o control.o fileart.o \
  	hdrdefs.o hdrcommon.o hdrparse.o hdrmunge.o \
  	history.o io.o msgs.o procart.o \
! 	sys.o transmit.o trbatch.o ihave.o $(LIBOBJS)
  FILES=$(NONCFILES) $(CFILES)
  NONCFILES= TODO* README ads/README ads/[0-9]* \
  	sh/inews sh/tear sh/anne.jones sh/defhdrs.awk \
--- 38,44 ----
  OBJ=relaynews.o active.o article.o caches.o mkdirs.o control.o fileart.o \
  	hdrdefs.o hdrcommon.o hdrparse.o hdrmunge.o \
  	history.o io.o msgs.o procart.o \
! 	sys.o transmit.o trbatch.o ihave.o
  FILES=$(NONCFILES) $(CFILES)
  NONCFILES= TODO* README ads/README ads/[0-9]* \
  	sh/inews sh/tear sh/anne.jones sh/defhdrs.awk \
***************
*** 52,59 ****
  mkfile: makefile
  	sed '/mkfile/d' makefile | mkconv | sed 's/make/mk/g' >$@
  
! relaynews: $(OBJ)
! 	$(CC) $(CFLAGS) $(OBJ) $(LIBS) $(LIBOBJS) -o $@
  lint: $(SRC)
  	$(LINT) $(LINTFLAGS) $(SRC) $(LLIBS) | $(LINTFILT)
  lint-p: $(SRC)
--- 52,59 ----
  mkfile: makefile
  	sed '/mkfile/d' makefile | mkconv | sed 's/make/mk/g' >$@
  
! relaynews: $(OBJ) $(LIBOBJS)
! 	$(CC) $(CFLAGS) $(OBJ) $(PRE) $(LIBS) $(LIBOBJS) $(POST) -o $@
  lint: $(SRC)
  	$(LINT) $(LINTFLAGS) $(SRC) $(LLIBS) | $(LINTFILT)
  lint-p: $(SRC)

*** cnpatch/tmp.file	Fri Jul  7 15:29:59 1989
--- relay/sh/inews	Wed Jul  5 13:17:03 1989
***************
*** 71,76 ****
--- 71,77 ----
  	-e)	shift; echo "Expires: $1" >>$input ;;
  	-f)	shift; echo "From: $1" >>$input ;;
  	-n)	shift; echo "Newsgroups: $1" >>$input ;;
+ 	-r)	shift; echo "Reply-To: $1" >>$input ;;
  	-t)	shift; echo "Subject: $1" >>$input ;;	# aka Title:
  	-D)	# obsolete, undocumented: meant "don't check for recordings".
  		# last present in B 2.10.1, invoked by readnews for followups.
***************
*** 96,112 ****
  			;;
  		esac
  		rm -f $whoami
- 
- 		inewsopt="$1"		# for use in message body
  		shift			# skip -C to get ng as $1
- 
  		cat <<! >>$input	# generate a control message
  Newsgroups: $1
  Control: newgroup $1
  Subject: newgroup $1
  Approved: above-user@above-host
- 
- This article generated by inews $inewsopt $1.
  !
  		;;
  	-*)
--- 97,108 ----

*** cnpatch/tmp.file	Fri Jul  7 15:30:09 1989
--- rna/makefile	Tue Jul  4 17:40:38 1989
***************
*** 42,48 ****
  	: warning, defs.h may not be right for your system
  
  readnews: $(ROFILES) defs.h $(LIBS)
! 	$(CC) $(CFLAGS) $(ROFILES) $(LIBS) -o $@
  
  newsinstall:
  	: "install all control files; don't overwrite any!"
--- 42,48 ----
  	: warning, defs.h may not be right for your system
  
  readnews: $(ROFILES) defs.h $(LIBS)
! 	$(CC) $(CFLAGS) $(ROFILES) $(PRE) $(LIBS) $(POST) -o $@
  
  newsinstall:
  	: "install all control files; don't overwrite any!"

Files that are new:

new notebook/log (patch can't create, so diff against null):
Index: notebook/log
*** cnpatch/tmp.preposterously.long.name.to.make.patch.behave.right	Fri Jul  7 15:26:59 1989
--- notebook/log	Fri Jul  7 14:24:29 1989
***************
*** 0 ****
--- 1,84 ----
+ .TL
+ Log File Formats in C News
+ .AU
+ Geoff Collyer
+ .AI
+ Department of Statistics
+ University of Toronto
+ .SH
+ Introduction
+ .PP
+ The two main log files in C news are
+ \fINEWSCTL\fP\fB/log\fR
+ and
+ \fINEWSCTL\fP\fB/errlog\fR,
+ which are the standard output and standard error streams
+ of
+ .I relaynews .
+ .B errlog
+ should be empty;
+ if not,
+ something is seriously wrong,
+ probably with your configuration or
+ with unencapsulated news arriving mangled
+ courtesy of some network.
+ .SH
+ Formats
+ .PP
+ .B errlog
+ is a copy of any error messages written on
+ standard error by
+ .I relaynews
+ or its auxiliaries
+ (including control messages programs).
+ There are no timestamps
+ and the contents obey no special format.
+ A non-empty
+ .B errlog
+ is a sign of trouble,
+ which should be fixed promptly.
+ .PP
+ .B log
+ is written in a stylised format,
+ with whitespace separating the fields:
+ date and time, to millisecond resolution though possibly not
+ to millisecond accuracy;
+ the machine that sent us this article;
+ a single-character classification code;
+ the article's message-id;
+ and
+ code-specific information.
+ For example,
+ .DS L
+ .ft B
+ .ps 8
+ .vs 10
+ Jun 30 03:32:18.960 utgpu + <1312@sunset.MATH.UCLA.EDU> mailrus dptcdc me
+ Jun 30 03:32:19.600 utgpu j <1312@sunset.MATH.UCLA.EDU> junked due to groups `alt.drugs'
+ Jul  3 18:55:35.492 utstat s <470@lexicon.com> utzoo-real
+ Jul  3 18:55:35.912 utstat i <8907031824.AA09129@ucbvax.Berkeley.EDU> utzoo-send-ids
+ Jul  4 06:40:22.395 jarvis.csri.toronto.edu + <0541.AA0541@worsel> utgpu
+ Jul  4 06:40:22.595 jarvis.csri.toronto.edu + <0549.AA0549@worsel> utgpu
+ Jul  4 07:00:26.565 jarvis.csri.toronto.edu + <295@lancelot> utgpu
+ Jul  4 07:17:51.537 utgpu - <8258@saturn.ucsc.edu> duplicate
+ Jul  4 07:17:51.697 utgpu - <1675@neoucom.UUCP> duplicate
+ Jul  4 07:17:51.757 utgpu - <89Jul4.043358edt.10369@neat.ai.toronto.edu> duplicate
+ Jul  4 17:23:28.234 utgpu - <2537@quanta.eng.ohio-state.edu> no subscribed groups in `rec.arts.sf-lovers,rec.arts.startrek,rec.arts.drwho'
+ Jul  4 19:17:15.785 utgpu - <89Jul4.190330edt.5559@gpu.utcs.utoronto.ca> all groups `list.humanist' excluded in active
+ .ft R
+ .DE
+ .PP
+ The classification codes are:
+ .TS
+ c | c | c
+ cfB | lw(2.75i) | l .
+ code	article disposition	code-specific information
+ _
+ \-	rejected	reason for rejection
+ +	accepted	list of sites to which this article was relayed
+ j	T{
+ accepted but filed in the \fIjunk\fR pseudo-newsgroup; preceding line will be \fB+\fR
+ T}	reason for junking
+ i	generated in response to an \fIihave\fR control message	list of sites to which this article was relayed
+ s	generated in response to a \fIsendme\fR control message	list of sites to which this article was relayed
+ .TE


end of patch 7-Jul-1989
-- 
$10 million equals 18 PM       |     Henry Spencer at U of Toronto Zoology
(Pentagon-Minutes). -Tom Neff  | uunet!attcan!utzoo!henry henry@zoo.toronto.edu