DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

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

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T U

⟦1e27d5e87⟧ TextFile

    Length: 48730 (0xbe5a)
    Types: TextFile
    Notes: Uncompressed file

Derivation

└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit
    └─⟦ae05f7217⟧ »EurOpenD3/news/cnews/13-Nov-1989.Z« 
        └─⟦this⟧ 

TextFile

Newsgroups: news.software.b
Subject: 13-Nov-1989 patch for C News

There are two big items in this.  First, relaynew's sys-file handling has
been revised to eliminate a slow memory leak.  Second, Geoff has done a
substantial portability-and-robustness overhaul on the Aussie readnews.

Also...  The batcher now logs both start time and end time for a batching
run, so you can see how long it took.  Newsrunning with no argument now
prints the current state, so a save/restore is possible.  The RFC-errata
document more fully discusses the two areas where C News's compliance is
(according to some) debatable.  (The comment on rfc822ize() has also been
expanded.)  Adddirs now disregards newsgroups marked with "x" or "=", and
actually [blush!] makes the directories it's supposed to make.  Newsdaily
now notes space shortages and reports on unmoderated articles in groups
that your active file thinks are moderated.  Tolerance of syntactically-
illegal message-ids has been reduced.  Relaynews now does a sanity check
on MAXLONG, the definition of which trips up some compilers.  There is
also the usual scattering of minor cleanups.

Finally, the patch-preparation process has been revised to avoid the
14-Sep-1989 problems, and in particular the patch (not just the files
that went into preparing it) has been tested.

