From attcan!utzoo!henry@uunet.uu.net Tue Aug 22 23:35:45 1989 Received: from BBN.COM by pineapple.bbn.com id ; Tue, 22 Aug 89 23:35:24 -0400 Received: from uunet.uu.net by BBN.COM id aa03912; 22 Aug 89 23:36 EDT Received: from attcan.UUCP by uunet.uu.net (5.61/1.14) with UUCP id AA07897; Tue, 22 Aug 89 23:32:19 -0400 Date: Tue, 22 Aug 89 23:32:19 -0400 From: attcan!utzoo!henry@uunet.uu.net Message-Id: <8908230332.AA07897@uunet.uu.net> To: source-patches@uunet.uu.net Cc: utstat!geoff@uunet.uu.net Subject: C News patch of 22-Aug-1989 Content-Type: text Content-Length: 59094 Status: R This one is a lot of small stuff; some more major work is coming, but this one is already pushing 60KB (context diffs are so damned bulky...). Some "make cmp" stuff intended for our own testing, but possibly of use. A C version of upact. Some new fflushes in relaynews to make "status 16" failures report properly. A new option to expire to suppress the history rebuild. "inews -C" now produces an (informative) error message and exits. Lots of minor cleanup and improvement. start of patch 22-Aug-1989 this should be run with patch -p0 $@ + viauuxz: viauux + sed '$$s/-r/-r -z/' viauux >$@ + + viaemail: viamail + sed '$$s/rnews/enews/' viamail >$@ + test.1: echo 'a test' >$@ *************** *** 165,167 **** rm -rf out.going bin rm -f *.o test.* togo togo.* batchparms batcher batchsm ! rm -f batchlog batchlog.* c7encode bencode --- 175,177 ---- rm -rf out.going bin rm -f *.o test.* togo togo.* batchparms batcher batchsm ! rm -f batchlog batchlog.* c7encode bencode viauuxz viaemail *** cnpatch/tmp.file Tue Aug 22 14:05:51 1989 --- batch/batcher.c Sun Aug 20 00:42:51 1989 *************** *** 115,119 **** error("internal disaster, can't fstat", ""); if ((sbuf.st_mode&S_IFMT) != S_IFREG) { ! close(artfile); return; /* Don't try to batch directories etc. */ } --- 115,119 ---- error("internal disaster, can't fstat", ""); if ((sbuf.st_mode&S_IFMT) != S_IFREG) { ! (void) close(artfile); return; /* Don't try to batch directories etc. */ } *** cnpatch/tmp.file Tue Aug 22 14:05:58 1989 --- batch/sendbatches Wed Aug 16 15:54:35 1989 *************** *** 148,152 **** if test $? -eq 0 -a ! -s /tmp/nb$$ then ! rm $f /tmp/nb$$ else ( --- 148,152 ---- if test $? -eq 0 -a ! -s /tmp/nb$$ then ! rm -f $f /tmp/nb$$ else ( *** cnpatch/tmp.file Tue Aug 22 14:05:59 1989 --- batch/viainews Sun Aug 6 02:48:24 1989 *************** *** 2,4 **** --- 2,5 ---- # Feed batch to inews, for ihave/sendme mostly. + HOME=/dev/null ; export HOME # suppress signatures, .name, etc. exec inews -h -W -A *** cnpatch/tmp.file Tue Aug 22 14:06:01 1989 --- conf/Makefile Mon Aug 21 19:46:47 1989 *************** *** 15,18 **** --- 15,20 ---- libsmall libstdio libusg libv7 libv8 DIRS = batch conf expire h hfake input $(LIBDIRS) misc relay rna + CMPDIRS = batch conf expire input man misc relay rna + SHS = doit.root doit.bin doit.news again.root PGMS = spacefor queuelen *************** *** 27,30 **** --- 29,38 ---- : and build takes care of setnewsids if needed + pcmp: $(PGMS) + for f in $(PGMS) ; do cmp $(NEWSBIN)/$$f $$f ; done + + cmp: + : nothing + newsinstall: : build stuff does the real work *************** *** 82,86 **** rm -f substitutions history history.pag history.dir active localgroups rm -f log mailpaths sys cron rc setnewsids setnewsids.o spacefor.bsd ! rm -f replyusepath spacefor queuelen junk gclean: tidy --- 90,94 ---- rm -f substitutions history history.pag history.dir active localgroups rm -f log mailpaths sys cron rc setnewsids setnewsids.o spacefor.bsd ! rm -rf replyusepath spacefor queuelen junk save gclean: tidy *************** *** 92,96 **** spotless: gclean ! rm -f again.root doit.bin doit.news doit.root lclean: --- 100,104 ---- spotless: gclean ! rm -f $(SHS) lclean: *************** *** 97,98 **** --- 105,116 ---- rm -f ../ranlibed for d in $(LIBDIRS) ; do cd ../$$d ; make clean ; done + + cmps: + for d in $(CMPDIRS) ; do cd ../$$d ; make cmp RBIN=/usr/lib/uucp/bin ; done + + save: $(SHS) + mkdir save + mv $(SHS) save + + check: + -for f in $(SHS) ; do diff save/$$f $$f ; done *** cnpatch/tmp.file Tue Aug 22 14:06:03 1989 --- conf/build Mon Aug 21 19:08:35 1989 *************** *** 8,12 **** # directories in which to do makes # batch must precede input; relay must precede misc ! pgmdirs='conf batch expire input relay misc rna' # control files built in conf --- 8,13 ---- # directories in which to do makes # batch must precede input; relay must precede misc ! # the "doui" code below may add rna to the list ! pgmdirs='conf batch expire input relay misc' # control files built in conf *************** *** 727,731 **** echo ! echo 'The "inews", "postnews", "readnews", and "checknews" commands should' echo 'go in one of the directories searched for normal commands, so users' echo 'can run them without special arrangements. What directory should' --- 728,748 ---- echo ! echo 'Our "postnews", "readnews", and "checknews" are included mostly for' ! echo 'completeness. They are very simple and crude compared to the user' ! echo 'interface many users are accustomed to. As far as we know, B News' ! echo '(or other) versions should run fine with C News. If you are already' ! echo 'running such user-interface software, you may not want to change.' ! ./query 'Do you want to install our user-interface programs [yes]? ' ! read doui ! case "$doui" in ! ''|y*|Y*) doui=yes ; pgmdirs="$pgmdirs rna" ;; ! *) doui=no ;; ! esac ! ! echo ! case "$doui" in ! no) echo 'The "inews" command(s) should' ;; ! *) echo 'The "inews", "postnews", "readnews", and "checknews" commands should' ;; ! esac echo 'go in one of the directories searched for normal commands, so users' echo 'can run them without special arrangements. What directory should' *************** *** 748,763 **** esac ! echo ! echo 'Postnews can supply a default newsgroup, to assist naive users in' ! echo 'getting the group right for simple postings. What should the default' ! ./query 'newsgroup for postnews be [no default]? ' ! read postdefltgroup ! echo ! echo 'Postnews can supply a default distribution, to restrict news to a' ! echo 'local area unless the user specifically changes it. This is probably' ! echo 'a good idea. What should the default distribution for postnews' ! ./query 'be [world]? ' ! read postdefltdist echo --- 765,784 ---- esac ! case "$doui" in ! yes) ! echo ! echo 'Postnews can supply a default newsgroup, to aid naive users in' ! echo 'getting this right for simple postings. What should the default' ! ./query 'newsgroup for postnews be [no default]? ' ! read postdefltgroup ! echo ! echo 'Postnews can supply a default distribution, to limit news to a' ! echo 'local area unless the user specifically changes it. This is' ! echo 'probably wise. What should the default postnews distribution' ! ./query 'be [world]? ' ! read postdefltdist ! ;; ! esac echo *************** *** 771,775 **** case "$answer" in n*|N*|'') ;; ! *) echo 'You should substitute relay/ihave.not.c for relay/ihave.c' echo 'before running doit.bin, so that ihave/sendme is disabled' echo 'at your site.' --- 792,796 ---- case "$answer" in n*|N*|'') ;; ! *) echo 'You may want to substitute relay/ihave.not.c for relay/ihave.c' echo 'before running doit.bin, so that ihave/sendme is disabled' echo 'at your site.' *************** *** 859,866 **** echo 'case "$1" in' echo '-*s*) ;;' ! echo '*) make substs ;;' echo 'esac' else ! echo ": make substs not necessary, defaults used" fi echo ": done" --- 880,887 ---- echo 'case "$1" in' echo '-*s*) ;;' ! echo '*) make substs || exit 1 ;;' echo 'esac' else ! echo ": make substs || exit 1 not necessary, defaults used" fi echo ": done" *************** *** 867,873 **** echo ": making spacefor, queuelen, etc...." echo "rm -f spacefor queuelen hostname setnewsids" ! echo "make spacefor.$dftype" echo "cp spacefor.$dftype spacefor" ! echo "make queuelen.$uucptype" echo "cp queuelen.$uucptype queuelen" if test " $hostname" = " y" --- 888,894 ---- echo ": making spacefor, queuelen, etc...." echo "rm -f spacefor queuelen hostname setnewsids" ! echo "make spacefor.$dftype || exit 1" echo "cp spacefor.$dftype spacefor" ! echo "make queuelen.$uucptype || exit 1" echo "cp queuelen.$uucptype queuelen" if test " $hostname" = " y" *************** *** 901,905 **** if test " $ranlib" = " y" then ! echo "make ../ranlibed" fi echo ': library done' --- 922,926 ---- if test " $ranlib" = " y" then ! echo "make ../ranlibed || exit 1" fi echo ': library done' *************** *** 922,926 **** if test " $sete" != " y" then ! echo "make setnewsids NEWSUSER=$newsuid NEWSGROUP=$newsgid $cc $copts $postlibs" fi echo "for dir in $pgmdirs" --- 943,947 ---- if test " $sete" != " y" then ! echo "make setnewsids NEWSUSER=$newsuid NEWSGROUP=$newsgid $cc $copts $postlibs || exit 1" fi echo "for dir in $pgmdirs" *************** *** 927,931 **** echo "do" echo " cd ../\$dir" ! echo " make all $dbm $cc $copts $postlibs" echo "done" echo ": done" --- 948,952 ---- echo "do" echo " cd ../\$dir" ! echo " make all $dbm $cc $copts $postlibs || exit 1" echo "done" echo ": done" *************** *** 955,960 **** fi echo "echo '$whoami' >whoami" ! echo "echo 'general 00000 00000 y' >active" ! echo "echo 'news.announce.newusers 00000 00000 y' >>active" echo ">errlog" echo ">history" --- 976,981 ---- fi echo "echo '$whoami' >whoami" ! echo "echo 'general 0000000000 0000000001 y' >active" ! echo "echo 'news.announce.newusers 0000000000 0000000001 y' >>active" echo ">errlog" echo ">history" *************** *** 972,976 **** 40 * 1-31 * 0-6 su news -c '$newsbin/batch/sendbatches' 59 0 1-31 * 0-6 su news -c '$newsbin/expire/doexpire' ! 45 3 1-31 * 0-6 su news -c '$newsbin/expire/superkludge comp.mail.maps' 10 8 1-31 * 0-6 su news -c '$newsbin/maint/newsdaily' 00 5,13,21 1-31 * 0-6 su news -c '$newsbin/maint/newswatch' --- 993,997 ---- 40 * 1-31 * 0-6 su news -c '$newsbin/batch/sendbatches' 59 0 1-31 * 0-6 su news -c '$newsbin/expire/doexpire' ! 45 3 1-31 * 0-6 su news -c '$newsbin/expire/superkludge comp.mail.maps news.announce.newusers' 10 8 1-31 * 0-6 su news -c '$newsbin/maint/newsdaily' 00 5,13,21 1-31 * 0-6 su news -c '$newsbin/maint/newswatch' *************** *** 986,990 **** echo "do" echo " cd ../\$dir" ! echo " make bininstall BIN=$bin RBIN=$rbin $dbm" echo "done" echo ": done" --- 1007,1011 ---- echo "do" echo " cd ../\$dir" ! echo " make bininstall BIN=$bin RBIN=$rbin $dbm || exit 1" echo "done" echo ": done" *************** *** 991,997 **** echo ': installing manual pages' echo 'cd ../man' for chap in $chaps do ! for f in `ls ../man | egrep "\.$chap\$"` do echo "cp $f $manpages/man$chap/$f" --- 1012,1022 ---- echo ': installing manual pages' echo 'cd ../man' + case "$doui" in + yes) exclude='!!nothing!!' ;; + no) exclude='^postnews\.' ;; + esac for chap in $chaps do ! for f in `ls ../man | egrep -v "$exclude" | egrep "\.$chap\$"` do echo "cp $f $manpages/man$chap/$f" *************** *** 1018,1022 **** echo "do" echo " cd ../\$dir" ! echo " make newsinstall BIN=$bin RBIN=$rbin $dbm" echo "done" echo ": done" --- 1043,1047 ---- echo "do" echo " cd ../\$dir" ! echo " make newsinstall BIN=$bin RBIN=$rbin $dbm || exit 1" echo "done" echo ": done" *** cnpatch/tmp.file Tue Aug 22 14:06:07 1989 --- conf/config.proto Mon Aug 14 13:23:58 1989 *************** *** 3,6 **** --- 3,12 ---- # available everywhere immediately # + # This is not, repeat NOT, a master control file for all of C News. + # This is the shell equivalent of libcnews/config.c, a "subroutine + # library" that gives shell files access to the default settings and + # lets environment variables override the defaults. Changing the + # defaults here will *NOT* change them throughout C News. + # # =()@}>()= NEWSCTL=${NEWSCTL-/usr/lib/news} *** cnpatch/tmp.file Tue Aug 22 14:06:11 1989 --- conf/spacefor.proto Sun Aug 20 01:08:15 1989 *************** *** 37,41 **** incoming) arg="$NEWSARTS/in.coming" ; desire=5000 ;; articles) arg="$NEWSARTS" ; desire=5000 ;; ! control) arg="$NEWSCTL" ; desire=3000 ;; outbound) arg="/usr/spool/uucp" ; desire=10000 ;; # ignore $3 archive) arg="$NEWSARTS" ; desire=1 ;; # system-specific --- 37,41 ---- incoming) arg="$NEWSARTS/in.coming" ; desire=5000 ;; articles) arg="$NEWSARTS" ; desire=5000 ;; ! control) arg="$NEWSCTL" ; desire=3000 ;; # for expire, mostly outbound) arg="/usr/spool/uucp" ; desire=10000 ;; # ignore $3 archive) arg="$NEWSARTS" ; desire=1 ;; # system-specific *** cnpatch/tmp.file Tue Aug 22 14:06:12 1989 --- conf/subst.gc Mon Aug 21 18:43:45 1989 *************** *** 16,18 **** relay/sh/inews rna/makefile ! relay/sh/postnews --- 16,18 ---- relay/sh/inews rna/makefile ! rna/postnews *** cnpatch/tmp.file Tue Aug 22 14:06:29 1989 --- doc/interface Sat Aug 19 23:26:32 1989 *************** *** 1,3 **** ! .DA "4 July 1989" .TL The Interface Between C News And The Outside World --- 1,3 ---- ! .DA "19 Aug 1989" .TL The Interface Between C News And The Outside World *************** *** 130,137 **** That is, with news's standard PATH, if .DS ! echo hi there Joe | mail joe .DE ! does not result in the message ``hi there Joe'' arriving in the mailbox ``joe'', you're going to have to fake it. See \fIDirectory Layout\fR for insight on where to put a fake \fImail\fR so that C News components will use it rather than \fI/bin/mail\fR. --- 130,140 ---- That is, with news's standard PATH, if .DS ! echo "relaynews: hi there Joe" | mail joe .DE ! does not result in the message ``relaynews: hi there Joe'' ! arriving in the mailbox ``joe'', you're going to have to fake it. + (Note that some BSD mailers run into trouble with the colon in the example, + interpreting such a line as a header.) See \fIDirectory Layout\fR for insight on where to put a fake \fImail\fR so that C News components will use it rather than \fI/bin/mail\fR. *** cnpatch/tmp.file Tue Aug 22 14:06:33 1989 --- expire/Makefile Mon Aug 21 14:50:57 1989 *************** *** 10,15 **** superkludge upact doexpire mkadir DTR = README Makefile dircheck doexpire expire.c histdups histinfo.c \ ! histslash.c lowest.c mkdbm.c mkhistory pgood superkludge tgood upact \ ! mkadir # =()@>()= NEWSARTS = /usr/spool/news --- 10,16 ---- superkludge upact doexpire mkadir DTR = README Makefile dircheck doexpire expire.c histdups histinfo.c \ ! histslash.c mkdbm.c mkhistory pgood superkludge tgood upact \ ! mkadir updatemin.c ! UPACT=upact # =()@>()= NEWSARTS = /usr/spool/news *************** *** 21,37 **** SHELL = /bin/sh ! all: $(THEM) chmod +x $(THEM) ! bininstall: $(THEM) explist.proto -if test ! -d $(NEWSBIN)/expire ; then mkdir $(NEWSBIN)/expire; fi cp $(THEM) $(NEWSBIN)/expire newsinstall: explist.proto -if test ! -r $(NEWSCTL)/explist ; then cp explist.proto $(NEWSCTL)/explist ; fi - cmp: $(THEM) - -for f in $(THEM) ; do cmp $$f $(NEWSBIN)/expire/$$f ; done - expire: expire.o $(LIBS) $(CC) $(LDFLAGS) expire.o $(PRE) $(LIBS) $(DBM) $(POST) -o $@ --- 22,38 ---- SHELL = /bin/sh ! all: $(THEM) explist.proto chmod +x $(THEM) ! bininstall: $(THEM) -if test ! -d $(NEWSBIN)/expire ; then mkdir $(NEWSBIN)/expire; fi cp $(THEM) $(NEWSBIN)/expire + cmp: $(THEM) + for f in $(THEM) ; do cmp $(NEWSBIN)/expire/$$f $$f ; done + newsinstall: explist.proto -if test ! -r $(NEWSCTL)/explist ; then cp explist.proto $(NEWSCTL)/explist ; fi expire: expire.o $(LIBS) $(CC) $(LDFLAGS) expire.o $(PRE) $(LIBS) $(DBM) $(POST) -o $@ *************** *** 40,45 **** $(CC) $(LDFLAGS) histinfo.o $(PRE) $(LIBS) $(POST) -o $@ ! lowest: lowest.o $(LIBS) ! $(CC) $(LDFLAGS) lowest.o $(PRE) $(LIBS) $(POST) -o $@ histslash: histslash.o $(LIBS) --- 41,46 ---- $(CC) $(LDFLAGS) histinfo.o $(PRE) $(LIBS) $(POST) -o $@ ! updatemin: updatemin.o $(LIBS) ! $(CC) $(LDFLAGS) updatemin.o $(PRE) $(LIBS) $(POST) -o $@ histslash: histslash.o $(LIBS) *************** *** 98,102 **** echo 'foo 00099 00001 y' >>active.after echo 'bar 00099 00000 m' >>active ! echo 'bar 00099 00099 m' >>active.after echo 'bar.ugh 00099 00000 m' >>active echo 'bar.ugh 00099 00099 m' >>active.after --- 99,103 ---- echo 'foo 00099 00001 y' >>active.after echo 'bar 00099 00000 m' >>active ! echo 'bar 00099 00100 m' >>active.after echo 'bar.ugh 00099 00000 m' >>active echo 'bar.ugh 00099 00099 m' >>active.after *************** *** 108,112 **** echo 'mod.unmod 00016 00016 y' >>active.after echo 'bletch 00099 00000 y' >>active ! echo 'bletch 00099 00099 y' >>active.after echo ' 9999~- foo/1' >>history.proto echo :foo/1: >arts/foo/1 --- 109,113 ---- echo 'mod.unmod 00016 00016 y' >>active.after echo 'bletch 00099 00000 y' >>active ! echo 'bletch 00099 00100 y' >>active.after echo ' 9999~- foo/1' >>history.proto echo :foo/1: >arts/foo/1 *************** *** 187,191 **** # the regression test proper ! r: $(THEM) dircheck setup tgood pgood chmod +x dircheck $(THEM) $(RUN) -c explist --- 188,192 ---- # the regression test proper ! r: $(THEM) $(UPACT) dircheck setup tgood pgood chmod +x dircheck $(THEM) $(RUN) -c explist *************** *** 213,217 **** cmp history history.after : "that's it for expire, on to upact" ! $(D) ./upact cmp active active.after : "and for upact, on to mkhistory" --- 214,218 ---- cmp history history.after : "that's it for expire, on to upact" ! $(D) ./$(UPACT) cmp active active.after : "and for upact, on to mkhistory" *************** *** 230,233 **** --- 231,254 ---- : "success!" + # variant regression test for -r + rr: $(THEM) $(UPACT) dircheck setup tgood pgood + chmod +x dircheck $(THEM) + $(RUN) -p -r explist >test.out 2>test.stderr + test ! -s test.stderr ; + cmp test.out pgood + cmp history.proto history + egrep wont history.proto | ./dircheck arts + egrep 'will|two|gone|three' history.proto | ./dircheck -n arts + egrep will history.proto | ./dircheck arch + egrep 'wont|two|gone|three' history.proto | ./dircheck -n arch + egrep two history.proto | ./dircheck arch2 + 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 ; + tidy: rm -f junk history history.pag history.dir history.o active *************** *** 237,242 **** clean: tidy ! rm -f *.o expire histslash mkdbm histinfo lowest explist.proto ! rm -f dtr spotless: clean # don't run this unless you know what you're doing --- 258,263 ---- clean: tidy ! rm -f *.o expire histslash mkdbm histinfo explist.proto ! rm -f dtr updatemin spotless: clean # don't run this unless you know what you're doing *** cnpatch/tmp.file Tue Aug 22 14:06:35 1989 --- expire/README Sun Aug 20 01:24:03 1989 *************** *** 22,28 **** dircheck checks the results of expire regression testing. histdups, histinfo, histslash, and mkdbm are parts of mkhistory. ! lowest is an optimized version of part of upact -- it's faster, but it's also the only thing in C News that needs to know how to read directories, which is a portability hassle, so it's not the default. pgood and tgood are regression-test output-should-look-like-this files. mkadir is what expire invokes to create archiving subdirectories. --- 22,31 ---- dircheck checks the results of expire regression testing. histdups, histinfo, histslash, and mkdbm are parts of mkhistory. ! updatemin is a C version of upact -- it's vastly faster, but it's also the only thing in C News that needs to know how to read directories, which is a portability hassle, so it's not the default. + Compile it with -DBERKDIR if you have 4BSD directory functions + rather than standard (POSIX) ones. "make r UPACT=updatemin" + will include it in the regression test. pgood and tgood are regression-test output-should-look-like-this files. mkadir is what expire invokes to create archiving subdirectories. *** cnpatch/tmp.file Tue Aug 22 14:06:38 1989 --- expire/expire.c Sun Aug 20 03:21:09 1989 *************** *** 75,78 **** --- 75,79 ---- int leaders = 0; /* only first link ("leader") is hard link */ int verbose = 0; /* report statistics */ + int rebuild = 1; /* rebuild history files */ long nkept = 0; /* count of articles not expired */ *************** *** 165,169 **** ftime(&ftnow); ! while ((c = getopt(argc, argv, "pa:sF:cn:tlvd")) != EOF) switch (c) { case 'p': /* print info line for archived articles */ --- 166,170 ---- ftime(&ftnow); ! while ((c = getopt(argc, argv, "pa:sF:cn:tlvrd")) != EOF) switch (c) { case 'p': /* print info line for archived articles */ *************** *** 194,197 **** --- 195,201 ---- verbose = 1; break; + case 'r': /* suppress history-file rebuild */ + rebuild = 0; + break; case 'd': /* debug */ expdebug = 1; *************** *** 431,444 **** if (old < 0) fail("cannot open `%s'", "history"); ! (void) unlink("history.n"); ! (void) unlink("history.n.dir"); ! (void) unlink("history.n.pag"); ! if (spacetight) ! (void) unlink("history.o"); ! new = eufopen("history.n", "w"); ! (void) fclose(eufopen("history.n.dir", "w")); ! (void) fclose(eufopen("history.n.pag", "w")); ! if (dbminit("history.n") < 0) ! fail("dbminit(history.n) failed", ""); cd(artfile((char *)NULL)); --- 435,450 ---- if (old < 0) fail("cannot open `%s'", "history"); ! if (rebuild) { ! (void) unlink("history.n"); ! (void) unlink("history.n.dir"); ! (void) unlink("history.n.pag"); ! if (spacetight) ! (void) unlink("history.o"); ! new = eufopen("history.n", "w"); ! (void) fclose(eufopen("history.n.dir", "w")); ! (void) fclose(eufopen("history.n.pag", "w")); ! if (dbminit("history.n") < 0) ! fail("dbminit(history.n) failed", ""); ! } cd(artfile((char *)NULL)); *************** *** 445,449 **** while ((line = readline(old)) != NULL) { line = doline(line); ! if (line != NULL) { /* extract the message-id */ nameend = strchr(line, '\t'); --- 451,455 ---- while ((line = readline(old)) != NULL) { line = doline(line); ! if (line != NULL && rebuild) { /* extract the message-id */ nameend = strchr(line, '\t'); *************** *** 469,474 **** fputs(line, new); putc('\n', new); - free(line); } } /* side effect of readline() == NULL: newslock() */ --- 475,481 ---- fputs(line, new); putc('\n', new); } + if (line != NULL) + free(line); } /* side effect of readline() == NULL: newslock() */ *************** *** 475,504 **** (void) close(old); ! eufclose(new, "history.n"); if (testing) return; ! cd(ctlfile((char *)NULL)); ! (void) unlink("history.o"); ! if (link("history", "history.o") < 0) ! fail("can't move history", ""); ! if (unlink("history") < 0) ! fail("can't finish moving history", ""); ! if (link("history.n", "history") < 0) ! fail("disaster -- can't reinstate history!", ""); ! if (unlink("history.n") < 0) ! fail("disaster -- can't unlink history.n!", ""); ! if (unlink("history.dir") < 0) ! fail("disaster -- can't unlink history.dir!", ""); ! if (unlink("history.pag") < 0) ! fail("disaster -- can't unlink history.pag!", ""); ! if (link("history.n.dir", "history.dir") < 0) ! fail("disaster -- can't reinstate history.dir!", ""); ! if (link("history.n.pag", "history.pag") < 0) ! fail("disaster -- can't reinstate history.pag!", ""); ! if (unlink("history.n.dir") < 0) ! fail("disaster -- can't unlink history.n.dir!", ""); ! if (unlink("history.n.pag") < 0) ! fail("disaster -- can't unlink history.n.pag!", ""); } --- 482,514 ---- (void) close(old); ! if (rebuild) ! eufclose(new, "history.n"); if (testing) return; ! if (rebuild) { ! cd(ctlfile((char *)NULL)); ! (void) unlink("history.o"); ! if (link("history", "history.o") < 0) ! fail("can't move history", ""); ! if (unlink("history") < 0) ! fail("can't finish moving history", ""); ! if (link("history.n", "history") < 0) ! fail("disaster -- can't reinstate history!", ""); ! if (unlink("history.n") < 0) ! fail("disaster -- can't unlink history.n!", ""); ! if (unlink("history.dir") < 0) ! fail("disaster -- can't unlink history.dir!", ""); ! if (unlink("history.pag") < 0) ! fail("disaster -- can't unlink history.pag!", ""); ! if (link("history.n.dir", "history.dir") < 0) ! fail("disaster -- can't reinstate history.dir!", ""); ! if (link("history.n.pag", "history.pag") < 0) ! fail("disaster -- can't reinstate history.pag!", ""); ! if (unlink("history.n.dir") < 0) ! fail("disaster -- can't unlink history.n.dir!", ""); ! if (unlink("history.n.pag") < 0) ! fail("disaster -- can't unlink history.n.pag!", ""); ! } } *** cnpatch/tmp.file Tue Aug 22 14:06:42 1989 --- expire/histinfo.c Tue Aug 22 13:48:05 1989 *************** *** 67,71 **** char *inname; { ! char *nl, *files; char line[MAXLINE], msgid[MAXLINE], expiry[MAXLINE]; char datercv[30]; --- 67,71 ---- char *inname; { ! char *nl, *name; char line[MAXLINE], msgid[MAXLINE], expiry[MAXLINE]; char datercv[30]; *************** *** 74,77 **** --- 74,78 ---- static char expnm[] = "Expires: "; register char *p; + static char trash[] = ""; extern char *strrchr(); extern char *strchr(); *************** *** 80,84 **** /* set defaults */ (void) strcpy(expiry, "-"); ! (void) strcpy(msgid, ""); /* read until EOF or blank line (end of headers) */ --- 81,85 ---- /* set defaults */ (void) strcpy(expiry, "-"); ! (void) strcpy(msgid, trash); /* read until EOF or blank line (end of headers) */ *************** *** 93,100 **** /* generate the file name */ ! files = inname; ! if (strncmp(files, spdir, spdirlen) == 0 && ! files[spdirlen] == '/') ! files += spdirlen + 1; /* skip spool dir. & slash */ /* generate the date received */ --- 94,101 ---- /* generate the file name */ ! name = inname; ! if (strncmp(name, spdir, spdirlen) == 0 && ! name[spdirlen] == '/') ! name += spdirlen + 1; /* skip spool dir. & slash */ /* generate the date received */ *************** *** 106,109 **** --- 107,116 ---- *p = ' '; + /* deal with empty and trash articles */ + if (strcmp(msgid, trash) == 0) { + (void) sprintf(msgid, "<%s@trash>", name); + (void) sprintf(datercv, "0"); /* expire at once */ + } + /* whomp out the history line */ (void) fputs(msgid, stdout); *************** *** 113,117 **** (void) fputs(expiry, stdout); (void) putchar('\t'); ! (void) fputs(files, stdout); (void) putchar('\n'); (void) fflush(stdout); --- 120,124 ---- (void) fputs(expiry, stdout); (void) putchar('\t'); ! (void) fputs(name, stdout); (void) putchar('\n'); (void) fflush(stdout); *** cnpatch/tmp.file Tue Aug 22 14:06:46 1989 --- expire/mkdbm.c Sun Aug 20 00:45:54 1989 *************** *** 25,29 **** close(creat("hist.dir", 0666)); close(creat("hist.pag", 0666)); ! dbminit("hist"); for (;;) { --- 25,30 ---- close(creat("hist.dir", 0666)); close(creat("hist.pag", 0666)); ! if (dbminit("hist") < 0) ! error("unable to do dbminit(\"hist\")", ""); for (;;) { *** cnpatch/tmp.file Tue Aug 22 14:06:47 1989 --- expire/mkhistory Tue Aug 22 14:04:51 1989 *************** *** 27,35 **** cd $NEWSCTL ! if egrep '^ ' history.n >/dev/null then ! echo "$0: found in history.n -- aborting" >&2 ! echo "$0: (some article lacks a Message-ID)" >&2 ! exit 1 fi mkdbm ]*@trash> ' history.n >/dev/null then ! echo "$0: (warning) empty/trash articles found, will expire at once" >&2 ! echo "$0: (grep history file for '@trash' to see them)" >&2 fi mkdbm we're it fi --- 35,39 ---- server=`cat $NEWSCTL/server` else ! me=thishost # don't need actual name server="$me" # no server file --> we're it fi *************** *** 62,65 **** --- 62,66 ---- # Do it. + tmp=nruntmp.$$ rmlist= for f in $them *************** *** 68,89 **** if test -r stop then ! rm -f $rmlist exit 0 fi - # Check for empty. - if test ! -s $f - then - rm -f $f - continue # NOTE CONTINUE - fi - # Space check, if we're close. if test " $muchroom" != " y" then batchsize=`sizeof $f` if test " `spacefor $batchsize articles`" -le 0 then ! rm -f $rmlist exit 0 fi --- 69,85 ---- if test -r stop then ! rm -f $tmp $rmlist exit 0 fi # Space check, if we're close. if test " $muchroom" != " y" then + rm -f $tmp $rmlist # free up what we can + rmlist= batchsize=`sizeof $f` if test " `spacefor $batchsize articles`" -le 0 then ! # already removed $tmp $rmlist exit 0 fi *************** *** 93,109 **** # uncompressed batches and never use c7 encoding might # want to remove the c7decode attempt to speed things up. ! text=nruntmp.$$ if compress -d <$f >$text 2>/dev/null then ! rmlist="$rmlist $f $text" elif c7decode <$f 2>/dev/null | compress -d >$text 2>/dev/null then ! rmlist="$rmlist $f $text" else - rm -f $text text=$f - rmlist="$rmlist $f" fi # Do it. -r redirects stdout and stderr into logs. -n makes # history entries for refused articles; this is right for --- 89,110 ---- # uncompressed batches and never use c7 encoding might # want to remove the c7decode attempt to speed things up. ! text=$tmp if compress -d <$f >$text 2>/dev/null then ! : okay elif c7decode <$f 2>/dev/null | compress -d >$text 2>/dev/null then ! : okay else text=$f fi + rmlist="$rmlist $f" + # Check for empty. + if test ! -s $text + then + continue # NOTE CONTINUE + fi + # Do it. -r redirects stdout and stderr into logs. -n makes # history entries for refused articles; this is right for *************** *** 138,142 **** mv $f $bad # Not $text, save the ORIGINAL! fi ! echo "$server $consumer \`$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" | mail "$NEWSMASTER" fi *************** *** 143,147 **** done ! rm -f $rmlist done --- 144,148 ---- done ! rm -f $tmp $rmlist done *** cnpatch/tmp.file Tue Aug 22 14:07:08 1989 --- input/newsspool.c Sun Aug 20 00:43:48 1989 *************** *** 197,202 **** extern int errno; ! if (fclose(f) == EOF) ! error("fclose error on file `%s'", tmpname); p = fullartfile("in.coming/"); --- 197,202 ---- extern int errno; ! if (nfclose(f) == EOF) ! error("close error on file `%s'", tmpname); p = fullartfile("in.coming/"); *** cnpatch/tmp.file Tue Aug 22 14:07:49 1989 --- man/inews.1 Sun Aug 6 00:42:31 1989 *************** *** 7,11 **** .\" =()<.ds m @@>()= .ds m usenet ! .TH INEWS 1 "6 July 1989" "C News" .SH NAME inews \- `user-friendly' news-posting front-end for relaynews --- 7,11 ---- .\" =()<.ds m @@>()= .ds m usenet ! .TH INEWS 1 "6 Aug 1989" "C News" .SH NAME inews \- `user-friendly' news-posting front-end for relaynews *************** *** 177,185 **** and .B \-C ! generates ! .BI "Control: newgroup" " newsgroup" ! and ! .BI "Newsgroups:" " newsgroup" ! headers. .SH FILES .PD 0 --- 177,186 ---- and .B \-C ! tells you to use ! .I addgroup ! for local group creations ! and tells you what to feed to ! .B "inews -h" ! for global ones. .SH FILES .PD 0 *************** *** 213,217 **** .SH "SEE ALSO" .IR mail (1), ! .IR rnews (1) .SH DIAGNOSTICS .I inews --- 214,219 ---- .SH "SEE ALSO" .IR mail (1), ! .IR rnews (1), ! .IR newsaux (8) .SH DIAGNOSTICS .I inews *** cnpatch/tmp.file Tue Aug 22 14:07:51 1989 --- man/newsaux.8 Sat Aug 19 23:10:27 1989 *************** *** 7,11 **** .\" =()<.ds m @@>()= .ds m usenet ! .TH NEWSAUX 8 "4 July 1989" "C News" .SH NAME spacefor \- check available space for news --- 7,11 ---- .\" =()<.ds m @@>()= .ds m usenet ! .TH NEWSAUX 8 "19 Aug 1989" "C News" .SH NAME spacefor \- check available space for news *************** *** 34,37 **** --- 34,39 ---- .br addgroup, delgroup \- add and delete newsgroups, locally only + .br + adddirs \- make any missing directories for active newsgroups .SH SYNOPSIS .B \*b/spacefor *************** *** 79,82 **** --- 81,86 ---- .B \*b/maint/delgroup group + .br + .B \*b/maint/adddirs .SH DESCRIPTION These programs are minor utilities used by various parts of C News. *************** *** 180,183 **** --- 184,197 ---- The effect is purely local; no control message (to propagate the change to other machines) is sent. + .PP + .I Adddirs + sweeps through the \fIactive\fR file checking that directories exist for + all newsgroups. + (\fIRelaynews\fR + will create directories as needed, but some + user-interface software gets upset if a newsgroup exists but its directory + does not.) + This is mostly useful when adding groups in bulk, based on another site's + \fIactive\fR file. .SH FILES .ta 6c *************** *** 217,220 **** --- 231,238 ---- are unfortunately somewhat system-specific, since \fIdf\fR output and \fIuucp\fR file layout vary between different versions. + .PP + .I Queuelen + probably ought to count bytes rather than batches, but that would make + its system-dependency even worse. .PP The need for \fIsizeof\fR and \fInewslock\fR is a botch. *** cnpatch/tmp.file Tue Aug 22 14:07:52 1989 --- man/newsbatch.8 Sun Aug 20 03:24:09 1989 *************** *** 7,11 **** .\" =()<.ds m @@>()= .ds m usenet ! .TH NEWSBATCH 8 "17 July 1989" "C News" .SH NAME sendbatches, batchsplit \- news batching to other sites --- 7,11 ---- .\" =()<.ds m @@>()= .ds m usenet ! .TH NEWSBATCH 8 "19 Aug 1989" "C News" .SH NAME sendbatches, batchsplit \- news batching to other sites *************** *** 17,21 **** c7encode, bencode \- compressed-news-batch encoding .br ! viauux, viainews, viamail, viapmail \- news-batch transmission .SH SYNOPSIS .B \*b/batch/sendbatches --- 17,23 ---- c7encode, bencode \- compressed-news-batch encoding .br ! viauux, viauuxz, viainews \- news-batch transmission ! .br ! viamail, viaemail, viapmail \- news-batch transmission via mail .SH SYNOPSIS .B \*b/batch/sendbatches *************** *** 63,66 **** --- 65,71 ---- .B \&.../viauux site + .br + .B \&.../viauuxz + site .br .B \&.../viainews *************** *** 70,73 **** --- 75,81 ---- site .br + .B \&.../viaemail + site + .br .B \&.../viapmail site *************** *** 202,205 **** --- 210,216 ---- .IP viauux 9 normal transmission via UUCP + .IP viauuxz + like \fIviauux\fR except with \fB\-z\fR option given to \fIuux\fR + (for old UUCPs where don't-report-result-on-zero-status is not default) .IP viainews feed the batch back to \fIinews\fR, ignoring the \fIsite\fR argument *************** *** 207,210 **** --- 218,223 ---- .IP viamail mail the batch to \fIsite\fB!rnews\fR + .IP viaemail + mail the batch to \fIsite\fB!enews\fR .IP viapmail mail the batch to \fIsite\fB!rnews\fR, attempting to *************** *** 266,268 **** .PP \fIViapmail\fR is obsolescent; ! \fIviamail\fR with a batch encoded with \fIbencode\fR is vastly superior. --- 279,281 ---- .PP \fIViapmail\fR is obsolescent; ! \fIviaemail\fR with a batch encoded with \fIbencode\fR is vastly superior. *** cnpatch/tmp.file Tue Aug 22 14:07:56 1989 --- misc/Makefile Sat Aug 19 20:43:05 1989 *************** *** 12,16 **** MAINTBIN=newshist ! MAINT = $(MAINTBIN) newsdaily newswatch newsboot locknews addgroup delgroup UTILBIN = gngp newslock ctime getdate UTILS = $(UTILBIN) sizeof newshostname --- 12,16 ---- MAINTBIN=newshist ! MAINT = $(MAINTBIN) newsdaily newswatch newsboot locknews addgroup delgroup adddirs UTILBIN = gngp newslock ctime getdate UTILS = $(UTILBIN) sizeof newshostname *************** *** 26,29 **** --- 26,33 ---- cp $(MAINT) $(NEWSBIN)/maint cp $(UTILS) $(NEWSBIN) + + cmp: $(THEM) + for f in $(MAINT) ; do cmp $(NEWSBIN)/maint/$$f $$f ; done + for f in $(UTILS) ; do cmp $(NEWSBIN)/$$f $$f ; done newsinstall: *** cnpatch/tmp.file Tue Aug 22 14:08:00 1989 --- misc/addgroup Wed Aug 16 15:52:50 1989 *************** *** 48,52 **** done ! echo "$1 0000000000 0000000000 $2" >>$NEWSCTL/active mkpdir $NEWSARTS/`echo $1 | tr . /` --- 48,52 ---- done ! echo "$1 0000000000 0000000001 $2" >>$NEWSCTL/active mkpdir $NEWSARTS/`echo $1 | tr . /` *** cnpatch/tmp.file Tue Aug 22 14:08:04 1989 --- misc/newsdaily Sat Aug 19 20:34:19 1989 *************** *** 53,70 **** # look for input anomalies cd $NEWSARTS/in.coming ! them="`ls | egrep -v '^bad$'`" ! if test " $them" != " " then ! find $them -mtime +1 -print >$tmp # old non-bad files lying about ! if test -s $tmp ! then ! ( ! echo 'old input files:' ! cat $tmp ! echo ! ) >>$gripes ! fi fi ! find bad -type f -mtime -2 -print >$tmp # recent bad batches if test -s $tmp then --- 53,66 ---- # look for input anomalies cd $NEWSARTS/in.coming ! find . -type f -mtime +1 -print | sed 's;^\./;;' | egrep -v '^bad/' >$tmp ! if test -s $tmp # old non-bad files lying about then ! ( ! echo 'old input files:' ! cat $tmp ! echo ! ) >>$gripes fi ! find bad -type f -name '[0-9]*' -mtime -2 -print >$tmp # recent bad batches if test -s $tmp then *************** *** 75,83 **** ) >>$gripes fi ! find bad -type f -mtime +7 -exec rm -f '{}' ';' # look for output anomalies cd $NEWSARTS/out.going ! find * -type f -name 'togo*' -size +0 -mtime +1 -print >$tmp if test -s $tmp then --- 71,79 ---- ) >>$gripes fi ! find bad -type f -name '[0-9]*' -mtime +7 -exec rm -f '{}' ';' # look for output anomalies cd $NEWSARTS/out.going ! find . -type f -name 'togo*' -size +0 -mtime +1 -print >$tmp if test -s $tmp then *************** *** 84,88 **** ( echo 'batching possibly stalled for sites:' ! sed 's;/.*;;' $tmp | sort -u echo ) >>$gripes --- 80,97 ---- ( echo 'batching possibly stalled for sites:' ! sed 's;^\./\([^/]*\)/.*;\1;' $tmp | sort -u ! echo ! ) >>$gripes ! fi ! ! # look for unknown newsgroups on input (misses cross-posted articles) ! cd $NEWSCTL ! egrep '`' log.o | egrep junked | sed 's/.*`\(.*\)'"'"'.*/\1/' | sort | ! uniq -c | sort -nr | sed 5q >$tmp ! if test -s $tmp ! then ! ( ! echo 'leading five unknown newsgroups by number of articles:' ! cat $tmp echo ) >>$gripes *** cnpatch/tmp.file Tue Aug 22 14:08:19 1989 --- relay/README Mon Aug 21 18:45:01 1989 *************** *** 11,15 **** ctl control-message shell files altctl alternative, not recommended, versions of rmgroup and sendgroups ! sh shell files, including inews and postnews and their flunkies regress regression-test facilities for relaynews --- 11,15 ---- ctl control-message shell files altctl alternative, not recommended, versions of rmgroup and sendgroups ! sh shell files, including inews and its flunkies regress regression-test facilities for relaynews *** cnpatch/tmp.file Tue Aug 22 14:08:32 1989 --- relay/control.c Sat Aug 5 23:32:52 1989 *************** *** 186,189 **** --- 186,190 ---- (void) fprintf(stderr, "%s: control `%s' looks unsafe to execute\n", progname, ctlcmd); + (void) fflush(stderr); _exit(1); } *************** *** 193,196 **** --- 194,198 ---- if (cmd == NULL) { warning("can't allocate memory in runctlmsg", ""); + (void) fflush(stderr); _exit(1); } *************** *** 228,231 **** --- 230,234 ---- if (mailcmd == NULL) { warning("can't allocate memory in bombctlmsg", ""); + (void) fflush(stderr); _exit(1); } *************** *** 237,240 **** --- 240,244 ---- "%s: control message `%s' exited with status 0%o\n", progname, cmd, cmdstat); + (void) fflush(mailf); if (mailf != stderr) (void) pclose(mailf); *** cnpatch/tmp.file Tue Aug 22 14:08:35 1989 --- relay/ctl/newgroup Wed Aug 16 15:53:05 1989 *************** *** 47,51 **** *) 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 --- 47,51 ---- *) flag=y ;; esac ! echo "$1 0000000000 0000000001 $flag" >>$NEWSCTL/active (echo "$1 `getdate now` $SENDER" >>$NEWSCTL/active.times) # rn hook # make the directory since rn will bitch if it's missing *** cnpatch/tmp.file Tue Aug 22 14:08:44 1989 --- relay/makefile Mon Aug 21 17:31:00 1989 *************** *** 75,80 **** cp ctl/* $(NEWSBIN)/ctl cp aux/* $(NEWSBIN)/relay ! ln $(NEWSBIN)/inject/postnews $(BIN)/postnews || cp sh/postnews $(BIN) ln $(NEWSBIN)/inject/inews $(BIN)/inews || cp sh/inews $(BIN) TODO.grep: TODO --- 75,88 ---- cp ctl/* $(NEWSBIN)/ctl cp aux/* $(NEWSBIN)/relay ! rm -f $(BIN)/inews ln $(NEWSBIN)/inject/inews $(BIN)/inews || cp sh/inews $(BIN) + + cmp: relaynews + cmp $(NEWSBIN)/relay/relaynews relaynews + ls -lg $(NEWSBIN)/relay/relaynews | egrep -s '^-rwsrwsr-x 1 news news' + for f in `ls sh` ; do cmp $(NEWSBIN)/inject/$$f sh/$$f ; done + for f in `ls ctl` ; do cmp $(NEWSBIN)/ctl/$$f ctl/$$f ; done + for f in `ls aux` ; do cmp $(NEWSBIN)/relay/$$f aux/$$f ; done + cmp $(BIN)/inews sh/inews TODO.grep: TODO *** cnpatch/tmp.file Tue Aug 22 14:09:04 1989 --- relay/sh/defhdrs.awk Mon Aug 7 01:49:14 1989 *************** *** 25,28 **** --- 25,33 ---- sendername = "Sender:" + # nullify headers with empty contents + for (i in hdrval) + if (hdrval[i] ~ /^[^\t ]*:[\t ]*$/) + hdrval[i] = "" + # fill in missing headers if (hdrval[typoname] != "") { # spelling hack *************** *** 36,47 **** hdrval[msgidname] = hdrval[msgidname] " " fields[i] } if (hdrval[msgidname] == "") hdrval[msgidname] = msgidname " " defmsgid if (hdrval[orgname] == "") hdrval[orgname] = orgname " " deforg - - # replace users headers (if any) - hdrval[datename] = datename " " defdate - hdrval[pathname] = pathname " " defpath if (hdrval[fromname] == "") hdrval[fromname] = fromname " " deffrom --- 41,52 ---- hdrval[msgidname] = hdrval[msgidname] " " fields[i] } + if (hdrval[pathname] == "") + hdrval[pathname] = pathname " " defpath if (hdrval[msgidname] == "") hdrval[msgidname] = msgidname " " defmsgid + if (hdrval[datename] == "") + hdrval[datename] = datename " " defdate if (hdrval[orgname] == "") hdrval[orgname] = orgname " " deforg if (hdrval[fromname] == "") hdrval[fromname] = fromname " " deffrom *************** *** 48,51 **** --- 53,58 ---- else if (hdrval[sendername] == "") hdrval[sendername] = sendername " " deffrom + + # replace user's headers (if any) [this is not currently done] # snuff some headers *** cnpatch/tmp.file Tue Aug 22 14:09:05 1989 --- relay/sh/inews Mon Aug 7 01:50:19 1989 *************** *** 22,26 **** relayopts=-i # redirect stdout to log - whoami=/tmp/in$$who # just created to determine effective uid input=/tmp/in$$in # uncensored input inhdrs=/tmp/in$$hdr # generated by tear: headers --- 22,25 ---- *************** *** 31,36 **** exitflag=/tmp/in$$exit # exit status, if present outfile=/tmp/in$$out # relaynews stdout grpok=/tmp/in$$grp # flag file: groups okay if present - rmlist="$inhdrs $inbody $input $censart $nglist $modroute $exitflag $outfile $grpok" umask $NEWSUMASK --- 30,35 ---- exitflag=/tmp/in$$exit # exit status, if present outfile=/tmp/in$$out # relaynews stdout + rmlist="$inhdrs $inbody $input $censart $nglist $modroute $exitflag $outfile" grpok=/tmp/in$$grp # flag file: groups okay if present umask $NEWSUMASK *************** *** 87,108 **** -o) shift; ORGANIZATION="$1"; export ORGANIZATION ;; ! -C) # megakludge-o-rama ! # first, permit only to super-users ! >$whoami ! case "`ls -l $whoami | awk '{print $3}'`" in ! root) : a winner ;; ! *) ! echo "$0: only super-users may create news groups" >&2 ! exit 1 ! ;; ! esac ! rm -f $whoami ! 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 ! ;; -*) --- 86,103 ---- -o) shift; ORGANIZATION="$1"; export ORGANIZATION ;; ! -C) ! echo "$0: you either want to use addgroup (see newsaux(8)) to make" >&2 ! echo "$0: $2 locally or this to make it network-wide:" >&2 ! cat </dev/null || { --- 214,218 ---- # n, x and (unapproved) m flags are dealt with on the spot; if none are # seen, the article is posted normally. ! # escape egrep metacharacters. In theory one could add " ' ` \ to the list. egreppat="^(` sed -e 's/[.+*()|[]/\\\\&/g' -e 's/,/|/g' <$nglist `) " egrep "$egreppat" $NEWSCTL/active >/dev/null || { *************** *** 233,238 **** [nx]) echo "$0: sorry, $ng may not be posted to locally." >&2 echo 1 >$exitflag - trap 0 # this is a child process - no cleanup exit 1 # dregs in /tmp/in$$* ;; --- 228,233 ---- [nx]) echo "$0: sorry, $ng may not be posted to locally." >&2 + trap 0 # this is a child process - no cleanup here echo 1 >$exitflag exit 1 # dregs in /tmp/in$$* ;; *************** *** 267,273 **** echo "$0: mailing your article to $moderator" >&2 mail $moderator <$censart ! rm -f $rmlist echo 0 >$exitflag - trap 0 # this is a child process - did cleanup exit 0 fi --- 262,267 ---- echo "$0: mailing your article to $moderator" >&2 mail $moderator <$censart ! trap 0 # this is a child process - no cleanup here echo 0 >$exitflag exit 0 fi *************** *** 288,297 **** exit 1 # abnormal exit - cleans up, makes dead.article fi if test -f $exitflag; then exitstatus="`cat $exitflag`" case "$exitstatus" in ! 0) trap 0 ;; # normal exit - cleanup done, no dead.article esac ! exit $exitstatus # trap 0 will cleanup, make dead.article fi --- 282,292 ---- exit 1 # abnormal exit - cleans up, makes dead.article fi + rm -f $grpok if test -f $exitflag; then exitstatus="`cat $exitflag`" case "$exitstatus" in ! 0) rm -f $rmlist; trap 0 ;; # normal exit - cleanup, no dead.article esac ! exit $exitstatus # trap 0 may cleanup, make dead.article fi *** cnpatch/tmp.file Tue Aug 22 14:09:19 1989 --- rna/makefile Mon Aug 21 19:31:57 1989 *************** *** 24,28 **** 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 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 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 *************** *** 39,44 **** $(INSTALL) -c $*.sh bin 755 $@ ! all: readnews checknews ! chmod +x checknews : warning, defs.h may not be right for your system --- 40,45 ---- $(INSTALL) -c $*.sh bin 755 $@ ! all: readnews checknews postnews ! chmod +x checknews postnews : warning, defs.h may not be right for your system *************** *** 52,56 **** # bininstall: make directories, install programs bininstall: install ! install: $(BINDIR)/readnews $(BINDIR)/checknews $(BINDIR)/readnews: readnews cp readnews $(BINDIR) --- 53,57 ---- # bininstall: make directories, install programs bininstall: install ! install: $(BINDIR)/readnews $(BINDIR)/checknews $(BINDIR)/postnews $(BINDIR)/readnews: readnews cp readnews $(BINDIR) *************** *** 58,62 **** --- 59,70 ---- $(BINDIR)/checknews: checknews cp checknews $(BINDIR) + $(BINDIR)/postnews: postnews + cp postnews $(BINDIR) + cmp: readnews checknews postnews + cmp $(BINDIR)/readnews readnews + cmp $(BINDIR)/checknews checknews + cmp $(BINDIR)/postnews postnews + defs.h: at.h # $C touch defs.h *************** *** 74,81 **** $(ROFILES): defs.h ! postnews: $(BINDIR)/postnews ! $(BINDIR)/postnews: $(PFILES) defs.h ! $(CC) $(CFLAGS) $(PFILES) -o postnews ! $(INSTALL) - postnews news 6711 $(BINDIR)/postnews postgroup: $(BINDIR)/postgroup --- 82,89 ---- $(ROFILES): defs.h ! # postnews: $(BINDIR)/postnews ! # $(BINDIR)/postnews: $(PFILES) defs.h ! # $(CC) $(CFLAGS) $(PFILES) -o postnews ! # $(INSTALL) - postnews news 6711 $(BINDIR)/postnews postgroup: $(BINDIR)/postgroup Files that are new: new expire/updatemin.c (patch can't create, so diff against null): Index: expire/updatemin.c *** cnpatch/tmp.preposterously.long.name.to.make.patch.behave.right Tue Aug 22 14:05:42 1989 --- expire/updatemin.c Sun Aug 20 00:53:41 1989 *************** *** 0 **** --- 1,211 ---- + /* + * updatemin - update the "min" fields in the active file + */ + + #include + #include + #include + #include + + #ifndef BERKDIR + #include + #else + #include + #define dirent direct + #endif + + #include "config.h" + #include "fgetmfs.h" + #include "alloc.h" + + void fail(); + void catch(); + void slash(); + long lowest(); + + char newname[] = "active.new"; + + char *progname; + + extern long atol(); + + /* + - main - parse arguments and handle options + */ + main(argc, argv) + int argc; + char *argv[]; + { + DIR *d; + register FILE *a; + register FILE *new; + char *line; + # define NF 4 + char *field[NF]; + register int nf; + register long min; + register char *name; + char minstr[6]; + + progname = argv[0]; + + cd(ctlfile((char *)NULL)); + (void) umask(newsumask()); + + catch(SIGINT); + catch(SIGQUIT); + catch(SIGHUP); + catch(SIGTERM); + newslock(); + + a = fopen("active", "r"); + if (a == NULL) + fail("cannot open `%s'", ctlfile("active")); + new = fopen(newname, "w"); + if (new == NULL) + fail("cannot create `%s'", ctlfile(newname)); + + cd(fullartfile((char *)NULL)); + while ((line = fgetms(a)) != NULL) { + nf = split(line, field, NF, " \t\n"); + if (nf != NF) + fail("bad number of fields in `%s ...'", field[0]); + name = strsave(field[0]); + slash(name); + d = opendir(artfile(name)); + if (d != NULL) { + min = lowest(d); + if (min < 0) /* no articles */ + min = atol(field[1])+1; + closedir(d); + } else /* no directory */ + min = atol(field[2]); + fprintf(new, "%s %s ", field[0], field[1]); + if (min < 10000) { /* insist on at least five digits */ + sprintf(minstr, "%ld", min); + fprintf(new, "%s", "00000"+strlen(minstr)); + } + fprintf(new, "%ld %s\n", min, field[3]); + free(name); + free(line); + } + + if (nfclose(new) == EOF) + fail("close failed on `%s'", ctlfile(newname)); + cd(ctlfile((char *)NULL)); + (void) unlink("active.old"); + if (link("active", "active.old") < 0) + fail("can't link `active' to `active.old'", ""); + if (unlink("active") < 0) + fail("can't unlink `active'", ""); + if (link(newname, "active") < 0) { + if (link("active.old", "active") < 0) + fail("disaster -- cannot recover `active'!!", ""); + else + fail("can't link in new `active' -- old one used", ""); + } + newsunlock(); + + exit(0); + } + + /* + - lowest - find numerically-lowest name in directory + */ + long /* lowest; -1 if none */ + lowest(d) + register DIR *d; + { + register struct dirent *dp; + register long this; + register long min = -1; + register int any = 0; + + while ((dp = readdir(d)) != NULL) { + if (strspn(dp->d_name, "0123456789") == strlen(dp->d_name)) { + this = atol(dp->d_name); + if (this < min || !any) { + min = this; + any = 1; + } + } + } + + return(min); + } + + /* + - split - divide a line into fields, like awk split() + */ + int /* number of fields */ + split(line, fields, nfmax, sep) + char *line; + char *fields[]; + int nfmax; + char *sep; + { + register int i; + register char *p; + + i = 0; + for (p = strtok(line, sep); p != NULL; p = strtok((char *)NULL, sep)) { + if (i < nfmax) + fields[i] = p; + i++; + } + + return(i); + } + + /* + - slash - convert dots to slashes in string + */ + void + slash(s) + char *s; + { + register char *p = s; + + while ((p = strchr(p, '.')) != NULL) + *p = '/'; + } + + /* + - interrupt - signal handler + */ + void + interrupt() + { + fail("interrupted", ""); + } + + /* + - catch - set up to catch a signal + */ + void + catch(sig) + int sig; + { + if (signal(sig, SIG_IGN) != SIG_IGN) + (void) signal(sig, interrupt); + } + + /* + - fail - some sort of error occurred + */ + void + fail(s1, s2) + char *s1; + char *s2; + { + /* possibly should rm newname, but it may be important evidence */ + errunlock(s1, s2); + } + + /* + - unprivileged - keep the configuration stuff happy + */ + void + unprivileged() + { + } new man/Makefile (patch can't create, so diff against null): Index: man/Makefile *** cnpatch/tmp.preposterously.long.name.to.make.patch.behave.right Tue Aug 22 14:05:42 1989 --- man/Makefile Sat Aug 19 20:47:51 1989 *************** *** 0 **** --- 1,4 ---- + cmp: + -for f in *.1 ; do echo --- $$f --- ; diff /usr/man/man1 $$f ; done + -for f in *.5 ; do echo --- $$f --- ; diff /usr/man/man5 $$f ; done + -for f in *.8 ; do echo --- $$f --- ; diff /usr/man/man8 $$f ; done new misc/adddirs (patch can't create, so diff against null): Index: misc/adddirs *** cnpatch/tmp.preposterously.long.name.to.make.patch.behave.right Tue Aug 22 14:05:42 1989 --- misc/adddirs Sat Aug 19 20:41:27 1989 *************** *** 0 **** --- 1,17 ---- + #! /bin/sh + # adddirs - add any directories needed for newsgroups in active file + + # =()<. ${NEWSCONFIG-@@}>()= + . ${NEWSCONFIG-/usr/lib/news/bin/config} + + PATH=$NEWSCTL/bin:$NEWSBIN/maint:$NEWSBIN/relay:$NEWSBIN:$NEWSPATH ; export PATH + umask $NEWSUMASK + + for dir in `sed 's/[ ].*//' $NEWSCTL/active | tr . /` + do + if test ! -d $NEWSARTS/$dir + then + echo "making $dir (and parents if needed...)" + : mkpdir $NEWSARTS/$dir + fi + done end of patch 22-Aug-1989