Xref: utzoo news.software.b:4362 comp.sources.bugs:2287 Newsgroups: news.software.b,comp.sources.bugs Path: utzoo!henry From: henry@utzoo.uucp (Henry Spencer) Subject: C News patch of 12-Mar-1990 Message-ID: <1990Mar13.184017.16591@utzoo.uucp> Organization: U of Toronto Zoology Date: Tue, 13 Mar 90 18:40:17 GMT This is another collection of small stuff. Fix some small bugs in the great build revision; build now will take the saved-answers filename as an argument if desired; subst now tells you which files (if any) it changed; the ldiv() function is no longer used; is now relied on for the declaration of sprintf(), eliminating the question of what type it returns; several error messages improved; newsgroup-matching algorithm refined, improved, and precisely documented (!!!); lazy cache refills in relaynews; documentation on a specialized reason why relaynews might exit with status 1; further additions to the porting- problems document; relaynews now invokes dbmclose() in preparation for the dbz cutover; fix bug in relaynews fallback to symlinks if hard links fail; the usual minor cleanups and fixes. start of patch 12-Mar-1990 (suggested archive name: `pch12Mar90.Z') this should be run with patch -p0 header file declares sprintf() -- some do,' - echo 'some do not.) If you do need to edit "libc.h", look' - echo 'for the definition of "sprvalue".' - ;; - esac - - echo echo 'Very old Unix systems needed the order of object modules in a library' echo 'chosen very carefully. V7 introduced "ranlib" which removes the need' --- 387,390 ---- *************** *** 477,481 **** echo ' bsd 4.2BSD and later' echo ' sysv many System Vs' ! echo ' xenix some (all?) Xenixes, notably SCO; also Microport?' echo ' sgi Silicon Graphics Iris systems' echo ' ultrix DEC Ultrix 3.0 (and later) (and earlier??)' --- 464,468 ---- echo ' bsd 4.2BSD and later' echo ' sysv many System Vs' ! echo ' xenix some (all?) Xenixes; some System Vs, e.g. Microport, HP?' echo ' sgi Silicon Graphics Iris systems' echo ' ultrix DEC Ultrix 3.0 (and later) (and earlier??)' *************** *** 502,506 **** echo 'name of a device. Modern ones can be given any directory name and' echo 'the system handles the details of figuring out what device is meant.' ! dfdirs=`yesno 'Will your "df" accept a directory-name argument' ${dfdirs-yes}` case "$dfdirs" in no) echo 'You are going to have to customize "spacefor" for your system.' --- 489,494 ---- echo 'name of a device. Modern ones can be given any directory name and' echo 'the system handles the details of figuring out what device is meant.' ! echo 'A few will take a directory only if it is the "top" of a filesystem.' ! dfdirs=`yesno 'Will "df" accept any directory name as an argument' ${dfdirs-yes}` case "$dfdirs" in no) echo 'You are going to have to customize "spacefor" for your system.' *************** *** 535,539 **** echo 'Are you running C News on a group of machines hooked together with NFS,' nfsgroup=`yesno 'with articles filed on one "server" machine' ${nfsgroup-no}` - server= case "$nfsgroup" in yes) case "$hostname$uname" in --- 523,526 ---- *************** *** 978,985 **** echo echo 'saving defaults...' ! rm -f build.def ! >build.def warn='# These answers are interdependent; do not edit this file!' ! if test ! -w build.def then echo 'It appears that I cannot save the defaults.' --- 965,972 ---- echo echo 'saving defaults...' ! rm -f $memory ! >$memory warn='# These answers are interdependent; do not edit this file!' ! if test ! -w $memory then echo 'It appears that I cannot save the defaults.' *************** *** 991,998 **** eval "echo $v=\\\"\$$v\\\"" done ! ) >>build.def echo 'done' fi ! chmod -w build.def echo --- 978,985 ---- eval "echo $v=\\\"\$$v\\\"" done ! ) >>$memory echo 'done' fi ! chmod -w $memory echo *** cnpatch/old/conf/subst Tue Jan 16 17:58:28 1990 --- conf/subst Sat Feb 10 19:53:16 1990 *************** *** 36,40 **** ;; esac ! echo "$f:" # test existences --- 36,40 ---- ;; esac ! echo "$f: " | tr -d '\012' # test existences *************** *** 77,80 **** --- 77,81 ---- then rm -f $new $old + echo "unchanged" else trap "mv $old $f; exit" 1 2 15 *************** *** 83,86 **** --- 84,88 ---- trap "rm -f $old; exit" 1 2 15 rm $old + echo "updated" fi done *** cnpatch/old/expire/README Wed Jan 10 19:10:22 1990 --- expire/README Sat Jan 27 21:57:01 1990 *************** *** 1,10 **** C News expire ! Unlike the old alpha C News expire, this one will accept B News history files... although that slows it down, and this hasn't been tested well. Beware that the date in the middle field of the history line must be ! readable to getdate(3), and rumor hath it that late B 2.11 dates are not. ! Talk about stupid... We don't care enough to do anything about this. Rebuilding your history file in C News format is preferable anyway. It WON'T accept the old experimental C News four-field history files; --- 1,10 ---- C News expire ! Unlike the old alpha C News expire, this one will accept old B News history files... although that slows it down, and this hasn't been tested well. Beware that the date in the middle field of the history line must be ! readable to getdate(3), and rumor hath it that mid-B2.11 dates are not. Rebuilding your history file in C News format is preferable anyway. + Current releases of B News use C News format, in fact. It WON'T accept the old experimental C News four-field history files; *** cnpatch/old/expire/dircheck Fri Jun 23 14:45:45 1989 --- expire/dircheck Tue Mar 6 13:42:58 1990 *************** *** 6,10 **** esac ! for f in `sed 's/.* //;s/\./\//g'` do if test " $invert" = " " --- 6,10 ---- esac ! for f in `sed 's/.* //;s:\.:/:g'` do if test " $invert" = " " *** cnpatch/old/expire/doexpire Thu Aug 24 16:39:49 1989 --- expire/doexpire Sat Feb 17 19:27:24 1990 *************** *** 40,45 **** if test " $ropt" = " -r" then ! echo "$0: short of space for temporaries, resorting to \`expire -r'" | ! mail "$NEWSMASTER" fi --- 40,51 ---- if test " $ropt" = " -r" then ! ( ! echo "$0:" ! echo " SEVERE SPACE SHORTAGE in $NEWSCTL !" ! echo " Unable to rebuild history files due to insufficient" ! echo " space for temporaries -- resorting to \`expire -r'." ! echo " Growth of the history files will make things worse;" ! echo " if shortage persists, human action is urgently needed." ! ) | mail "$NEWSMASTER" fi *** cnpatch/old/expire/expire.c Wed Jan 10 19:10:24 1990 --- expire/expire.c Fri Feb 23 15:15:32 1990 *************** *** 1168,1171 **** --- 1168,1173 ---- char *s2; { + int saveerr = errno; + if (spacetight) { cd(ctlfile((char *)NULL)); *************** *** 1174,1177 **** --- 1176,1180 ---- (void) unlink("history.n.pag"); } + errno = saveerr; errunlock(s1, s2); /* NOTREACHED */ *** cnpatch/old/h/libc.h Mon Nov 13 17:39:44 1989 --- h/libc.h Thu Feb 8 15:01:17 1990 *************** *** 1,3 **** - #ifndef LIBC_H #define LIBC_H --- 1,2 ---- *************** *** 55,66 **** #endif /* A_STABLE_WORLD */ 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 */ ! #else /* __STDC__ */ ! extern int printf(), fprintf(); /* stdio.h */ ! extern sprvalue sprintf(); /* stdio.h */ ! #endif /* __STDC__ */ /* these unfortunately cannot be relied upon to be in the right header */ --- 54,58 ---- #endif /* A_STABLE_WORLD */ extern FILE *popen(); /* stdio.h */ ! /* stdio.h is supposed to declare *printf */ /* these unfortunately cannot be relied upon to be in the right header */ *** cnpatch/old/h/news.h Mon Nov 13 17:39:44 1989 --- h/news.h Mon Mar 5 13:41:55 1990 *************** *** 71,75 **** /* STREQN is an optimised strncmp(a,b,n)==0; assumes n > 0 */ #define STREQN(a, b, n) ((a)[0] == (b)[0] && strncmp(a, b, n) == 0) ! #define STRLEN(s) (sizeof (s) - 1) /* s must be a char array */ #ifdef FASTSTRCHR #define STRCHR(src, chr, dest) (dest) = strchr(src, chr) --- 71,75 ---- /* STREQN is an optimised strncmp(a,b,n)==0; assumes n > 0 */ #define STREQN(a, b, n) ((a)[0] == (b)[0] && strncmp(a, b, n) == 0) ! #define STRLEN(s) ((unsigned)sizeof(s) - 1) /* s must be a char array */ #ifdef FASTSTRCHR #define STRCHR(src, chr, dest) (dest) = strchr(src, chr) *************** *** 87,90 **** --- 87,91 ---- #define nnafree(mempp) (*(mempp) != 0? (free((char *)*(mempp)), (*(mempp) = 0)): 0) #ifdef lint + static nnfree(mempp) /* If *mempp is non-null, free it and zero it. */ register char **mempp; /* pointer to malloc'ed ptr. */ *** cnpatch/old/hfake/Makefile Wed Jan 10 19:10:30 1990 --- hfake/Makefile Fri Mar 9 14:12:39 1990 *************** *** 2,11 **** # beware -- build knows about NEEDED ! NEEDED = ../include/stdlib.h ../include/string.h all: $(NEEDED) - $(I)/stdlib.h: stdlib.h - cp stdlib.h $@ $(I)/string.h: string.h cp string.h $@ --- 2,9 ---- # beware -- build knows about NEEDED ! NEEDED = ../include/string.h all: $(NEEDED) $(I)/string.h: string.h cp string.h $@ *** cnpatch/old/input/newsrun Wed Jan 10 19:10:33 1990 --- input/newsrun Thu Mar 8 12:20:53 1990 *************** *** 139,143 **** mv $f $bad # Not $text, save the ORIGINAL! fi ! echo "$server relaynews \`$bad' failed, status $st" | mail "$NEWSMASTER" fi --- 139,143 ---- mv $f $bad # Not $text, save the ORIGINAL! fi ! echo "$server relaynews \`$bad' failed, status $st (see errlog)" | mail "$NEWSMASTER" fi *** cnpatch/old/libcnews/ltoza.c Tue Jun 20 18:59:10 1989 --- libcnews/ltoza.c Sat Feb 10 18:50:46 1990 *************** *** 6,10 **** * with printf on V7, due to a bug in V7's printf. */ - #include #define RADIX 10 --- 6,9 ---- *************** *** 32,40 **** op += wwid - 1; /* find right end */ while (wwid-- > 0) { /* generate "wwid" digits */ ! register ldiv_t result; ! ! result = ldiv(wval, (long)RADIX); /* shades of V6! */ ! wval = result.quot; ! *op-- = result.rem + '0'; } return wval == 0; --- 31,36 ---- op += wwid - 1; /* find right end */ while (wwid-- > 0) { /* generate "wwid" digits */ ! *op-- = wval % RADIX + '0'; ! wval /= RADIX; } return wval == 0; *** cnpatch/old/libcnews/ngmatch.c Thu Aug 24 16:39:54 1989 --- libcnews/ngmatch.c Wed Mar 7 13:45:05 1990 *************** *** 9,24 **** * word: { alphanum }+ | "all" * ! * Only one group need match for success. (Redundant?) * * For each group, note the depth of each match against the patterns, ! * negated or not. Ignore mismatches. The deepest match wins at the end; ! * if it's a tie, negated matches are rejections. * - * A match of any group against the patterns is a success. - * Failure to match any pattern with a group is a mismatch of that group. - * Failure to match any group against any pattern is a total failure. - * * "all" in a pattern is a wildcard that matches exactly one word; ! * it does not cross "." (NGDELIM) delimiters. */ --- 9,26 ---- * word: { alphanum }+ | "all" * ! * Only one group need match for success. ! * Failure to match any pattern with a group is a mismatch of that group only. ! * Failure to match any group against any pattern is a total failure. * * For each group, note the depth of each match against the patterns, ! * negated or not. Ignore mismatches. The deepest match wins at the ! * end: a deeper negated match is a failure, a deeper plain match is a ! * success; a tie is a failure, but see the description of wildcards. * * "all" in a pattern is a wildcard that matches exactly one word; ! * it does not cross "." (NGDELIM) delimiters. A non-wildcard match is ! * considered to have matched slightly deeper than a wildcard match in the ! * same position. This ensures that !alt.sex.all,alt.sex.bondage matches ! * alt.sex.bondage. */ *************** *** 106,114 **** ; /* ignore it */ else if (negation) { ! /* record ordinal # of deepest negated matched word */ if (depth > faildeepest) faildeepest = depth; } else { ! /* record ordinal # of deepest plain matched word */ if (depth > hitdeepest) hitdeepest = depth; --- 108,116 ---- ; /* ignore it */ else if (negation) { ! /* record depth of deepest negated matched word */ if (depth > faildeepest) faildeepest = depth; } else { ! /* record depth of deepest plain matched word */ if (depth > hitdeepest) hitdeepest = depth; *************** *** 124,130 **** * Match a pattern against a group by looking at each word of pattern in turn. * ! * On a match, return the ordinal number of the rightmost word that matches. ! * If group runs out first, the match fails; else it succeeds. ! * On a failure, return zero. */ STATIC int --- 126,132 ---- * Match a pattern against a group by looking at each word of pattern in turn. * ! * On a match, return the depth (roughly, ordinal number * k) of the rightmost ! * word that matches. If group runs out first, the match fails; if pattern ! * runs out first, it succeeds. On a failure, return zero. */ STATIC int *************** *** 138,143 **** for (patwd = patp, grwd = grp; patwd != NULL && grwd != NULL; ! patwd = patdot, grwd = grdot, depth++) { ! register boolean match; /* null-terminate words */ --- 140,146 ---- for (patwd = patp, grwd = grp; patwd != NULL && grwd != NULL; ! patwd = patdot, grwd = grdot) { ! register boolean match = NO; ! register int incr = 20; /* null-terminate words */ *************** *** 151,160 **** /* * Match one word of pattern with one word of group. ! * A pattern word of "all" matches any group word. */ #ifdef FAST_STRCMP ! match = STREQ(patwd, grwd) || STREQ(patwd, ALL); #else - match = NO; for (rpatwd = patwd; *rpatwd == *grwd++; ) if (*rpatwd++ == '\0') { --- 154,167 ---- /* * Match one word of pattern with one word of group. ! * A pattern word of "all" matches any group word, ! * but isn't worth as much. */ #ifdef FAST_STRCMP ! match = STREQ(patwd, grwd); ! if (!match && STREQ(patwd, ALL)) { ! match = YES; ! --incr; ! } #else for (rpatwd = patwd; *rpatwd == *grwd++; ) if (*rpatwd++ == '\0') { *************** *** 165,170 **** /* ugly special case match for "all" */ rpatwd = patwd; ! match = *rpatwd++ == 'a' && *rpatwd++ == 'l' && ! *rpatwd++ == 'l' && *rpatwd == '\0'; } #endif /* FAST_STRCMP */ --- 172,180 ---- /* ugly special case match for "all" */ rpatwd = patwd; ! if (*rpatwd++ == 'a' && *rpatwd++ == 'l' && ! *rpatwd++ == 'l' && *rpatwd == '\0') { ! match = YES; ! --incr; ! } } #endif /* FAST_STRCMP */ *************** *** 178,181 **** --- 188,192 ---- break; } + depth += incr; } /* if group name ran out before pattern, then match fails */ *** cnpatch/old/libcnews/strsave.c Tue Jun 20 18:59:17 1989 --- libcnews/strsave.c Mon Mar 5 13:41:56 1990 *************** *** 17,21 **** register char *s; { ! register char *news =nemalloc((unsigned)strlen(s)+1); /* include NUL */ (void) strcpy(news, s); --- 17,21 ---- register char *s; { ! register char *news = nemalloc((unsigned)strlen(s) + SIZENUL); (void) strcpy(news, s); *** cnpatch/old/libcnews/time.c Tue Jun 20 18:59:07 1989 --- libcnews/time.c Mon Mar 5 13:42:00 1990 *************** *** 19,23 **** { struct timeb ftnow; ! char ms[4]; /* room for "123" and a NUL */ ftime(&ftnow); --- 19,23 ---- { struct timeb ftnow; ! char ms[STRLEN("123") + SIZENUL]; ftime(&ftnow); *** cnpatch/old/libfake/Makefile Wed Jan 10 19:10:37 1990 --- libfake/Makefile Fri Mar 9 14:13:14 1990 *************** *** 5,9 **** SHELL = /bin/sh ! ALL = dbm.o fsync.o getopt.o ldiv.o memchr.o memcmp.o memcpy.o \ memset.o mkdir.o putenv.o strchr.o strcspn.o strpbrk.o strrchr.o \ strspn.o strtok.o symlink.o dbmclose.o --- 5,9 ---- SHELL = /bin/sh ! ALL = dbm.o fsync.o getopt.o memchr.o memcmp.o memcpy.o \ memset.o mkdir.o putenv.o strchr.o strcspn.o strpbrk.o strrchr.o \ strspn.o strtok.o symlink.o dbmclose.o *************** *** 10,14 **** # beware -- build knows about NEEDED ! NEEDED = ldiv.o u: $(NEEDED) --- 10,14 ---- # beware -- build knows about NEEDED ! NEEDED = u: $(NEEDED) *************** *** 18,23 **** try: $(ALL) - - # ldiv.o: $(INCLUDE)/stdlib.h # trouble if stdlib.h isn't ours clean: --- 18,21 ---- *** cnpatch/old/libfake/README Tue Jun 20 18:59:22 1989 --- libfake/README Sat Feb 10 19:40:25 1990 *************** *** 8,14 **** Fsync and symlink are C-News-specific fakes. - Ldiv.c is inefficient but provides the full ANSI C functionality. (Do not - confuse it with the prehistoric ldiv function found in some very old Unixes.) - The mem* and str* and *index functions come from Henry Spencer's public-domain string-functions implementation. Said implementation is somewhat in need of --- 8,11 ---- *** cnpatch/old/libstdio/LEGAL.STDIO Tue Jun 20 18:59:38 1989 --- libstdio/LEGAL.STDIO Mon Mar 5 13:42:00 1990 *************** *** 1,3 **** ! Page 165 of The C Programming Language describes some of the workings ! of the UNIX stdio implementation. In particular, it describes the ! function of _ptr and _cnt. --- 1,7 ---- ! Page 165 of The C Programming Language, 1st ed. describes some of the ! workings of the UNIX stdio implementation. In particular, it describes ! the function of _ptr and _cnt. ! ! Section 8 of The C Programming Language, 2nd ed. provides more detail. ! In particular, page 176 publishes a stdio.h, likely derived from some ! UNIX version. *** cnpatch/old/man/expire.8 Tue Jan 16 17:58:29 1990 --- man/expire.8 Thu Mar 8 18:30:54 1990 *************** *** 7,11 **** .\" =()<.ds m @@>()= .ds m usenet ! .TH EXPIRE 8 "12 Jan 1990" "C News" .SH NAME expire, doexpire \- expire old news --- 7,12 ---- .\" =()<.ds m @@>()= .ds m usenet ! .TH EXPIRE 8 "12 Jan 1990" ! .BY "C News" .SH NAME expire, doexpire \- expire old news *** cnpatch/old/man/inews.1 Thu Sep 14 16:03:41 1989 --- man/inews.1 Thu Mar 8 18:31:05 1990 *************** *** 7,11 **** .\" =()<.ds m @@>()= .ds m usenet ! .TH INEWS 1 "29 Aug 1989" "C News" .SH NAME inews \- `user-friendly' news-posting front-end for relaynews --- 7,12 ---- .\" =()<.ds m @@>()= .ds m usenet ! .TH INEWS 1 "29 Aug 1989" ! .BY "C News" .SH NAME inews \- `user-friendly' news-posting front-end for relaynews *** cnpatch/old/man/news.5 Tue Jun 20 18:59:58 1989 --- man/news.5 Sun Mar 11 01:54:56 1990 *************** *** 25,29 **** .LP .. ! .TH NEWS 5 "8 June 1989" "C News" .SH NAME news \- USENET network news articles, batches, related files --- 25,30 ---- .LP .. ! .TH NEWS 5 "9 March 1990" ! .BY "C News" .SH NAME news \- USENET network news articles, batches, related files *************** *** 110,114 **** Expires: Saturday, 1 Jan 83 00:00:00 EST Organization: Bell Labs, Murray Hill ! The body of the article comes here, after a blank line. .Ee --- 111,115 ---- Expires: Saturday, 1 Jan 83 00:00:00 EST Organization: Bell Labs, Murray Hill ! .sp 0.3 The body of the article comes here, after a blank line. .Ee *************** *** 193,204 **** headers to avoid sending an article back to a site that has seen it. - The special name - .B ME - stands for the name of the machine news is running on, - as determined by some operating-system dependent means - such as - .IR hostname (2) - or - .IR uname (2). The .IR exclusion s --- 194,197 ---- *************** *** 210,237 **** .IR exclusions . .PP ! The .I subscriptions ! is the list of newsgroups to be transmitted to the ! .IR system ! (or received if ! .I system ! is the current site); ! they are matched against the .B Newsgroups: header of each article ! and any matching articles are transmitted: .B all ! matches any single word, ! stopping at periods and commas; ! .B comp ! also implies ! .BR comp.all , ! recursively; ! .B !talk ! .I mismatches ! all the ! .B talk ! groups; ! order is unimportant; .B comp,comp.sys.sun,!comp.sys matches all the --- 203,291 ---- .IR exclusions . .PP ! The special ! .I system name ! .B ME ! stands for the name of the machine news is running on, ! as determined from ! .IR \*c/whoami . ! (The ! .B ME ! line, ! or a line whose ! .I system name ! is explicitly that of the machine news is running on, ! has a rather different meaning from that of the other ! .I sys ! file lines: ! its .I subscriptions ! subfield ! identifies ! the newsgroups that this site subscribes to (i.e. is willing to receive), ! and its other fields and subfields are ignored.) ! .PP ! .I subscriptions ! is a comma-separated list of ! .I "newsgroup patterns" ! specifying the newsgroups ! to be transmitted to the ! .IR system ; ! each newsgroup from the .B Newsgroups: header of each article ! is matched against the pattern list, ! and if any newsgroup matches the pattern list, ! the article is transmitted. ! The rules for matching a newsgroup against a single pattern are: ! .IP \(bu "\w'\(bu 'u" ! .IR word s ! in a newsgroup or a pattern ! are delimited by periods; ! .IP \(bu ! words of a pattern and a newsgroup ! match only if they are identical, ! except that ! the word .B all ! in a pattern ! matches any newsgroup word; ! .IP \(bu ! a newsgroup is matched against a pattern word by word, and all words ! must match for the newsgroup to match that pattern; ! .IP \(bu ! if the pattern has fewer words than the newsgroup, the pattern is implicitly ! extended to the same number of words by appending ! .B \&.all ! as many times as necessary; ! .IP \(bu ! if the newsgroup has fewer words than the pattern, the newsgroup does not ! match the pattern; ! .IP \(bu ! if ! .I pattern ! matches a newsgroup, ! .BI ! pattern ! .IR mis matches ! that newsgroup. ! .LP ! A newsgroup matches a pattern list if, and only if, it matches at least ! one of the patterns and: ! .IP \(bu "\w'\(bu 'u" ! the newsgroup ! does not mismatch any of the patterns, or ! .IP \(bu ! the longest matched pattern is longer than the longest mismatched ! pattern ! (length is measured in number of words, ! with each explicit occurrence of ! .B all ! counted as slightly less than one word, ! and does not include ! the implicit extension of patterns with ! .BR \&.all ). ! .LP ! Note that order in the lists is not significant, ! and that ties are broken in favor of not matching. ! An example: .B comp,comp.sys.sun,!comp.sys matches all the *************** *** 244,263 **** .I "but including" .BR comp.sys.sun . The ! .I distributions ! are matched similarly with the .B Distribution: ! header, ! but only when sending articles; ! .I distributions ! do not affect receipt of articles. If no .I distributions are supplied, the .I subscriptions - will be matched against - .B Distribution: instead. .PP The --- 298,320 ---- .I "but including" .BR comp.sys.sun . + .PP The ! distributions in the .B Distribution: ! header ! are similarly matched against the ! .IR distributions . If no .I distributions are supplied, + .B Distribution: + will be matched against the .I subscriptions instead. + (The + .B Distribution: + header is ignored when receiving news; + it is only significant when sending.) .PP The *************** *** 300,306 **** to be transmitted as the standard input. The default is ! .RI "`uux \- \-z \-r " sysname !rnews' for a command; ! the PATH searched includes \*b/relay, so that the commands described in \fInewsmail\fR(8) are available as alternatives to \fIuux\fR. --- 357,366 ---- to be transmitted as the standard input. The default is ! `\c ! .BI "uux \- \-z \-r " sysname !rnews\c ! \&' for a command; ! the PATH searched includes ! .BR \*b/relay , so that the commands described in \fInewsmail\fR(8) are available as alternatives to \fIuux\fR. *************** *** 308,315 **** this field to be taken as a filename, the default is ! .RI \*a/out.going/ sysname /togo; if a filename is given but it does not start with `/', it is assumed to be relative to the ! \*a/out.going directory. .LP --- 368,376 ---- this field to be taken as a filename, the default is ! .BI \*a/out.going/ sysname /togo\c ! ; if a filename is given but it does not start with `/', it is assumed to be relative to the ! .B \*a/out.going directory. .LP *************** *** 318,334 **** # line indicating what we are willing to receive; note local groups on end ME:comp,news,sci,rec,misc,soc,talk,to,can,ont,tor,ut ! # sample insignificant feed not using batching huey:news.config,to.huey/all::uux - -r -gd huey!rnews ! # sample major batched feed, including (unnecessary) explicit file name dewey:comp,news,sci,rec,misc,soc,talk,to.dewey,can,ont,tor,ut/all:f:dewey/togo ! # sample long-haul feed; note no local groups donald:comp,news,sci,rec,misc,soc,talk,to.donald/all:f: ! # sample local-postings-only feed direct to major site (gets them out fast) scrooge:comp,news,sci,rec,misc,soc,talk,to.scrooge/all:Lf: ! # sample ihave/sendme link # Send ihave telling louie what we have -- batcher turns the batch into a --- 379,395 ---- # line indicating what we are willing to receive; note local groups on end ME:comp,news,sci,rec,misc,soc,talk,to,can,ont,tor,ut ! .sp 0.3 # sample insignificant feed not using batching huey:news.config,to.huey/all::uux - -r -gd huey!rnews ! .sp 0.3 # sample major batched feed, including (unnecessary) explicit file name dewey:comp,news,sci,rec,misc,soc,talk,to.dewey,can,ont,tor,ut/all:f:dewey/togo ! .sp 0.3 # sample long-haul feed; note no local groups donald:comp,news,sci,rec,misc,soc,talk,to.donald/all:f: ! .sp 0.3 # sample local-postings-only feed direct to major site (gets them out fast) scrooge:comp,news,sci,rec,misc,soc,talk,to.scrooge/all:Lf: ! .sp 0.3 # sample ihave/sendme link # Send ihave telling louie what we have -- batcher turns the batch into a *** cnpatch/old/man/newsaux.8 Tue Jan 16 17:58:30 1990 --- man/newsaux.8 Thu Mar 8 18:31:33 1990 *************** *** 7,11 **** .\" =()<.ds m @@>()= .ds m usenet ! .TH NEWSAUX 8 "13 Jan 1990" "C News" .SH NAME spacefor \- check available space for news --- 7,12 ---- .\" =()<.ds m @@>()= .ds m usenet ! .TH NEWSAUX 8 "13 Jan 1990" ! .BY "C News" .SH NAME spacefor \- check available space for news *** cnpatch/old/man/newsbatch.8 Tue Jan 16 17:58:31 1990 --- man/newsbatch.8 Thu Mar 8 18:31:45 1990 *************** *** 7,11 **** .\" =()<.ds m @@>()= .ds m usenet ! .TH NEWSBATCH 8 "13 Jan 1990" "C News" .SH NAME sendbatches, batchsplit \- news batching to other sites --- 7,12 ---- .\" =()<.ds m @@>()= .ds m usenet ! .TH NEWSBATCH 8 "13 Jan 1990" ! .BY "C News" .SH NAME sendbatches, batchsplit \- news batching to other sites *** cnpatch/old/man/newsmail.8 Fri Jun 23 14:45:48 1989 --- man/newsmail.8 Thu Mar 8 18:31:55 1990 *************** *** 7,11 **** .\" =()<.ds m @@>()= .ds m usenet ! .TH NEWSMAIL 8 "22 June 1989" "C News" .SH NAME mailnews, sendnews \- send unbatched news as mail --- 7,12 ---- .\" =()<.ds m @@>()= .ds m usenet ! .TH NEWSMAIL 8 "22 June 1989" ! .BY "C News" .SH NAME mailnews, sendnews \- send unbatched news as mail *** cnpatch/old/man/newsmaint.8 Tue Jan 16 17:58:24 1990 --- man/newsmaint.8 Thu Mar 8 18:32:05 1990 *************** *** 7,11 **** .\" =()<.ds m @@>()= .ds m usenet ! .TH NEWSMAINT 8 "16 Jan 1990" "C News" .SH NAME newshist \- extract history line for news article(s) --- 7,12 ---- .\" =()<.ds m @@>()= .ds m usenet ! .TH NEWSMAINT 8 "16 Jan 1990" ! .BY "C News" .SH NAME newshist \- extract history line for news article(s) *** cnpatch/old/man/postnews.1 Tue Jun 20 18:59:54 1989 --- man/postnews.1 Thu Mar 8 18:32:15 1990 *************** *** 1,5 **** .\" =()<.ds c @@>()= .ds c /usr/lib/news ! .TH POSTNEWS 1 "9 June 1989" "C News" .SH NAME postnews \- simple interactive news-posting interface --- 1,6 ---- .\" =()<.ds c @@>()= .ds c /usr/lib/news ! .TH POSTNEWS 1 "9 June 1989" ! .BY "C News" .SH NAME postnews \- simple interactive news-posting interface *** cnpatch/old/man/relaynews.8 Wed Jan 10 19:10:46 1990 --- man/relaynews.8 Mon Mar 12 13:35:23 1990 *************** *** 7,11 **** .\" =()<.ds m @@>()= .ds m usenet ! .TH RELAYNEWS 8 "2 January 1990" "C News" .SH NAME relaynews \- store and forward netnews articles --- 7,12 ---- .\" =()<.ds m @@>()= .ds m usenet ! .TH RELAYNEWS 8 "2 January 1990" ! .BY "C News" .SH NAME relaynews \- store and forward netnews articles *************** *** 231,234 **** --- 232,252 ---- .B news/include/news.h for the bit definitions. + .br + If + .I relaynews + cannot establish safe + standard file descriptors + and + standardise its environment + (notably PATH, + SHELL + and IFS), + probably due to failure of + .IR malloc (3), + it will exit with status of 1 + and without writing any complaints on standard error + (\c + .BR errlog ), + as a security precaution. .SH HISTORY Written by Geoff Collyer *** cnpatch/old/man/rnews.8 Mon Nov 13 17:39:47 1989 --- man/rnews.8 Thu Mar 8 18:32:37 1990 *************** *** 7,11 **** .\" =()<.ds m @@>()= .ds m usenet ! .TH RNEWS 8 "3 Nov 1989" "C News" .SH NAME rnews, cunbatch \- accept and spool news input --- 7,12 ---- .\" =()<.ds m @@>()= .ds m usenet ! .TH RNEWS 8 "3 Nov 1989" ! .BY "C News" .SH NAME rnews, cunbatch \- accept and spool news input *** cnpatch/old/misc/Makefile Wed Jan 10 19:10:47 1990 --- misc/Makefile Sat Feb 24 20:00:30 1990 *************** *** 12,16 **** MAINTBIN=newshist ! MAINT = $(MAINTBIN) newsdaily newswatch newsboot locknews addgroup delgroup adddirs UTILBIN = gngp newslock ctime getdate canonhdr UTILS = $(UTILBIN) sizeof newshostname --- 12,16 ---- MAINTBIN=newshist ! MAINT = $(MAINTBIN) newsdaily newswatch newsboot locknews addgroup delgroup adddirs addfeed UTILBIN = gngp newslock ctime getdate canonhdr UTILS = $(UTILBIN) sizeof newshostname *** cnpatch/old/misc/canonhdr.c Thu Sep 14 16:03:25 1989 --- misc/canonhdr.c Mon Mar 5 13:42:01 1990 *************** *** 82,87 **** if (isascii(*cp) && isupper(*cp)) *cp = tolower(*cp); ! if (STREQN(hdr, canonmsgid, sizeof canonmsgid - 1)) ! (void) strncpy(hdr, magicmsgid, sizeof magicmsgid - 1); (void) fputs(hdr, stdout); /* must not free hdr; gethdr will do so automatically */ --- 82,87 ---- if (isascii(*cp) && isupper(*cp)) *cp = tolower(*cp); ! if (STREQN(hdr, canonmsgid, STRLEN(canonmsgid))) ! (void) strncpy(hdr, magicmsgid, STRLEN(magicmsgid)); (void) fputs(hdr, stdout); /* must not free hdr; gethdr will do so automatically */ *** cnpatch/old/notebook/problems Tue Jan 16 17:58:35 1990 --- notebook/problems Fri Mar 9 14:11:03 1990 *************** *** 1,3 **** ! .DA "13 Jan 1990" .TL Known Porting Problems With C News --- 1,3 ---- ! .DA "8 March 1990" .TL Known Porting Problems With C News *************** *** 113,117 **** to be problems with this macro. Some compilers, ! notably the one in Microport System V Release 2.3, reject it. We have heard a report that System V Release 2 on the VAX silently --- 113,117 ---- to be problems with this macro. Some compilers, ! notably the one in Microport System V for the 286, reject it. We have heard a report that System V Release 2 on the VAX silently *************** *** 197,200 **** --- 197,202 ---- process a single article, not a batch. This happens primarily when an article is posted locally, with \fIinews\fR.) + It is still barely possible that the plausibility check will fail on some + bizarre system. .SH df Output Format *************** *** 235,239 **** The only fix is to compile \fIdbz\fR without \fB\-O\fR. .SH ! HP Spectrum Optimizer vs. nnfree .PP We have a reliable report that --- 237,241 ---- The only fix is to compile \fIdbz\fR without \fB\-O\fR. .SH ! nnafree and nnfree .PP We have a reliable report that *************** *** 242,246 **** ``cc: Internal error 3279: Please contact your local HP representative'' message) ! on the \fInnfree\fR macro in \fIh/news.h\fR. The following revised version of the macro reportedly avoids --- 244,250 ---- ``cc: Internal error 3279: Please contact your local HP representative'' message) ! on the \fInnafree\fR macro ! (and \fInnfree\fR, a historical synonym) ! in \fIh/news.h\fR. The following revised version of the macro reportedly avoids *************** *** 250,253 **** --- 254,267 ---- *(mempp) = 0; }} while (0) .DE + .PP + It is also reliably reported that the Microport compiler objects to + these macros in large model. + Whether the above fix would suffice is not known. + Manual expansion [barf!] is known to work, although it would be less + painful to define a function containing the right code and change the + macro to call the function. + Code for a suitable function can, in fact, be found + in \fIh/news.h\fR, + inside `#ifdef\ lint'. .SH ANSI C *************** *** 306,307 **** --- 320,376 ---- in two places, and the Makefile attempts a link before doing a copy), and substantially more in the regression tests. + .SH + 16-bit Machines + .PP + C News has been tested on 16-bit machines\(emindeed, a good bit of the + early development work was done on one\(emand does run on them. + Nothing relies on ints being 32 bits. + Nothing relies on pointers and ints being the same size, as far as we know. + Nothing relies on large address spaces, + although one or two modules come in separate small-space and large-space + versions, and the small-space versions are slower. + .PP + However, there are some fundamental limits + to consider. + Both \fIrelaynews\fR and \fIexpire\fR\(emthe usual trouble spots for + space shortages\(emwant to keep lots of stuff in core. + There isn't any easy way around this one. + .SH + Number of File Descriptors + .PP + There is a constant, NOPENBFS, in \fIrelay/trbatch.c\fR, that defines + how many batch files are kept open simultaneously. + If you are feeding much news to more systems than this, + \fIrelaynews\fR performance will suffer. + .PP + The major limit on NOPENBFS is available file descriptors + (although on a 16-bit machine there might also be a shortage of memory + for \fIstdio\fR buffers). + Other parts of \fIrelaynews\fR want perhaps 10 file descriptors for + other purposes, so with the usual total supply of 20, a NOPENBFS value + of 10 is the right default. + If you feed many people, + and your kernel provides a process with more than 20 file + descriptors, + you probably want to boost + NOPENBFS (this can be done with -DNOPENBFS=xxx in the makefile). + Remember to leave about 10 descriptors worth of headroom. + .SH + Shell Processing Order + .PP + Normally, shell + variable expansion should take place before scanning for syntax + elements such as ``0<&1''. + At least one reimplementation of the shell + (specifically, Bash 1.04) does things in the + wrong order. + This is known to affect, at least, \fIrelay/sh/anne.jones\fR, + which can be fixed by changing (circa line 44) + .DS + "") USER="`who am i <&$fd | + .DE + to + .DS + "") USER="`eval \e"who am i <&$fd\e" | + .DE + or so we are told. *** cnpatch/old/relay/active.c Thu Aug 24 16:39:58 1989 --- relay/active.c Mon Mar 5 18:44:49 1990 *************** *** 142,145 **** --- 142,146 ---- if (actfp != NULL) { + nnfree(&lnc.lnc_ng); lnc.lnc_ng = lnc.lnc_line = NULL; status |= actfsync(actfp); *** cnpatch/old/relay/caches.c Tue Jun 20 19:01:00 1989 --- relay/caches.c Mon Mar 5 18:44:53 1990 *************** *** 8,22 **** #include "active.h" #include "caches.h" #include "transmit.h" statust - loadcaches() /* reload in-core caches from disk */ - { - return actload(); - } - - statust synccaches() /* force in-core caches to disk */ { ! return actsync() | trclose(); } --- 8,17 ---- #include "active.h" #include "caches.h" + #include "history.h" #include "transmit.h" statust synccaches() /* force in-core caches to disk */ { ! return actsync() | trclose() | closehist(); } *** cnpatch/old/relay/control.c Tue Jan 16 17:58:39 1990 --- relay/control.c Mon Mar 5 18:44:55 1990 *************** *** 107,111 **** if (deadpid == -1 || pid == -1 || wstatus != 0) art->a_status |= ST_DROPPED; /* admin got err.msg. by mail */ ! art->a_status |= loadcaches(); } --- 107,111 ---- if (deadpid == -1 || pid == -1 || wstatus != 0) art->a_status |= ST_DROPPED; /* admin got err.msg. by mail */ ! /* let lazy evaluation load the caches */ } *** cnpatch/old/relay/fileart.c Tue Jan 16 17:58:40 1990 --- relay/fileart.c Mon Mar 5 18:51:18 1990 *************** *** 341,345 **** * Moral: don't run Eunice on your PDP-11. */ ! worked = symlink(art->a_tmpf, artname) == 0; } if (debug) --- 341,345 ---- * Moral: don't run Eunice on your PDP-11. */ ! worked = symlink(fullartfile(art->a_tmpf), artname) == 0; } if (debug) *** cnpatch/old/relay/hdrdefs.c Wed Jan 10 19:10:55 1990 --- relay/hdrdefs.c Thu Feb 8 15:01:45 1990 *************** *** 10,20 **** #include #include - #ifdef REALSTDC - #include - #endif /* REALSTDC */ #include "libc.h" #include "news.h" #include "headers.h" ! #include "hdrint.h" /* may define "const" */ #ifndef offsetof --- 10,20 ---- #include #include #include "libc.h" #include "news.h" #include "headers.h" ! #include "hdrint.h" /* may define "const" or REALSTDC */ ! #ifdef REALSTDC ! #include /* may define offsetof */ ! #endif /* REALSTDC */ #ifndef offsetof *** cnpatch/old/relay/history.c Tue Jan 16 17:58:40 1990 --- relay/history.c Mon Mar 5 18:44:56 1990 *************** *** 323,324 **** --- 323,344 ---- (void) strcat(art->a_files, artnumstr); } + + statust + closehist() + { + register statust status = ST_OKAY; + + if (fp != NULL) { + /* dbmclose is only needed by dbz, to flush statistics to disk */ + if (dbmclose() < 0) { + warning("error closing dbm history file", ""); + status |= ST_DROPPED; + } + if (nfclose(fp) == EOF) { + warning("error closing history file", ""); + status |= ST_DROPPED; + } + fp = NULL; /* mark file closed */ + } + return status; + } *** cnpatch/old/relay/history.h Tue Jun 20 19:01:21 1989 --- relay/history.h Mon Mar 5 18:44:59 1990 *************** *** 2,6 **** extern char *findfiles(), *gethistory(); extern boolean alreadyseen(); ! extern statust fakehist(); extern void history(), histupdfiles(); --- 2,6 ---- extern char *findfiles(), *gethistory(); extern boolean alreadyseen(); ! extern statust fakehist(), closehist(); extern void history(), histupdfiles(); *** cnpatch/old/relay/trbatch.c Tue Jun 20 19:01:42 1989 --- relay/trbatch.c Mon Mar 5 18:51:15 1990 *************** *** 39,43 **** * ensure that (name, ord) are mapped to a batchfile. * ! * if an attempt to open the batchfile's stream fails, close a random * batchfile stream and retry the open. */ --- 39,43 ---- * ensure that (name, ord) are mapped to a batchfile. * ! * if an attempt to open the batchfile's stream fails, close an arbitrary * batchfile stream and retry the open. */ *************** *** 162,166 **** STATIC statust ! bfrclose() /* close a random batchfile */ { register struct batchfile *bf; --- 162,166 ---- STATIC statust ! bfrclose() /* close an arbitrary batchfile */ { register struct batchfile *bf; end of patch 12-Mar-1990 -- MSDOS, abbrev: Maybe SomeDay | Henry Spencer at U of Toronto Zoology an Operating System. | uunet!attcan!utzoo!henry henry@zoo.toronto.edu