start of patch 13-Nov-1989
(suggested archive name: `pch13Nov89.Z')
this should be run with   patch -p0 <thisfile

The following is a complete list of patches to date.

Prereq: 23-Jun-1989
Prereq: 7-Jul-1989
Prereq: 23-Jul-1989
Prereq: 22-Aug-1989
Prereq: 24-Aug-1989
Prereq: 14-Sep-1989
*** PATCHDATES.old	Mon Nov 13 16:23:36 1989
--- PATCHDATES	Mon Nov 13 16:23:36 1989
***************
*** 1,6 ****
--- 1,7 ----
  23-Jun-1989
  7-Jul-1989
  23-Jul-1989
  22-Aug-1989
  24-Aug-1989
  14-Sep-1989
+ 13-Nov-1989

Changed files, if any:

*** cnpatch/old/batch/Makefile	Thu Sep 14 16:03:25 1989
--- batch/Makefile	Tue Oct 31 17:49:05 1989
***************
*** 161,167 ****
  	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
--- 161,167 ----
  	test ! -s out.going/bar/togo ;
  	cmp test.left out.going/bar/togo.2
! 	sed '/^$$/q' batchlog | sed '1d;$$d' | sed '$$d' >test.log
  	test ! -s test.log ;
! 	sed '1,/^$$/d' batchlog | sed '1d;$$d' | sed '$$d' >test.log
  	echo 'bar	backlog 1 (batches flowing)' >test.good
  	cmp test.good test.log

*** cnpatch/old/batch/sendbatches	Tue Aug 22 14:47:39 1989
--- batch/sendbatches	Wed Sep 20 22:05:31 1989
***************
*** 177,179 ****
--- 177,180 ----
  done
  
+ date >>$log
  echo >>$log

*** cnpatch/old/conf/build	Thu Sep 14 16:03:26 1989
--- conf/build	Mon Nov 13 14:59:43 1989
***************
*** 825,828 ****
--- 825,829 ----
  	echo '#! /bin/sh'
  	echo '# -i suppresses install, -t suppresses stdio test, -s suppresses subst'
+ 	echo '# options are seen in first argument only, i.e. use -si not -s -i'
  	echo "umask $newsumask"
  	echo "set -x"

*** cnpatch/old/expire/expire.c	Thu Sep 14 16:03:30 1989
--- expire/expire.c	Thu Sep 14 23:39:41 1989
***************
*** 435,439 ****
  	datum rhs;
  	register int ret;
- 	register char *id;
  
  	cd(ctlfile((char *)NULL));
--- 435,438 ----

*** cnpatch/old/h/libc.h	Thu Sep 14 16:03:35 1989
--- h/libc.h	Sun Sep 17 16:42:07 1989
***************
*** 56,60 ****
  extern FILE *popen();			/* stdio.h */
  #ifdef __STDC__
! extern int printf(char *fmt, ...)	/* stdio.h */
  extern int fprintf(FILE *fp, char *fmt, ...);		/* stdio.h */
  extern sprvalue sprintf(char *buf, char *fmt, ...);	/* stdio.h */
--- 56,60 ----
  extern FILE *popen();			/* stdio.h */
  #ifdef __STDC__
! extern int printf(char *fmt, ...);	/* stdio.h */
  extern int fprintf(FILE *fp, char *fmt, ...);		/* stdio.h */
  extern sprvalue sprintf(char *buf, char *fmt, ...);	/* stdio.h */

*** cnpatch/old/h/news.h	Thu Aug 24 16:39:52 1989
--- h/news.h	Mon Oct 30 13:22:31 1989
***************
*** 102,105 ****
--- 102,107 ----
  #define NO 0
  
+ #define SIZENUL (sizeof(char))		/* size in bytes of an ASCII NUL byte */
+ 
  #define NOTALLHDRS NO			/* hdrdump flags for "all headers seen?" */
  #define ALLHDRS YES

*** cnpatch/old/input/newsrunning	Tue Jun 20 18:58:15 1989
--- input/newsrunning	Fri Nov  3 15:09:26 1989
***************
*** 23,28 ****
  	;;
  
  	*)
! 	echo "Usage: $0 on/off" >&2
  	exit 2
  	;;
--- 23,37 ----
  	;;
  
+ 	'')
+ 	if test -r $stop
+ 	then
+ 		echo off
+ 	else
+ 		echo on
+ 	fi
+ 	;;
+ 
  	*)
! 	echo "Usage: $0 [on/off]" >&2
  	exit 2
  	;;

*** cnpatch/old/libbig/sys.fast.c	Tue Jun 20 18:58:24 1989
--- libbig/sys.fast.c	Thu Oct  5 05:14:57 1989
***************
*** 11,26 ****
  extern struct system *currsys, *firstsys;
  
- /* exports */
- boolean justone = NO;
- 
  /* private */
  static struct system *thissys = NULL;
  
- /* ARGSUSED */
  void
! rewsys(fp)
! FILE *fp;
  {
! 	currsys = firstsys;
  }
  
--- 11,22 ----
  extern struct system *currsys, *firstsys;
  
  /* private */
  static struct system *thissys = NULL;
  
  void
! remmysys(sys)				/* remember this system */
! struct system *sys;
  {
! 	thissys = sys;
  }
  
***************
*** 32,44 ****
  
  void
! remmysys(sys)				/* remember this system */
! struct system *sys;
  {
! 	thissys = sys;
  }
  
  void
! freecurrsys()
  {
! 	/* never free sys entries */
  }
--- 28,55 ----
  
  void
! setupsys(fp)
! FILE *fp;
  {
! 	rewind(fp);
  }
  
+ boolean
+ donesys()
+ {
+ 	return NO;
+ }
+ 
+ /* ARGSUSED */
  void
! rewsys(fp)
! FILE *fp;
  {
! 	currsys = firstsys;
! }
! 
! void
! advcurrsys()	/* advance currsys to the next in-core sys entry, if any. */
! {
! 	if (currsys != NULL)
! 		currsys = currsys->sy_next;
  }

*** cnpatch/old/libcnews/case.c	Thu Sep 14 16:03:37 1989
--- libcnews/case.c	Mon Oct 30 16:59:03 1989
***************
*** 88,91 ****
--- 88,100 ----
  /*
   - rfc822ize - do the bizarre case conversion needed for rfc822 message-ids
+  *
+  * Actually, this is not quite complete.  Absolute, total, full RFC822
+  * compliance requires a horrible parsing job, because of the arcane
+  * quoting conventions -- abc"def"ghi is not equivalent to abc"DEF"ghi,
+  * for example.  There are three or four things that might occur in the
+  * domain part of a message-id that are case-sensitive.  They don't seem
+  * to ever occur in real news, thank Cthulhu.  (What?  You were expecting
+  * a merciful and forgiving deity to be invoked in connection with RFC822?
+  * Forget it; none of them would come near it.)
   */
  char *				/* returns the argument */

*** cnpatch/old/libsmall/sys.slow.c	Tue Jun 20 18:59:34 1989
--- libsmall/sys.slow.c	Thu Oct  5 05:14:23 1989
***************
*** 8,17 ****
  #include "system.h"
  
- /* exports */
- boolean justone = YES;
- 
  /* imports */
  extern struct system *currsys, *firstsys;
  
  struct system *
  mysysincache()
--- 8,24 ----
  #include "system.h"
  
  /* imports */
  extern struct system *currsys, *firstsys;
  
+ /* forwards */
+ FORWARD void freecurrsys();
+ 
+ void
+ remmysys(sys)
+ struct system *sys;
+ {
+ 	/* no cache */
+ }
+ 
  struct system *
  mysysincache()
***************
*** 20,30 ****
  }
  
  void
! remmysys(sys)
! struct system *sys;
  {
! 	/* no cache */
  }
  
  void
  rewsys(fp)
--- 27,48 ----
  }
  
+ /* ARGSUSED */
  void
! setupsys(fp)				/* reuse currsys */
! FILE *fp;
  {
! 	freecurrsys();
  }
  
+ boolean
+ donesys()
+ {
+ 	if (firstsys != NULL) {		/* parsed an entry? */
+ 		firstsys = NULL;	/* not cached, but currsys still valid */
+ 		return YES;
+ 	} else
+ 		return NO;		/* was a comment */
+ }
+ 
  void
  rewsys(fp)
***************
*** 35,49 ****
  }
  
  /*
   * Free current sys entry & associated memory.  Zero currsys too.
   */
! void
  freecurrsys()
  {
! 	if (currsys == NULL)
! 		return;
! 	nnfree(&currsys->sy_name);
! 	nnfree(&currsys->sy_ngs);
! 	nnfree(&currsys->sy_cmd);
! 	nnafree(&currsys);
  }
--- 53,78 ----
  }
  
+ void
+ advcurrsys()
+ {
+ 	/*
+ 	 * the sys file is not in core, so we must not change currsys
+ 	 * to ensure that it gets freed later by freecurrsys().
+ 	 */
+ }
+ 
  /*
   * Free current sys entry & associated memory.  Zero currsys too.
   */
! STATIC void
  freecurrsys()
  {
! 	if (currsys != NULL) {
! 		nnfree(&currsys->sy_name);
! 		nnfree(&currsys->sy_excl);
! 		nnfree(&currsys->sy_ngs);
! 		nnfree(&currsys->sy_distr);
! 		nnfree(&currsys->sy_cmd);
! 		nnafree(&currsys);
! 	}
  }

*** cnpatch/old/libstdio/fgets.c	Thu Sep 14 16:03:39 1989
--- libstdio/fgets.c	Tue Oct  3 00:58:19 1989
***************
*** 75,84 ****
  		 */
  		{
! 			register int copy;
  
- 			if (nlp == NULL)
- 				copy = origbytesleft;
- 			else
- 				copy = nlp - (char *)fp->_ptr;
  			lim -= copy;
  			fp->_cnt -= copy;
--- 75,81 ----
  		 */
  		{
! 			register int copy = (nlp == NULL?
! 				origbytesleft: nlp - (char *)fp->_ptr);
  
  			lim -= copy;
  			fp->_cnt -= copy;

*** cnpatch/old/man/newsaux.8	Thu Sep 14 16:03:42 1989
--- man/newsaux.8	Fri Sep 15 13:19:38 1989
***************
*** 7,11 ****
  .\" =()<.ds m @<NEWSMASTER>@>()=
  .ds m usenet
! .TH NEWSAUX 8 "13 Sept 1989" "C News"
  .SH NAME
  spacefor \- check available space for news
--- 7,11 ----
  .\" =()<.ds m @<NEWSMASTER>@>()=
  .ds m usenet
! .TH NEWSAUX 8 "15 Sept 1989" "C News"
  .SH NAME
  spacefor \- check available space for news
***************
*** 150,154 ****
  for easier processing.
  Canonicalization forces all alphabetics to lower case except the first
! letter of the keyword, which is forced to upper case.
  (One exception:
  ``Message-ID'' is the canonical form of [e.g.] ``message-id''.)
--- 150,155 ----
  for easier processing.
  Canonicalization forces all alphabetics to lower case except the first
! letter of each (hyphen-separated) word in the keyword,
! which is forced to upper case.
  (One exception:
  ``Message-ID'' is the canonical form of [e.g.] ``message-id''.)

*** cnpatch/old/man/rnews.8	Sun Jul 23 00:48:11 1989
--- man/rnews.8	Fri Nov  3 15:15:21 1989
***************
*** 7,11 ****
  .\" =()<.ds m @<NEWSMASTER>@>()=
  .ds m usenet
! .TH RNEWS 8 "14 July 1989" "C News"
  .SH NAME
  rnews, cunbatch \- accept and spool news input
--- 7,11 ----
  .\" =()<.ds m @<NEWSMASTER>@>()=
  .ds m usenet
! .TH RNEWS 8 "3 Nov 1989" "C News"
  .SH NAME
  rnews, cunbatch \- accept and spool news input
***************
*** 29,33 ****
  .br
  .B \*b/input/newsrunning
! {\fBon\fR|\fBoff\fR}
  .SH DESCRIPTION
  .I Rnews
--- 29,33 ----
  .br
  .B \*b/input/newsrunning
! [\fBon\fR|\fBoff\fR]
  .SH DESCRIPTION
  .I Rnews
***************
*** 55,60 ****
  should be run periodically (e.g. by \fIcron\fR(8)) to process spooled news.
  .I Newsrunning
! can be used to enable and disable \fInewsrun\fR's processing if it is desired
  to avoid major news processing during certain hours.
  .PP
  .I Newsrun
--- 55,66 ----
  should be run periodically (e.g. by \fIcron\fR(8)) to process spooled news.
  .I Newsrunning
! can be used to turn \fInewsrun\fR's processing off and on if it is desired
  to avoid major news processing during certain hours.
+ `\fBnewsrunning off\fR' instructs any currently-running \fInewsrun\fR to
+ stop as soon as possible, and prevents later ones from running.
+ `\fBnewsrunning on\fR' removes the inhibition (but does not actually
+ start a new \fInewsrun\fR).
+ Without an argument, \fInewsrunning\fR reports the current status:
+ ``off'' or ``on''.
  .PP
  .I Newsrun

*** cnpatch/old/misc/adddirs	Tue Aug 22 14:47:37 1989
--- misc/adddirs	Mon Sep 18 18:21:58 1989
***************
*** 8,12 ****
  umask $NEWSUMASK
  
! for dir in `sed 's/[ 	].*//' $NEWSCTL/active | tr . /`
  do
  	if test ! -d $NEWSARTS/$dir
--- 8,12 ----
  umask $NEWSUMASK
  
! for dir in `awk '$4 !~ /^[x=]/ { print $1 }' $NEWSCTL/active | tr . /`
  do
  	if test ! -d $NEWSARTS/$dir
***************
*** 13,17 ****
  	then
  		echo "making $dir (and parents if needed...)"
! 		: mkpdir $NEWSARTS/$dir
  	fi
  done
--- 13,17 ----
  	then
  		echo "making $dir (and parents if needed...)"
! 		mkpdir $NEWSARTS/$dir
  	fi
  done

*** cnpatch/old/misc/delgroup	Tue Jun 20 19:00:10 1989
--- misc/delgroup	Wed Nov  8 14:23:38 1989
***************
*** 46,48 ****
  mv active active.old && mv active.tmp active
  
! echo "You may wish to rm -rf $NEWSARTS/`echo "$1" | sed 's;\.;/;g'` at some point."
--- 46,48 ----
  mv active active.old && mv active.tmp active
  
! echo "You may wish to rmdir $NEWSARTS/`echo "$1" | sed 's;\.;/;g'` at some point."

*** cnpatch/old/misc/getdate.c	Tue Jun 20 19:00:06 1989
--- misc/getdate.c	Tue Oct 31 15:58:40 1989
***************
*** 74,78 ****
  	it = getdate(tm, &ftnow);
  	if (it < 0)
! 		error("`%s' not valid date", tm);
  	else
  		(void) printf("%ld\n", it);
--- 74,78 ----
  	it = getdate(tm, &ftnow);
  	if (it < 0)
! 		(void) fprintf(stderr, "%s: `%s' not a valid date\n", progname, tm);
  	else
  		(void) printf("%ld\n", it);

*** cnpatch/old/misc/newsdaily	Tue Aug 22 14:47:48 1989
--- misc/newsdaily	Sat Nov  4 15:11:16 1989
***************
*** 29,33 ****
  
  # keep one generation of log -- it's big
! rm log.o
  mv log log.o && >log
  
--- 29,33 ----
  
  # keep one generation of log -- it's big
! rm -f log.o
  mv log log.o && >log
  
***************
*** 84,89 ****
  	) >>$gripes
  fi
  
! # look for unknown newsgroups on input (misses cross-posted articles)
  cd $NEWSCTL
  egrep '`' log.o | egrep junked | sed 's/.*`\(.*\)'"'"'.*/\1/' | sort |
--- 84,98 ----
  	) >>$gripes
  fi
+ cd $NEWSCTL
+ no=`egrep 'disk too full' batchlog.o | wc -l`
+ if test " $no" -gt 0
+ then
+ 	(
+ 		echo "space shortage(s) limited batching $no times"
+ 		echo
+ 	) >>$gripes
+ fi
  
! # look for problem newsgroups on input (can miss cross-posted articles)
  cd $NEWSCTL
  egrep '`' log.o | egrep junked | sed 's/.*`\(.*\)'"'"'.*/\1/' | sort |
***************
*** 93,96 ****
--- 102,115 ----
  	(
  		echo 'leading five unknown newsgroups by number of articles:'
+ 		cat $tmp
+ 		echo
+ 	) >>$gripes
+ fi
+ egrep '`' log.o | egrep unapproved | sed 's/.*`\(.*\)'"'"'.*/\1/' | sort |
+ 	uniq -c | sort -nr | sed 5q >$tmp
+ if test -s $tmp
+ then
+ 	(
+ 		echo 'top five supposedly-moderated groups with unmoderated postings:'
  		cat $tmp
  		echo

*** cnpatch/old/notebook/rfcerrata	Tue Jun 20 18:56:30 1989
--- notebook/rfcerrata	Mon Nov 13 16:09:15 1989
***************
*** 68,78 ****
  .PP
  RFC 1036
! claims that
  .I cancel
! control messages should stop propagating when their target messages
! are not present;
! it would improve the efficacy of
! .I cancel s
! to propagate them anyway.
  .SH
  ihave/sendme not documented
--- 68,88 ----
  .PP
  RFC 1036
! says that
  .I cancel
! control messages should stop propagating if the receiving system
! is ``unable to cancel the message as requested''.
! It is not clear what this means, given that modern news systems hang
! onto cancellations for not-yet-seen articles in hopes of being able
! to cancel them in the future.
! B 2.11 interprets absence of the target article as ``unable to cancel''.
! It would improve the efficacy and reliability of
! .IR cancel s
! to propagate them anyway, given that feed anomalies are widespread.
! There have been verified instances in which cancellations did not achieve
! anywhere near the propagation of the original article.
! In the interests of robustness,
! C News interprets absence of the target article as deferred cancellation
! rather than failure to cancel, and propagates the
! .IR cancel .
  .SH
  ihave/sendme not documented
***************
*** 94,95 ****
--- 104,119 ----
  or a
  .I remotesys .
+ .SH
+ case-sensitivity in message-ids
+ .PP
+ RFC 1036 says nothing about whether message-ids are case-sensitive or not,
+ thereby punting the issue to RFC 822.
+ The RFC 822 rules are horrendously complex and no news system has ever
+ implemented them correctly.
+ (B 2.10 considers them fully case-sensitive, which is wrong.
+ B 2.11 considers them fully case-insensitive, which is also wrong.
+ C News gets the normal case right, but correct handling of certain
+ obscure RFC 822 constructs would
+ require a complex parsing algorithm; fortunately, the cases where this
+ matters appear to be extremely rare.)
+ Simplification appears necessary.

*** cnpatch/old/relay/hdrparse.c	Thu Sep 14 16:03:48 1989
--- relay/hdrparse.c	Mon Sep 18 18:19:59 1989
***************
*** 60,63 ****
--- 60,66 ----
   * then the strsave calls need to check for failure.
   *
+  * An article lacking a Message-ID: but possessing an (obsolete)
+  * Article-I.D.: gets the transformed Article-I.D. as its Message-ID:.
+  *
   * We support control message *backwards* compatibility: if no Control:
   * header exists and the newsgroup matches all.all.ctl, use the Subject:
***************
*** 72,92 ****
  	if (hdrs->h_distr == NULL)
  		hdrs->h_distr = strsave(DEFDIST);
! 	if (hdrs->h_msgid == NULL && hdrs->h_artid != NULL)	/* obs. art.id. */
! 		hdrs->h_msgid = strsave(hdrs->h_artid);
! 	if (hdrs->h_msgid == NULL)
  		hdrs->h_msgid = strsave(DEFMSGID);
- 	if (hdrs->h_msgid[0] == '\0') {
- 		free(hdrs->h_msgid);
- 		hdrs->h_msgid = strsave(DEFMSGID);
  	}
! 	if (hdrs->h_expiry == NULL)
  		hdrs->h_expiry = strsave(DEFEXP);
- 	if (hdrs->h_expiry[0] == '\0') {
- 		free(hdrs->h_expiry);
- 		hdrs->h_expiry = strsave(DEFEXP);
  	}
  	if (hdrs->h_subj == NULL)
  		hdrs->h_subj = strsave("");
- 
  	if (hdrs->h_ctlcmd == NULL && oldctl(hdrs))
  		hdrs->h_ctlcmd = strsave(hdrs->h_subj);
--- 75,93 ----
  	if (hdrs->h_distr == NULL)
  		hdrs->h_distr = strsave(DEFDIST);
! 
! 	if (hdrs->h_msgid == NULL && hdrs->h_artid != NULL)
! 		hdrs->h_msgid = str3save("<", hdrs->h_artid, ">");
! 	if (hdrs->h_msgid == NULL || hdrs->h_msgid[0] == '\0') {
! 		nnfree(&hdrs->h_msgid);
  		hdrs->h_msgid = strsave(DEFMSGID);
  	}
! 
! 	if (hdrs->h_expiry == NULL || hdrs->h_expiry[0] == '\0') {
! 		nnfree(&hdrs->h_expiry);
  		hdrs->h_expiry = strsave(DEFEXP);
  	}
+ 
  	if (hdrs->h_subj == NULL)
  		hdrs->h_subj = strsave("");
  	if (hdrs->h_ctlcmd == NULL && oldctl(hdrs))
  		hdrs->h_ctlcmd = strsave(hdrs->h_subj);

*** cnpatch/old/relay/makefile	Thu Sep 14 16:03:49 1989
--- relay/makefile	Fri Sep 15 13:55:22 1989
***************
*** 49,53 ****
  
  all: makefile relaynews
! 	chmod +x sh/* aux/* ctl/*
  
  mkfile: makefile
--- 49,53 ----
  
  all: makefile relaynews
! 	chmod +x sh/[a-z]* aux/[a-z]* ctl/[a-z]*
  
  mkfile: makefile
***************
*** 72,78 ****
  	cp relaynews $(NEWSBIN)/relay
  	: needs to be news-owned, setuid -- build looks after that
! 	cp sh/* $(NEWSBIN)/inject
! 	cp ctl/* $(NEWSBIN)/ctl
! 	cp aux/* $(NEWSBIN)/relay
  	rm -f $(BIN)/inews
  	ln $(NEWSBIN)/inject/inews $(BIN)/inews 2>/dev/null || cp sh/inews $(BIN)
--- 72,78 ----
  	cp relaynews $(NEWSBIN)/relay
  	: needs to be news-owned, setuid -- build looks after that
! 	cp sh/[a-z]* $(NEWSBIN)/inject
! 	cp ctl/[a-z]* $(NEWSBIN)/ctl
! 	cp aux/[a-z]* $(NEWSBIN)/relay
  	rm -f $(BIN)/inews
  	ln $(NEWSBIN)/inject/inews $(BIN)/inews 2>/dev/null || cp sh/inews $(BIN)

*** cnpatch/old/relay/procart.c	Thu Sep 14 16:03:49 1989
--- relay/procart.c	Mon Sep 18 18:20:00 1989
***************
*** 294,312 ****
  register struct article *art;
  {
! 	if (art->h.h_path == NULL) {
  		prefuse(art);
  		(void) printf("no Path: header\n");
! 	} else if (art->h.h_msgid == NULL || art->h.h_msgid[0] == '\0') {
  		prefuse(art);
  		(void) printf("missing Message-ID\n");
! 	} else if (strchr(art->h.h_msgid, ' ') != NULL ||
! 	   strchr(art->h.h_msgid, '\t') != NULL) {
  		prefuse(art);
  		(void) printf("whitespace in Message-ID\n");
! 	} else if (alreadyseen(art->h.h_msgid)) {
  		prefuse(art);
  		(void) printf("duplicate\n");
! 	} else if (art->h.h_path != NULL && hopcount(art->h.h_path) > 0 &&
! 	    !ngmatch(oursys()->sy_ngs, art->h.h_ngs)) {
  		extern boolean histreject;
  
--- 294,318 ----
  register struct article *art;
  {
! 	register char *msgid = art->h.h_msgid;
! 	register char *path =  art->h.h_path;
! 	register char *ngs =   art->h.h_ngs;
! 
! 	if (path == NULL) {
  		prefuse(art);
  		(void) printf("no Path: header\n");
! 	} else if (msgid == NULL || msgid[0] == '\0') {
  		prefuse(art);
  		(void) printf("missing Message-ID\n");
! 	} else if (strchr(msgid, ' ') != NULL || strchr(msgid, '\t') != NULL) {
  		prefuse(art);
  		(void) printf("whitespace in Message-ID\n");
! 	} else if (msgid[0] != '<' || msgid[strlen(msgid)-1] != '>') {
  		prefuse(art);
+ 		(void) printf("<> brackets missing in Message-ID\n");
+ 	} else if (alreadyseen(msgid)) {
+ 		prefuse(art);
  		(void) printf("duplicate\n");
! 	} else if (path != NULL && hopcount(path) > 0 &&
! 	    !ngmatch(oursys()->sy_ngs, ngs)) {
  		extern boolean histreject;
  
***************
*** 319,327 ****
  			history(art, NOLOG);
  		prefuse(art);
! 		(void) printf("no subscribed groups in `%s'\n", art->h.h_ngs);
! 	} else if (art->h.h_approved == NULL && moderated(art->h.h_ngs)) {
  		prefuse(art);
  		(void) printf("unapproved article in moderated group(s) `%s'\n",
! 			art->h.h_ngs);
  	} else
  		return;			/* art was accepted */
--- 325,333 ----
  			history(art, NOLOG);
  		prefuse(art);
! 		(void) printf("no subscribed groups in `%s'\n", ngs);
! 	} else if (art->h.h_approved == NULL && moderated(ngs)) {
  		prefuse(art);
  		(void) printf("unapproved article in moderated group(s) `%s'\n",
! 			ngs);
  	} else
  		return;			/* art was accepted */

*** cnpatch/old/relay/relaynews.c	Thu Sep 14 16:03:51 1989
--- relay/relaynews.c	Wed Nov  1 14:26:33 1989
***************
*** 410,415 ****
  	if (c == '#')
  		return unbatch(in, inname);
! 	else
! 		return cpinsart(in, inname, MAXLONG, NO);
  }
  
--- 410,424 ----
  	if (c == '#')
  		return unbatch(in, inname);
! 	else {
! 		register long infinite = MAXLONG;
! 
! 		if (infinite <= 0) {		/* paranoia */
! 			errno = 0;
! 			errunlock(
! 			"MAXLONG is non-positive; rebuild the news software",
! 				"");
! 		}
! 		return cpinsart(in, inname, infinite, NO);
! 	}
  }
  

*** cnpatch/old/relay/sys.c	Thu Aug 24 16:40:07 1989
--- relay/sys.c	Thu Oct  5 05:14:06 1989
***************
*** 32,38 ****
  
  /* imports */
! extern boolean justone;
  extern struct system *mysysincache();
! extern void rewsys(), remmysys(), freecurrsys();
  
  struct system *
--- 32,38 ----
  
  /* imports */
! extern boolean donesys();
  extern struct system *mysysincache();
! extern void rewsys(), remmysys(), advcurrsys(), setupsys();
  
  struct system *
***************
*** 66,75 ****
  /*
   * Return the next sys entry, which may span multiple lines.
!  * Returned pointer points at a static struct whose members
!  * point at static storage.
   *
!  * It would be clearer to rewrite the justone/nextsys/readsys dance
!  * to get rid of justone, but I haven't the energy.  Sorry.  Beware that
!  * justone is set in either ../libbig/sys.fast.c or ../libsmall/sys.slow.c.
   */
  struct system *
--- 66,75 ----
  /*
   * Return the next sys entry, which may span multiple lines.
!  * Returned pointer points at a struct whose lifetime (and that of its
!  * members) is not promised to last beyond the next call to nextsys();
!  * copy it and its pointed-to strings if you need them for longer.
   *
!  * Note that readsys() reads one entry on small systems, but the entire
!  * sys file on big systems, so the common code in this file is subtle.
   */
  struct system *
***************
*** 84,89 ****
  		readsys();
  	retsys = currsys;
! 	if (currsys != NULL)
! 		currsys = currsys->sy_next;
  	return retsys;
  }
--- 84,88 ----
  		readsys();
  	retsys = currsys;
! 	advcurrsys();
  	return retsys;
  }
***************
*** 90,94 ****
  
  /*
!  * If justone, read one entry; else read whole sys file (done once only).
   * Ignores '#' comments and blank lines; uses cfgetms to read possibly-
   * continued lines of arbitrary length.
--- 89,93 ----
  
  /*
!  * On small systems, read one entry; else read whole sys file (done once only).
   * Ignores '#' comments and blank lines; uses cfgetms to read possibly-
   * continued lines of arbitrary length.
***************
*** 99,106 ****
  	register char *sysline;
  
! 	if (justone)
! 		freecurrsys();
! 	else
! 		rewind(fp);
  	while ((sysline = cfgetms(fp)) != NULL) {
  		if (sysline[0] != '#' && sysline[0] != '\n')
--- 98,102 ----
  	register char *sysline;
  
! 	setupsys(fp);		/* reuse currsys or rewind sys file */
  	while ((sysline = cfgetms(fp)) != NULL) {
  		if (sysline[0] != '#' && sysline[0] != '\n')
***************
*** 107,114 ****
  			parsesysln(sysline);
  		free(sysline);
! 		if (justone && firstsys != NULL) {	/* parsed an entry */
! 			firstsys = NULL;
  			return;
- 		}
  	}
  	(void) nfclose(fp);
--- 103,108 ----
  			parsesysln(sysline);
  		free(sysline);
! 		if (donesys())		/* early exit if on disk (small) */
  			return;
  	}
  	(void) nfclose(fp);
***************
*** 121,125 ****
  /*
   * Parse (and modify) sysline into *currsys, which is malloced here
!  * and freed iff "justone", in readsys(), see freecursys().
   *
   * Side-effect: sysline has a trailing newline removed.
--- 115,119 ----
  /*
   * Parse (and modify) sysline into *currsys, which is malloced here
!  * and freed iff on a small system, in readsys(), see freecursys().
   *
   * Side-effect: sysline has a trailing newline removed.
***************
*** 153,160 ****
  
  	/* stash *sysp away on the tail of the current list of systems */
! 	if (firstsys == NULL)
! 		firstsys = sysp;
! 	else
! 		currsys->sy_next = sysp;
  	currsys = sysp;
  }
--- 147,151 ----
  
  	/* stash *sysp away on the tail of the current list of systems */
! 	*(firstsys == NULL? &firstsys: &currsys->sy_next) = sysp;
  	currsys = sysp;
  }
***************
*** 211,215 ****
  /*
   * Parse "next" to colon into malloced storage, return its ptr via "into".
!  * *into is freed iff "justone", in readsys(), see freecursys().
   */
  STATIC void
--- 202,206 ----
  /*
   * Parse "next" to colon into malloced storage, return its ptr via "into".
!  * *into is freed iff on a small system, in readsys(), see freecursys().
   */
  STATIC void

*** cnpatch/old/rna/active.c	Tue Jun 20 19:01:47 1989
--- rna/active.c	Mon Oct 23 21:51:15 1989
***************
*** 3,8 ****
   *
   * format of file:
!  *	<groupname> ' ' <5 digit #> ' ' <5 digit #> ' ' flag '\n'
!  *			  (seq)		  (low)
   */
  
--- 3,8 ----
   *
   * format of file:
!  *	<groupname> ' ' <#> ' ' <#> ' ' flag '\n'
!  *			(seq)	(low)
   */
  
***************
*** 23,29 ****
  {
  	register FILE	*f;
! 	register int i;
  	char gbuf[BUFSIZ / 2], dbuf[BUFSIZ / 4], dbuf2[BUFSIZ / 4];
! 	extern char *itoa();
  
  	f = fopenl(actname);
--- 23,29 ----
  {
  	register FILE	*f;
! 	register long l;
  	char gbuf[BUFSIZ / 2], dbuf[BUFSIZ / 4], dbuf2[BUFSIZ / 4];
! 	extern char *itoa(), *ltoa();
  
  	f = fopenl(actname);
***************
*** 31,45 ****
  	while (getline(f, gbuf, dbuf, dbuf2))
  		if (CMP(gbuf, group) == 0) {
! 			i = atoi(dbuf);
! 			i++;
! 			fseek(f, -12L, 1);
! 			(void) fprintf(f, "%05d", i);
! 			fclose(f);
  #if !AUSAM
  			unlock(actname);
  #endif
! 			return itoa(i);
  		}
! 	(void) fprintf(f, "%s 00001 00001 y\n", group);
  	fclose(f);
  #if !AUSAM
--- 31,44 ----
  	while (getline(f, gbuf, dbuf, dbuf2))
  		if (CMP(gbuf, group) == 0) {
! 			l = atol(dbuf) + 1;
! 			(void) fseek(f, -(long)(2*(10+1)), 1);	/* TODO: fix this */
! 			(void) fprintf(f, "%010d", l);		/* TODO: fix this */
! 			(void) fclose(f);
  #if !AUSAM
  			unlock(actname);
  #endif
! 			return ltoa(l);
  		}
! 	(void) fprintf(f, "%s 0000000000 0000000001 y\n", group);
  	fclose(f);
  #if !AUSAM
***************
*** 49,53 ****
  }
  
- 
  static
  getline(f, g, d, d2)
--- 48,51 ----
***************
*** 97,101 ****
  	char gbuf[BUFSIZ / 2], dbuf[BUFSIZ / 4], dbuf2[BUFSIZ / 4];
  
! 	alist = last = NIL(active);
  	f = fopenf(actname, "r");
  	lineno = 0;
--- 95,99 ----
  	char gbuf[BUFSIZ / 2], dbuf[BUFSIZ / 4], dbuf2[BUFSIZ / 4];
  
! 	alist = last = NULL;
  	f = fopenf(actname, "r");
  	lineno = 0;
***************
*** 103,109 ****
  		ap = NEW(active);
  		ap->a_name = newstr(gbuf);
! 		ap->a_seq = atoi(dbuf);
! 		ap->a_low = atoi(dbuf2);
! 		ap->a_next = NIL(active);
  		if (!alist)
  			alist = ap;
--- 101,107 ----
  		ap = NEW(active);
  		ap->a_name = newstr(gbuf);
! 		ap->a_seq = atol(dbuf);
! 		ap->a_low = atol(dbuf2);
! 		ap->a_next = NULL;
  		if (!alist)
  			alist = ap;
***************
*** 148,153 ****
  	while (getline(f, gbuf, dbuf, dbuf2))
  		if (CMP(gbuf, group) == 0) {
! 			fseek(f, -6L, 1);
! 			(void) fprintf(f, "%05d", low);
  			break;
  		}
--- 146,151 ----
  	while (getline(f, gbuf, dbuf, dbuf2))
  		if (CMP(gbuf, group) == 0) {
! 			fseek(f, -(long)(10+1), 1);	/* TODO: fix this */
! 			(void) fprintf(f, "%010d", low); /* TODO: fix this */
  			break;
  		}
***************
*** 158,163 ****
  }
  
- 
- 
  /*
   * initgrp - initialise an entry for this group
--- 156,159 ----
***************
*** 178,182 ****
  			return;
  		}
! 	(void) fprintf(f, "%s 00000 00001\n", group);
  
  }
--- 174,178 ----
  			return;
  		}
! 	(void) fprintf(f, "%s 0000000000 0000000001\n", group);
  
  }

*** cnpatch/old/rna/defs.h	Tue Jun 20 19:01:48 1989
--- rna/defs.h	Mon Oct 23 21:33:25 1989
***************
*** 42,46 ****
  					   allows "-s subject -i include_file"
  					   arguments */
! #define NETID "utzoo"
  #ifndef NETID
  #define NETID "utstat"			/* else define it here */
--- 42,46 ----
  					   allows "-s subject -i include_file"
  					   arguments */
! #define NETID "utstat"
  #ifndef NETID
  #define NETID "utstat"			/* else define it here */
***************
*** 72,76 ****
  
  #define MYDOMAIN "uucp"			/* Local domain */
! #define MYORG	"U of Toronto Zoology" /* My organization */
  #define NEWSROOT "news"			/* news editor */
  
--- 72,76 ----
  
  #define MYDOMAIN "uucp"			/* Local domain */
! #define MYORG	"U of Toronto Statistics" /* My organization */
  #define NEWSROOT "news"			/* news editor */
  
***************
*** 142,147 ****
  struct active {
  	char	*a_name;
! 	short	a_seq;
! 	short	a_low;
  	active	*a_next;
  };
--- 142,147 ----
  struct active {
  	char	*a_name;
! 	long	a_seq;
! 	long	a_low;
  	active	*a_next;
  };
***************
*** 154,158 ****
  	char	*n_name;
  	bool	n_subscribe;
! 	short	n_last;
  	newsrc	*n_next;
  };
--- 154,158 ----
  	char	*n_name;
  	bool	n_subscribe;
! 	long	n_last;
  	newsrc	*n_next;
  };
***************
*** 159,163 ****
  
  char	*strrchr(), *strchr(), *strcat(), *strcpy(), *strpbrk();
! char	*itoa(), *convg(), *ngsquash(), *ttoa(), *mgets(), *rconvg();
  char	*newstr(), *newstr2(), *newstr3(), *newstr4(), *newstr5(), *catstr();
  char	*catstr2(), *bsearch(), *mtempnam(), *newstr6();
--- 159,163 ----
  
  char	*strrchr(), *strchr(), *strcat(), *strcpy(), *strpbrk();
! char	*itoa(), *ltoa(), *convg(), *ngsquash(), *ttoa(), *mgets(), *rconvg();
  char	*newstr(), *newstr2(), *newstr3(), *newstr4(), *newstr5(), *catstr();
  char	*catstr2(), *bsearch(), *mtempnam(), *newstr6();

*** cnpatch/old/rna/funcs.c	Tue Jun 20 19:01:50 1989
--- rna/funcs.c	Mon Oct 23 21:14:21 1989
***************
*** 212,216 ****
  }
  
- 
  /*
   * get unique sequence number from SEQ
--- 212,215 ----
***************
*** 220,235 ****
  {
  	register long number;
! 	register FILE	*f;
  	static char buf[12];
  
  	f = fopenl(SEQ);
! 	if (fread(buf, 1, sizeof(buf), f) > 0)
  		number = atol(buf);
  	else
  		number = 1;
- 
  	rewind(f);
  	(void) fprintf(f, "%ld\n", number + 1);
! 	fclose(f);
  #if !AUSAM
  	unlock(SEQ);
--- 219,233 ----
  {
  	register long number;
! 	register FILE *f;
  	static char buf[12];
  
  	f = fopenl(SEQ);
! 	if (fread(buf, 1, sizeof buf, f) > 0)
  		number = atol(buf);
  	else
  		number = 1;
  	rewind(f);
  	(void) fprintf(f, "%ld\n", number + 1);
! 	(void) fclose(f);
  #if !AUSAM
  	unlock(SEQ);
***************
*** 240,244 ****
  }
  
- 
  /*
   * open a locked file (or create) for reading and writing
--- 238,241 ----
***************
*** 248,260 ****
  char *fname;
  {
! 	register FILE	*f;
  #ifdef AUSAM
  	struct stat sbuf;
  #endif
  
! 	extern uid_t	newsuid;
! 
! 	if ((f = fopen(fname, "r+")) == NIL(FILE) && (f = fopen(fname, "w+")) ==
! 	    NIL(FILE))
  		error("Can't open %s", fname);
  
--- 245,256 ----
  char *fname;
  {
! 	register FILE *f;
  #ifdef AUSAM
  	struct stat sbuf;
  #endif
+ 	extern uid_t newsuid;
  
! 	if ((f = fopen(fname, "r+")) == NULL &&
! 	    (f = fopen(fname, "w+")) == NULL)
  		error("Can't open %s", fname);
  
***************
*** 262,268 ****
  	if (fstat(fileno(f), &sbuf) != 0)
  		error("Can't stat %s", fname);
! 	if ((sbuf.st_mode & S_IFMT) != S_IFALK && (chmod(fname, (int) (sbuf.st_mode
! 	    &~S_IFMT) | S_IFALK) != 0 || chown(fname, (int) newsuid, (int) newsuid) !=
! 	    0 || fclose(f) == EOF || (f = fopen(fname, "r+")) == NIL(FILE)))
  		error("Can't create %s", fname);
  #else
--- 258,266 ----
  	if (fstat(fileno(f), &sbuf) != 0)
  		error("Can't stat %s", fname);
! 	if ((sbuf.st_mode & S_IFMT) != S_IFALK &&
! 	    (chmod(fname, (int)(sbuf.st_mode&~S_IFMT) | S_IFALK) != 0 ||
! 	    chown(fname, (int)newsuid, (int)newsuid) != 0 ||
! 	    fclose(f) == EOF ||
! 	    (f = fopen(fname, "r+")) == NULL))
  		error("Can't create %s", fname);
  #else
***************
*** 320,324 ****
  	register FILE	*f;
  
! 	if ((f = fopen(name, mode)) == NIL(FILE))
  		error("Can't %s %s", *mode == 'r' ? "open" : "create", name);
  	return f;
--- 318,322 ----
  	register FILE	*f;
  
! 	if ((f = fopen(name, mode)) == NULL)
  		error("Can't %s %s", *mode == 'r' ? "open" : "create", name);
  	return f;
***************
*** 369,373 ****
  
  	fflush(stdout);
! 	if (fgets(buf, sizeof(buf), stdin) == NIL(char)) {
  		(void) printf("\n");
  		return NIL(char);
--- 367,371 ----
  
  	fflush(stdout);
! 	if (fgets(buf, sizeof(buf), stdin) == NULL) {
  		(void) printf("\n");
  		return NIL(char);
***************
*** 376,383 ****
  		while (isspace(*s) && s > buf)
  			*s-- = '\0';
! 	else
! 	 {
  		(void) printf("Input line too long.\n");
! 		return NIL(char);
  	}
  	s = buf;
--- 374,380 ----
  		while (isspace(*s) && s > buf)
  			*s-- = '\0';
! 	else {
  		(void) printf("Input line too long.\n");
! 		return NULL;
  	}
  	s = buf;
***************
*** 531,535 ****
  char *path;
  {
! 	FILE		 * f;
  	register char *ex1, *ex2, *com, *new;
  	char buf[BUFSIZ];
--- 528,532 ----
  char *path;
  {
! 	FILE *f;
  	register char *ex1, *ex2, *com, *new;
  	char buf[BUFSIZ];
***************
*** 540,545 ****
  		if ((f = popen(com, "r")) == NIL(FILE))
  			(void) printf("Couldn't run \"%s\"\n", com);
! 		else
! 		 {
  			fread(buf, sizeof(buf), 1, f);
  			if (pclose(f) != 0) {
--- 537,541 ----
  		if ((f = popen(com, "r")) == NIL(FILE))
  			(void) printf("Couldn't run \"%s\"\n", com);
! 		else {
  			fread(buf, sizeof(buf), 1, f);
  			if (pclose(f) != 0) {
***************
*** 558,562 ****
  	}
  	return path;
- 
  }
  
--- 554,557 ----
***************
*** 571,577 ****
  register char *sp;
  {
! 	register char *sep;
  
- 	sep = NIL(char);
  	while (*sp) {
  		if (sep)
--- 566,571 ----
  register char *sp;
  {
! 	register char *sep = NULL;
  
  	while (*sp) {
  		if (sep)
***************
*** 586,589 ****
  	}
  }
- 
- 
--- 580,581 ----

*** cnpatch/old/rna/header.c	Tue Jun 20 19:01:51 1989
--- rna/header.c	Mon Oct 23 20:50:27 1989
***************
*** 111,115 ****
  	field		af;
  	char buf[BUFLEN*2];
- 
  	char *hfgets();
  
--- 111,114 ----
***************
*** 118,131 ****
  		if (buf[0] == '\n')
  			return;
! 		if (isupper(buf[0]) && (colon = strchr(buf, ':')) && (space =
! 		    strchr(buf, ' ')) && (colon + 1 == space)) {
  			*colon = '\0';
  			af.f_name = buf;
! 			fp = (field * ) bsearch((char *) & af, (char *) fields,
! 			     				sizeof(fields) / sizeof(fields[0]), sizeof(fields[0]),
! 			     fieldcmp);
  			*colon = ':';
  		} else
! 			fp = NIL(field);
  		if (!fp)
  			if (hp->h_others)
--- 117,130 ----
  		if (buf[0] == '\n')
  			return;
! 		if (isupper(buf[0]) && (colon = strchr(buf, ':')) &&
! 		    (space = strchr(buf, ' ')) && (colon + 1 == space)) {
  			*colon = '\0';
  			af.f_name = buf;
! 			fp = (field * )bsearch((char *)&af, (char *)fields,
! 				sizeof fields/sizeof fields[0], sizeof fields[0],
! 				fieldcmp);
  			*colon = ':';
  		} else
! 			fp = NULL;
  		if (!fp)
  			if (hp->h_others)
***************
*** 133,138 ****
  			else
  				hp->h_others = newstr(buf);
! 		else
! 		 {
  			if (colon = strchr(space + 1, '\n'))
  				*colon = '\0';
--- 132,136 ----
  			else
  				hp->h_others = newstr(buf);
! 		else {
  			if (colon = strchr(space + 1, '\n'))
  				*colon = '\0';
***************
*** 394,399 ****
  	register char *cp, *tp;
  
! 	if ((cp = fgets(buf, len, fp)) == NIL(char))
! 		return NIL(char);
  
  	if (*cp == '\n')
--- 392,397 ----
  	register char *cp, *tp;
  
! 	if ((cp = fgets(buf, len, fp)) == NULL)
! 		return NULL;
  
  	if (*cp == '\n')
***************
*** 445,449 ****
  	     tp->tm_sec, tzone);
  	return buf;
- 
  }
  
--- 443,446 ----
***************
*** 474,477 ****
  	return maketime(4, argv, STIMES);
  }
- 
- 
--- 471,472 ----

*** cnpatch/old/rna/history.c	Tue Jun 20 19:01:52 1989
--- rna/history.c	Mon Oct 23 21:35:49 1989
***************
*** 168,175 ****
  
  	f = fopenl(histname);
! 	fseek(f, 0L, 2);
! 	(void) fprintf(f, "%s %s%ld %s\n", histid, etime ? "E" : "", etime ? etime :
! 	    now, histline);
! 	fclose(f);
  #if !AUSAM
  	unlock(histname);
--- 168,175 ----
  
  	f = fopenl(histname);
! 	(void) fseek(f, 0L, 2);
! 	(void) fprintf(f, "%s %s%ld %s\n", histid, (etime? "E": ""),
! 		(etime? (long)etime: now), histline);
! 	(void) fclose(f);
  #if !AUSAM
  	unlock(histname);

*** cnpatch/old/rna/lib/itoa.c	Tue Jun 20 19:01:53 1989
--- rna/lib/itoa.c	Mon Oct 23 21:55:01 1989
***************
*** 8,9 ****
--- 8,19 ----
  	return buf;
  }
+ 
+ char *
+ ltoa(l)
+ long l;
+ {
+ 	static char buf[30];
+ 
+ 	sprintf(buf, "%ld", l);
+ 	return buf;
+ }

*** cnpatch/old/rna/makefile	Thu Aug 24 16:40:08 1989
--- rna/makefile	Mon Oct 23 20:55:25 1989
***************
*** 24,29 ****
  FILES = help
  LCOMMANDS = postnews.lint uurec.lint readnews.lint uusend.lint expire.lint
! # PFILES = header.c postnews.c funcs.c active.c history.c maketime.c mtempnam.c
! PFILES = header.c funcs.c active.c history.c maketime.c mtempnam.c
  RFILES = header.c readnews.c funcs.c active.c newsrc.c history.c maketime.c
  ROFILES= header.o readnews.o funcs.o active.o newsrc.o history.o maketime.o
--- 24,29 ----
  FILES = help
  LCOMMANDS = postnews.lint uurec.lint readnews.lint uusend.lint expire.lint
! # PFILES = header.c postnews.c funcs.c active.c history.c maketime.c
! PFILES = header.c funcs.c active.c history.c maketime.c
  RFILES = header.c readnews.c funcs.c active.c newsrc.c history.c maketime.c
  ROFILES= header.o readnews.o funcs.o active.o newsrc.o history.o maketime.o

*** cnpatch/old/rna/maketime.c	Tue Jun 20 19:01:57 1989
--- rna/maketime.c	Mon Oct 23 21:20:36 1989
***************
*** 396,400 ****
  }
  
- 
  static long 
  construct()
--- 396,399 ----
***************
*** 411,418 ****
  	if (setdayofweek)
  		days += dayofweek;
! 	return days * SECINDAY + hour * SECINHOUR + minute * SECINMIN + second;
  }
  
- 
  static
  adjust()
--- 410,416 ----
  	if (setdayofweek)
  		days += dayofweek;
! 	return (long)days*SECINDAY + (long)hour*SECINHOUR + minute*SECINMIN + second;
  }
  
  static
  adjust()
***************
*** 442,447 ****
  	 * month == tim->tm_mon && day == tim->tm_mday
  	 */
! 	if ((long)(hour*SECINHOUR + minute*SECINMIN + second) <
! 	    (long)(tim->tm_hour*SECINHOUR + tim->tm_min*SECINMIN + tim->tm_sec)) {
  		dim = daysinmonth[month] + (month == 1? leapyear(month): 0);
  		if (setday || ++day / dim) {
--- 440,445 ----
  	 * month == tim->tm_mon && day == tim->tm_mday
  	 */
! 	if ((long)hour*SECINHOUR + minute*SECINMIN + second <
! 	    (long)tim->tm_hour*SECINHOUR + tim->tm_min*SECINMIN + tim->tm_sec) {
  		dim = daysinmonth[month] + (month == 1? leapyear(month): 0);
  		if (setday || ++day / dim) {
***************
*** 453,456 ****
  	}
  }
- 
- 
--- 451,452 ----

*** cnpatch/old/rna/newsrc.c	Tue Jun 20 19:01:59 1989
--- rna/newsrc.c	Mon Oct 23 21:02:59 1989
***************
*** 168,175 ****
  			if (!ngmatch(ap->a_name, group))
  				continue;
! 			if ((np = findnewsrc(ap->a_name)) == NIL(newsrc)) {
  				np = NEW(newsrc);
  				np->n_name = newstr(ap->a_name);
! 				np->n_next = NIL(newsrc);
  				np->n_last = 0;
  				np->n_subscribe = true;
--- 168,175 ----
  			if (!ngmatch(ap->a_name, group))
  				continue;
! 			if ((np = findnewsrc(ap->a_name)) == NULL) {
  				np = NEW(newsrc);
  				np->n_name = newstr(ap->a_name);
! 				np->n_next = NULL;
  				np->n_last = 0;
  				np->n_subscribe = true;
***************
*** 212,216 ****
  
  /*
!  * find if a newrc entry exists,
   * taking advantange of the fact that requests should be
   * in the same order
--- 212,216 ----
  
  /*
!  * find if a newsrc entry exists,
   * taking advantange of the fact that requests should be
   * in the same order
***************
*** 228,232 ****
  
  	if (!rc)
! 		return NIL(newsrc);
  
  	found = false;
--- 228,232 ----
  
  	if (!rc)
! 		return NULL;
  
  	found = false;
***************
*** 295,298 ****
--- 295,299 ----
  static
  writengline(f, np)		/* write .newsrc n.g. line in normal form on f */
+ FILE *f;
  register newsrc *np;
  {

*** cnpatch/old/rna/readnews.c	Tue Jun 20 19:02:10 1989
--- rna/readnews.c	Mon Oct 23 21:57:42 1989
***************
*** 458,462 ****
  	np->n_last++;
  	fname = convg(newstr5(newsdir, "/", ap->a_name, ARTSEP,
! 		itoa(np->n_last)));
  	ino = 0;
  	f = fopen(fname, "r");
--- 458,462 ----
  	np->n_last++;
  	fname = convg(newstr5(newsdir, "/", ap->a_name, ARTSEP,
! 		ltoa(np->n_last)));
  	ino = 0;
  	f = fopen(fname, "r");
***************
*** 493,500 ****
  {
  	static bool done;
- 	register int num;
  
  	np->n_last++;
  	if (Cflag) {
  		if (!done)
  			(void) printf("You have news:\n");
--- 493,501 ----
  {
  	static bool done;
  
  	np->n_last++;
  	if (Cflag) {
+ 		register long num;
+ 
  		if (!done)
  			(void) printf("You have news:\n");
***************
*** 501,505 ****
  		done = true;
  		num = ap->a_seq - np->n_last + 1;
! 		(void) printf("\t%s at most %d article%s\n",
  			ap->a_name, num, (num > 1? "s": ""));
  		return nextgroup;
--- 502,506 ----
  		done = true;
  		num = ap->a_seq - np->n_last + 1;
! 		(void) printf("\t%s at most %ld article%s\n",
  			ap->a_name, num, (num > 1? "s": ""));
  		return nextgroup;
***************
*** 511,515 ****
  }
  
- 
  /*
   * normal command handler (or pflag)
--- 512,515 ----
***************
*** 548,563 ****
  bool pushed;
  {
- 	static char errmess[] = "Incorrect command; Type `?' for help.\n";
- 	static char form[]    = "%s: %s\n";
- 
- 	static char savedsys[BUFSIZ / 2];
- 	static active	*lastap, *rlastap;
- 	static newsrc	lastn;
- 	static char number[20];
- 	static active	*wantap;
- 
  	register char *com, *arg;
! 	register int c, i, size;
! 	register FILE 	*f;
  	char *fname;
  	header		h;
--- 548,555 ----
  bool pushed;
  {
  	register char *com, *arg;
! 	register int c, size;
! 	register long i;
! 	register FILE *f;
  	char *fname;
  	header		h;
***************
*** 566,570 ****
  	bool printed, pheader, verbose, hadinterrupt;
  	applycom	nextact;
! 
  	extern char t_from[], t_subject[], t_date[];
  	extern char t_newsgroups[], t_path[], t_sender[];
--- 558,568 ----
  	bool printed, pheader, verbose, hadinterrupt;
  	applycom	nextact;
! 	static char errmess[] = "Incorrect command; Type `?' for help.\n";
! 	static char form[]    = "%s: %s\n";
! 	static char savedsys[BUFSIZ / 2];
! 	static active	*lastap, *rlastap;
! 	static newsrc	lastn;
! 	static char number[20];
! 	static active	*wantap;
  	extern char t_from[], t_subject[], t_date[];
  	extern char t_newsgroups[], t_path[], t_sender[];
***************
*** 573,577 ****
  	extern active	*activep();
  
- 
  	if (last) {
  		/*
--- 571,574 ----
***************
*** 591,598 ****
  			return nextgroup;
  		else
! 			wantap = NIL(active);
  
  	fname = convg(newstr5(newsdir, "/", ap->a_name, ARTSEP,
! 		itoa(np->n_last + 1)));
  	f = fopen(fname, "r");
  	ino = 0;
--- 588,595 ----
  			return nextgroup;
  		else
! 			wantap = NULL;
  
  	fname = convg(newstr5(newsdir, "/", ap->a_name, ARTSEP,
! 		ltoa(np->n_last + 1)));
  	f = fopen(fname, "r");
  	ino = 0;
***************
*** 599,603 ****
  	if (!f || !last && !pushed && seen(f, &ino)) {
  		if (pushed)
! 			(void) printf("Article %d (%s) no longer exists.\n",
  				np->n_last + 1, ap->a_name);
  		else
--- 596,600 ----
  	if (!f || !last && !pushed && seen(f, &ino)) {
  		if (pushed)
! 			(void) printf("Article %ld (%s) no longer exists.\n",
  				np->n_last + 1, ap->a_name);
  		else
***************
*** 639,643 ****
  		lastap = ap;
  		if (!pheader) {
! 			(void) printf("Article %d of %d (%s)",
  				np->n_last + 1, ap->a_seq, ap->a_name);
  			if (h.h_lines != 0)
--- 636,640 ----
  		lastap = ap;
  		if (!pheader) {
! 			(void) printf("Article %ld of %ld (%s)",
  				np->n_last + 1, ap->a_seq, ap->a_name);
  			if (h.h_lines != 0)
***************
*** 671,676 ****
  			 */
  			com = "";
! 		else
! 		 {
  			(void) printf("? ");
  			if (fflush(stdout) == EOF) {
--- 668,672 ----
  			 */
  			com = "";
! 		else {
  			(void) printf("? ");
  			if (fflush(stdout) == EOF) {
***************
*** 775,780 ****
  #endif
  				 {
! 					(void) printf("Group \"%s\" can't be unsubscribed.\n",
! 					     					 np->n_name);
  					continue;
  				}
--- 771,777 ----
  #endif
  				 {
! 					(void) printf(
! 					"Group \"%s\" can't be unsubscribed.\n",
! 						np->n_name);
  					continue;
  				}
***************
*** 797,801 ****
  			if (!ngmatch(arg, nflag)) {
  				(void) printf("%s: is not subscribed to!\n", arg);
! 				wantap = NIL(active);
  				continue;
  			}
--- 794,798 ----
  			if (!ngmatch(arg, nflag)) {
  				(void) printf("%s: is not subscribed to!\n", arg);
! 				wantap = NULL;
  				continue;
  			}
***************
*** 833,837 ****
  			while (number[0]) {
  				ntmp = lastn;
! 				ntmp.n_last = atoi(number) - 1;
  				number[0] = '\0';
  				nextact = commands(rlastap, &ntmp, false, true);
--- 830,834 ----
  			while (number[0]) {
  				ntmp = lastn;
! 				ntmp.n_last = atol(number) - 1;
  				number[0] = '\0';
  				nextact = commands(rlastap, &ntmp, false, true);
***************
*** 844,847 ****
--- 841,845 ----
  		default:
  			if (isdigit(c)) {
+ /*				i = atol(arg);		*/
  				i = c - '0';
  				while (isdigit(*arg))
***************
*** 854,863 ****
  			number[0] = '\0';
  			if (i < ap->a_low || i > ap->a_seq) {
! 				(void) printf("Articles in \"%s\" group range %d to %d.\n",
! 				     					np->n_name, ap->a_low, ap->a_seq);
  				continue;
  			}
  			if (pushed) {
! 				sprintf(number, "%d", i);
  				nextact = next;
  				break;
--- 852,862 ----
  			number[0] = '\0';
  			if (i < ap->a_low || i > ap->a_seq) {
! 				(void) printf(
! 				    "Articles in \"%s\" group range %ld to %ld.\n",
! 				    np->n_name, ap->a_low, ap->a_seq);
  				continue;
  			}
  			if (pushed) {
! 				sprintf(number, "%ld", i);
  				nextact = next;
  				break;
***************
*** 865,870 ****
  			ntmp = *np;
  			ntmp.n_last = i - 1;
! 			if ((nextact = commands(ap, &ntmp, false, true)) !=
! 			    next)
  				break;
  			if (!number[0]) {
--- 864,868 ----
  			ntmp = *np;
  			ntmp.n_last = i - 1;
! 			if ((nextact = commands(ap, &ntmp, false, true)) != next)
  				break;
  			if (!number[0]) {
***************
*** 889,893 ****
  }
  
- 
  /*
   * see if this is a followup we are ignoring
--- 887,890 ----
***************
*** 1259,1263 ****
  			id++;
  	}
! 	qsort((char *) uflag, (unsigned) usize, sizeof(char *), strpcmp);
  }
  
--- 1256,1260 ----
  			id++;
  	}
! 	qsort((char *)uflag, (unsigned)usize, sizeof(char *), strpcmp);
  }
  
***************
*** 1266,1269 ****
--- 1263,1267 ----
   * print an article, if it's long enough call page()
   */
+ /* ARGSUSED */
  print(hp, f)
  header *hp;
***************
*** 1276,1282 ****
  	if (!pflag
  #ifdef LINESHDRPRESENT
! 	 && hp->h_lines && atoi(hp->h_lines) >= PAGESIZE - 4
  #endif
! 	 )
  		page(f);
  	else
--- 1274,1280 ----
  	if (!pflag
  #ifdef LINESHDRPRESENT
! 	    && hp->h_lines && atoi(hp->h_lines) >= PAGESIZE - 4
  #endif
! 	    )
  		page(f);
  	else
***************
*** 1283,1287 ****
  		while ((c = getc(f)) != EOF)
  			(void) putchar(c);
! 	fseek(f, pos, 0);
  }
  
--- 1281,1285 ----
  		while ((c = getc(f)) != EOF)
  			(void) putchar(c);
! 	(void) fseek(f, pos, 0);
  }
  


end of patch 13-Nov-1989