home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume19 / cnews2 / pch24aug89 < prev    next >
Internet Message Format  |  1989-09-17  |  56KB

  1. From bbn.com!bbn!husc6!think!ames!sun-barr!cs.utexas.edu!uunet!mnetor!utzoo!henry Fri Aug 25 13:06:59 EDT 1989
  2. Article 2318 of news.software.b:
  3. Path: bbn.com!bbn!husc6!think!ames!sun-barr!cs.utexas.edu!uunet!mnetor!utzoo!henry
  4. >From: henry@utzoo.uucp (Henry Spencer)
  5. Newsgroups: news.software.b
  6. Subject: 24-Aug-1989 patch for C News, including updatemin fix
  7. Message-ID: <1989Aug24.203753.8167@utzoo.uucp>
  8. Date: 24 Aug 89 20:37:53 GMT
  9. Organization: U of Toronto Zoology
  10. Lines: 2055
  11.  
  12. Well, I'd hoped that this one would have more substantive content.  Alas,
  13. some more minor cleanup work touched a lot of files, and through the magic
  14. of context diffs :-( we're already up to one patch worth.
  15.  
  16. More minor cleanup and improvements.  Build now asks about linking flags
  17. in addition to compiling flags (most people get along by using the same
  18. flags for both, but there have been requests).  Index/rindex have been
  19. changed to strchr/strrchr everywhere, to standardize.  The -r option of
  20. expire is now documented, and doexpire is now willing to use it if space
  21. looks tight.  Relaynews now rejects articles with white space in their
  22. message-id -- this is illegal by both RFCs and bothers some other software
  23. badly, and we prefer rejecting stuff outright to quietly "fixing things"
  24. without telling people about it.  URGENT BUG FIX FOR UPDATEMIN.  And the
  25. beginnings of case-insensitive header-name recognition (Geoff suspects
  26. you can interpret RFC1036 to the effect that this is unnecessary, but
  27. the ice is thin there, so we're going to do it).
  28.  
  29. start of patch 24-Aug-1989
  30. this should be run with   patch -p0 <thisfile
  31.  
  32. Please do the following (there is no easy way we can convince
  33. patch to do this automatically):
  34. rm libfake/index.c
  35. rm libfake/rindex.c
  36.  
  37. The following is a complete list of patches to date.
  38.  
  39. Prereq: 23-Jun-1989
  40. Prereq: 7-Jul-1989
  41. Prereq: 23-Jul-1989
  42. Prereq: 22-Aug-1989
  43. *** tmp.dates.with.really.long.filename.for.patch    Thu Aug 24 15:38:53 1989
  44. --- PATCHDATES    Thu Aug 24 15:38:53 1989
  45. ***************
  46. *** 1,4 ****
  47. --- 1,5 ----
  48.   23-Jun-1989
  49.   7-Jul-1989
  50.   23-Jul-1989
  51.   22-Aug-1989
  52. + 24-Aug-1989
  53.  
  54. Changed files, if any:
  55.  
  56. *** cnpatch/tmp.file    Thu Aug 24 15:39:02 1989
  57. --- batch/Makefile    Tue Aug 22 16:56:12 1989
  58. ***************
  59. *** 1,7 ****
  60.   # Configuration stuff.
  61.   COPTS=-O
  62.   CFLAGS=$(COPTS) -I../include
  63. - LDFLAGS=
  64.   LIBS=../libcnews.a
  65.   # =()<NEWSARTS = @<NEWSARTS>@>()=
  66.   NEWSARTS = /usr/spool/news
  67. --- 1,6 ----
  68. ***************
  69. *** 33,39 ****
  70.       $(CC) $(CFLAGS) $(LDFLAGS) c7encode.o $(PRE) $(LIBS) $(POST) -o $@
  71.   
  72.   bencode:    bencode.o crctab.o $(LIBS)
  73. !     $(CC) $(CFLAGS) bencode.o crctab.o $(PRE) $(LIBS) $(POST) -o $@
  74.   
  75.   bencode.o:    coder.h
  76.   
  77. --- 32,38 ----
  78.       $(CC) $(CFLAGS) $(LDFLAGS) c7encode.o $(PRE) $(LIBS) $(POST) -o $@
  79.   
  80.   bencode:    bencode.o crctab.o $(LIBS)
  81. !     $(CC) $(CFLAGS) $(LDFLAGS) bencode.o crctab.o $(PRE) $(LIBS) $(POST) -o $@
  82.   
  83.   bencode.o:    coder.h
  84.   
  85.  
  86. *** cnpatch/tmp.file    Thu Aug 24 15:39:09 1989
  87. --- conf/Makefile    Tue Aug 22 16:54:25 1989
  88. ***************
  89. *** 77,83 ****
  90.       echo 'echo 0' >>$@
  91.   
  92.   setnewsids:    setnewsids.o $(LIBS)
  93. !     $(CC) $(CFLAGS) setnewsids.o $(PRE) $(LIBS) $(POST) -o $@
  94.   
  95.   ../ranlibed:    ../libcnews.a
  96.       ranlib ../libcnews.a
  97. --- 77,83 ----
  98.       echo 'echo 0' >>$@
  99.   
  100.   setnewsids:    setnewsids.o $(LIBS)
  101. !     $(CC) $(CFLAGS) $(LDFLAGS) setnewsids.o $(PRE) $(LIBS) $(POST) -o $@
  102.   
  103.   ../ranlibed:    ../libcnews.a
  104.       ranlib ../libcnews.a
  105.  
  106. *** cnpatch/tmp.file    Thu Aug 24 15:39:11 1989
  107. --- conf/build    Wed Aug 23 15:59:12 1989
  108. ***************
  109. *** 1,8 ****
  110.   #! /bin/sh
  111.   
  112.   # functions and headers we are prepared to fake
  113. ! mightfake='fsync getopt index memcpy memcmp memchr memset mkdir
  114. !     putenv rindex strchr strrchr strpbrk strspn strcspn strtok symlink'
  115.   mightfakehdrs='stdlib.h string.h'
  116.   
  117.   # directories in which to do makes
  118. --- 1,8 ----
  119.   #! /bin/sh
  120.   
  121.   # functions and headers we are prepared to fake
  122. ! mightfake='fsync getopt memcpy memcmp memchr memset mkdir
  123. !     putenv strchr strrchr strpbrk strspn strcspn strtok symlink'
  124.   mightfakehdrs='stdlib.h string.h'
  125.   
  126.   # directories in which to do makes
  127. ***************
  128. *** 263,268 ****
  129. --- 263,270 ----
  130.       echo "umask $newsumask"
  131.       echo 'set -x'
  132.       echo ": making directories..."
  133. +     ln=
  134. +     lb=
  135.       if test " $makelinks" = " y"
  136.       then
  137.           echo "mkdir $realarts $realctl $realbin"
  138. ***************
  139. *** 269,282 ****
  140. --- 271,287 ----
  141.           if test " $realarts" != " $newsarts"
  142.           then
  143.               echo "ln -s $realarts $newsarts"
  144. +             ln="$ln $realarts"
  145.           fi
  146.           if test " $realctl" != " $newsctl"
  147.           then
  148.               echo "ln -s $realctl $newsctl"
  149. +             ln="$ln $realctl"
  150.           fi
  151.           if test " $realbin" != " $newsbin"
  152.           then
  153.               echo "ln -s $realbin $newsbin"
  154. +             lb="$lb $realbin"
  155.           fi
  156.       fi
  157.       n="$newsarts $newsarts/in.coming $newsarts/in.coming/bad"
  158. ***************
  159. *** 291,303 ****
  160.       echo "done"
  161.       if test " $chboth" = " y"
  162.       then
  163. !         echo "$chown $newsuid.$newsgid $n"
  164. !         echo "$chown $binuid.$bingid $b"
  165.       else
  166. !         echo "$chown $newsuid $n"
  167. !         echo "$chgrp $newsgid $n"
  168. !         echo "$chown $binuid $b"
  169. !         echo "$chgrp $bingid $b"
  170.       fi
  171.       echo ": done"
  172.   ) >>doit.root
  173. --- 296,308 ----
  174.       echo "done"
  175.       if test " $chboth" = " y"
  176.       then
  177. !         echo "$chown $newsuid.$newsgid $n $ln"
  178. !         echo "$chown $binuid.$bingid $b $lb"
  179.       else
  180. !         echo "$chown $newsuid $n $ln"
  181. !         echo "$chgrp $newsgid $n $ln"
  182. !         echo "$chown $binuid $b $lb"
  183. !         echo "$chgrp $bingid $b $lb"
  184.       fi
  185.       echo ": done"
  186.   ) >>doit.root
  187. ***************
  188. *** 416,422 ****
  189.   found=
  190.   for f in $fake dummy
  191.   do
  192. !     if test " $f" = " index.o"
  193.       then
  194.           found=y
  195.       fi
  196. --- 421,427 ----
  197.   found=
  198.   for f in $fake dummy
  199.   do
  200. !     if test " $f" = " strchr.o"
  201.       then
  202.           found=y
  203.       fi
  204. ***************
  205. *** 424,435 ****
  206.   if test " $found" = " "
  207.   then
  208.       echo
  209. !     echo 'A well-tuned index() function customized to a particular machine'
  210. !     echo 'is usually faster than portable C.  Is your index() function'
  211.       ./query 'indeed fast (okay to guess) [yes]? '
  212. !     read fastindex
  213. !     case "$fastindex" in
  214. !     y*|Y*|'')    fastindex=y    ;;
  215.       esac
  216.   fi
  217.   
  218. --- 429,440 ----
  219.   if test " $found" = " "
  220.   then
  221.       echo
  222. !     echo 'A well-tuned strchr() function customized to a particular machine'
  223. !     echo 'is usually faster than portable C.  Is your strchr() function'
  224.       ./query 'indeed fast (okay to guess) [yes]? '
  225. !     read faststrchr
  226. !     case "$faststrchr" in
  227. !     y*|Y*|'')    faststrchr=y    ;;
  228.       esac
  229.   fi
  230.   
  231. ***************
  232. *** 528,533 ****
  233. --- 533,549 ----
  234.   esac
  235.   
  236.   echo
  237. + echo 'The final linking ("ld") step of compiling might need an option,'
  238. + echo 'such as -n or -i, to produce the preferred form of executable file.'
  239. + echo 'On many modern systems the preferred form is the default.  What options,'
  240. + ./query 'if any, should be given for linking [none]? '
  241. + read ldopts
  242. + case "$ldopts" in
  243. + '')    ;;
  244. + *)    copts="$copts LDFLAGS='$ldopts'"    ;;
  245. + esac
  246. + echo
  247.   echo 'On unusual systems it may be necessary to link C News programs with'
  248.   echo 'libraries other than the usual C library.  These can be specified as'
  249.   echo 'either full pathnames or -l... options.  What libraries, in addition'
  250. ***************
  251. *** 847,855 ****
  252.       echo 'fi'
  253.       echo 'cd h'
  254.       echo 'rm -f nnewshsed'
  255. !     if test " $fastindex" != " y"
  256.       then
  257. !         echo 'echo "/FASTINDEX.*qqq/s;^;/* ;" >>nnewshsed'
  258.       fi
  259.       if test " $storeval" = " y"
  260.       then
  261. --- 863,871 ----
  262.       echo 'fi'
  263.       echo 'cd h'
  264.       echo 'rm -f nnewshsed'
  265. !     if test " $faststrchr" != " y"
  266.       then
  267. !         echo 'echo "/FASTSTRCHR.*qqq/s;^;/* ;" >>nnewshsed'
  268.       fi
  269.       if test " $storeval" = " y"
  270.       then
  271.  
  272. *** cnpatch/tmp.file    Thu Aug 24 15:39:17 1989
  273. --- conf/sys.proto    Tue Aug 22 16:20:54 1989
  274. ***************
  275. *** 4,9 ****
  276. --- 4,12 ----
  277.   # sample insignificant feed not using batching
  278.   huey:news.config,to.huey/all::uux - -r -gd huey!rnews
  279.   
  280. + # sample of mailing newsgroups to someone (note distribution)
  281. + daisy:soc.women,soc.couples/all::mail daisy@duck
  282.   # sample major batched feed, including (unnecessary) explicit file name
  283.   dewey:comp,news,sci,rec,misc,soc,talk,to.dewey,can,ont,tor,ut/all:f:dewey/togo
  284.   
  285.  
  286. *** cnpatch/tmp.file    Thu Aug 24 15:39:32 1989
  287. --- expire/Makefile    Thu Aug 24 14:52:30 1989
  288. ***************
  289. *** 3,9 ****
  290.   CFLAGS = $(COPTS) -I../include $(PROF)
  291.   LINTFLAGS = -I../include
  292.   JUNKLINT = 'possible pointer align'
  293. - LDFLAGS = $(CFLAGS)
  294.   DBM = -ldbm
  295.   LIBS= ../libcnews.a
  296.   THEM = expire histdups histinfo histslash mkdbm mkhistory \
  297. --- 3,8 ----
  298. ***************
  299. *** 35,53 ****
  300.       -if test ! -r $(NEWSCTL)/explist ; then cp explist.proto $(NEWSCTL)/explist ; fi
  301.   
  302.   expire: expire.o $(LIBS)
  303. !     $(CC) $(LDFLAGS) expire.o $(PRE) $(LIBS) $(DBM) $(POST) -o $@
  304.   
  305.   histinfo: histinfo.o $(LIBS)
  306. !     $(CC) $(LDFLAGS) histinfo.o $(PRE) $(LIBS) $(POST) -o $@
  307.   
  308.   updatemin:    updatemin.o $(LIBS)
  309. !     $(CC) $(LDFLAGS) updatemin.o $(PRE) $(LIBS) $(POST) -o $@
  310.   
  311.   histslash:    histslash.o $(LIBS)
  312. !     $(CC) $(LDFLAGS) histslash.o $(PRE) $(LIBS) $(POST) -o $@
  313.   
  314.   mkdbm:    mkdbm.o $(LIBS)
  315. !     $(CC) $(LDFLAGS) mkdbm.o $(PRE) $(LIBS) $(DBM) $(POST) -o $@
  316.   
  317.   lint:    expire.c
  318.       lint -ha $(LINTFLAGS) expire.c 2>&1 | egrep -v $(JUNKLINT) | tee $@
  319. --- 34,52 ----
  320.       -if test ! -r $(NEWSCTL)/explist ; then cp explist.proto $(NEWSCTL)/explist ; fi
  321.   
  322.   expire: expire.o $(LIBS)
  323. !     $(CC) $(CFLAGS) $(LDFLAGS) expire.o $(PRE) $(LIBS) $(DBM) $(POST) -o $@
  324.   
  325.   histinfo: histinfo.o $(LIBS)
  326. !     $(CC) $(CFLAGS) $(LDFLAGS) histinfo.o $(PRE) $(LIBS) $(POST) -o $@
  327.   
  328.   updatemin:    updatemin.o $(LIBS)
  329. !     $(CC) $(CFLAGS) $(LDFLAGS) updatemin.o $(PRE) $(LIBS) $(POST) -o $@
  330.   
  331.   histslash:    histslash.o $(LIBS)
  332. !     $(CC) $(CFLAGS) $(LDFLAGS) histslash.o $(PRE) $(LIBS) $(POST) -o $@
  333.   
  334.   mkdbm:    mkdbm.o $(LIBS)
  335. !     $(CC) $(CFLAGS) $(LDFLAGS) mkdbm.o $(PRE) $(LIBS) $(DBM) $(POST) -o $@
  336.   
  337.   lint:    expire.c
  338.       lint -ha $(LINTFLAGS) expire.c 2>&1 | egrep -v $(JUNKLINT) | tee $@
  339. ***************
  340. *** 111,117 ****
  341.       echo 'bletch 00099 00100 y' >>active.after
  342.       echo '<wont1>    9999~-    foo/1' >>history.proto
  343.       echo :foo/1: >arts/foo/1
  344. !     echo 'Message-ID: <wont1>' >>arts/foo/1
  345.       echo '<will2>    1000~-    foo/2' >>history.proto
  346.       echo foo/2 >arts/foo/2
  347.       echo '<will3>    1000~100    foo/3' >>history.proto
  348. --- 110,116 ----
  349.       echo 'bletch 00099 00100 y' >>active.after
  350.       echo '<wont1>    9999~-    foo/1' >>history.proto
  351.       echo :foo/1: >arts/foo/1
  352. !     echo 'MeSsAge-ID: <wont1>' >>arts/foo/1
  353.       echo '<will2>    1000~-    foo/2' >>history.proto
  354.       echo foo/2 >arts/foo/2
  355.       echo '<will3>    1000~100    foo/3' >>history.proto
  356. ***************
  357. *** 118,124 ****
  358.       echo foo/3 >arts/foo/3
  359.       echo '<two4>    100    bar/4' >>history.proto
  360.       echo :bar/4: >arts/bar/4
  361. !     echo 'Subject: yes' >>arts/bar/4
  362.       echo '<will5>    100~    bar.ugh/5' >>history.proto
  363.       echo :bar/ugh/5: >arts/bar/ugh/5
  364.       echo >>arts/bar/ugh/5
  365. --- 117,123 ----
  366.       echo foo/3 >arts/foo/3
  367.       echo '<two4>    100    bar/4' >>history.proto
  368.       echo :bar/4: >arts/bar/4
  369. !     echo 'SuBjeCt: yes' >>arts/bar/4
  370.       echo '<will5>    100~    bar.ugh/5' >>history.proto
  371.       echo :bar/ugh/5: >arts/bar/ugh/5
  372.       echo >>arts/bar/ugh/5
  373. ***************
  374. *** 127,134 ****
  375.       echo urp/6 >arts/urp/6
  376.       echo '<wont7>    9999~9999~xx~a    urp/7' >>history.proto
  377.       echo :urp/7: >arts/urp/7
  378. !     echo 'Message-ID: <wont7>' >>arts/urp/7
  379. !     echo 'Expires: 9999' >>arts/urp/7
  380.       echo '<gone8>    100~20000    urp/8' >>history.proto
  381.       echo urp/8 >arts/urp/8
  382.       echo '<gone9>    100~-    urp/9' >>history.proto
  383. --- 126,133 ----
  384.       echo urp/6 >arts/urp/6
  385.       echo '<wont7>    9999~9999~xx~a    urp/7' >>history.proto
  386.       echo :urp/7: >arts/urp/7
  387. !     echo 'mEssaGe-id: <wont7>' >>arts/urp/7
  388. !     echo 'exPiRes: 9999' >>arts/urp/7
  389.       echo '<gone8>    100~20000    urp/8' >>history.proto
  390.       echo urp/8 >arts/urp/8
  391.       echo '<gone9>    100~-    urp/9' >>history.proto
  392. ***************
  393. *** 213,218 ****
  394. --- 212,219 ----
  395.       test ! -f arts/urp/99 ;
  396.       cmp history history.after
  397.       : "that's it for expire, on to upact"
  398. +     $(D) ./$(UPACT)
  399. +     cmp active active.after
  400.       $(D) ./$(UPACT)
  401.       cmp active active.after
  402.       : "and for upact, on to mkhistory"
  403.  
  404. *** cnpatch/tmp.file    Thu Aug 24 15:39:35 1989
  405. --- expire/doexpire    Wed Aug 23 15:36:16 1989
  406. ***************
  407. *** 19,54 ****
  408.       exit 1
  409.   fi
  410.   
  411. ! cd $NEWSCTL
  412.   
  413. ! firstctl=
  414. ! firstar=
  415. ! while true
  416.   do
  417.       size="`sizeof history history.pag history.dir`"
  418. !     if test " `spacefor $size control`" -le 0
  419.       then
  420. !         if test " $firstctl" = " "
  421. !         then
  422. !             echo "$0: trouble finding space for work files" |
  423. !                             mail "$NEWSMASTER"
  424. !             firstctl=n
  425. !         fi
  426. !     elif test " `spacefor 1 archive`" -le 0
  427. !     then
  428. !         if test " $firstar" = " "
  429. !         then
  430. !             echo "$0: trouble finding space for archiving" |
  431. !                             mail "$NEWSMASTER"
  432. !             firstar=n
  433. !         fi
  434. !     else            # enough space both places
  435.           break
  436.       fi
  437.       sleep 600        # and hope it will improve
  438.   done
  439.   
  440. ! expire $* $NEWSCTL/explist 2>/tmp/doex$$
  441.   if test -s /tmp/doex$$
  442.   then
  443.       (echo 'expire problems:' ; cat /tmp/doex$$ ) | mail "$NEWSMASTER"
  444. --- 19,49 ----
  445.       exit 1
  446.   fi
  447.   
  448. ! if test " `spacefor 1 archive`" -le 0
  449. ! then
  450. !     echo "$0: not enough space for archiving" | mail "$NEWSMASTER"
  451. !     exit 1
  452. ! fi
  453.   
  454. ! cd $NEWSCTL
  455. ! ropt=-r
  456. ! for counter in x x x x        # four tries
  457.   do
  458.       size="`sizeof history history.pag history.dir`"
  459. !     if test " `spacefor $size control`" -gt 0
  460.       then
  461. !         ropt=
  462.           break
  463.       fi
  464.       sleep 600        # and hope it will improve
  465.   done
  466. + if test " $ropt" = " -r"
  467. + then
  468. +     echo "$0: short of space for temporaries, resorting to \`expire -r'" |
  469. +                             mail "$NEWSMASTER"
  470. + fi
  471.   
  472. ! expire $ropt $* $NEWSCTL/explist 2>/tmp/doex$$
  473.   if test -s /tmp/doex$$
  474.   then
  475.       (echo 'expire problems:' ; cat /tmp/doex$$ ) | mail "$NEWSMASTER"
  476.  
  477. *** cnpatch/tmp.file    Thu Aug 24 15:39:35 1989
  478. --- expire/expire.c    Wed Aug 23 16:37:14 1989
  479. ***************
  480. *** 19,24 ****
  481. --- 19,25 ----
  482.   #include "news.h"
  483.   #include "config.h"
  484.   #include "fgetmfs.h"
  485. + #include "case.h"
  486.   
  487.   #ifndef EPOCH
  488.   #define    EPOCH    ((time_t)0)
  489. ***************
  490. *** 213,218 ****
  491. --- 214,221 ----
  492.       if (expdebug)
  493.           setbuf(stderr, (char *)NULL);
  494.   
  495. +     (void) cistrncmp("a", "a", 1);        /* prime case.c */
  496.       if (optind < argc) {
  497.           cf = eufopen(argv[optind], "r");
  498.           control(cf);
  499. ***************
  500. *** 905,911 ****
  501.       len = strlen(sline);
  502.       limit = buf + bsize - len;
  503.       for (scan = buf; scan < limit; scan++)
  504. !         if (STREQN(scan, sline, len) &&
  505.                   (scan == buf || *(scan-1) == '\n')) {
  506.               scan += len;
  507.               for (limit = scan; limit < buf+bsize; limit++)
  508. --- 908,914 ----
  509.       len = strlen(sline);
  510.       limit = buf + bsize - len;
  511.       for (scan = buf; scan < limit; scan++)
  512. !         if (TOLOW(*scan) == 's' && cistrncmp(scan, sline, len) == 0 &&
  513.                   (scan == buf || *(scan-1) == '\n')) {
  514.               scan += len;
  515.               for (limit = scan; limit < buf+bsize; limit++)
  516.  
  517. *** cnpatch/tmp.file    Thu Aug 24 15:39:38 1989
  518. --- expire/histinfo.c    Wed Aug 23 16:27:50 1989
  519. ***************
  520. *** 6,13 ****
  521.   #include <sys/types.h>
  522.   #include <sys/stat.h>        /* for modified time (date received) */
  523.   #include "config.h"
  524.   
  525. - #define MAXLINE 1024
  526.   #define STRLEN(s) (sizeof(s) - 1)    /* s must be a char array */
  527.   
  528.   char *progname;
  529. --- 6,15 ----
  530.   #include <sys/types.h>
  531.   #include <sys/stat.h>        /* for modified time (date received) */
  532.   #include "config.h"
  533. + #include "fgetmfs.h"
  534. + #include "alloc.h"
  535. + #include "case.h"
  536.   
  537.   #define STRLEN(s) (sizeof(s) - 1)    /* s must be a char array */
  538.   
  539.   char *progname;
  540. ***************
  541. *** 28,34 ****
  542.       int c;
  543.       int errflg = 0;
  544.       FILE *in;
  545. !     char inname[MAXLINE];
  546.       extern int optind;
  547.       extern char *optarg;
  548.   
  549. --- 30,36 ----
  550.       int c;
  551.       int errflg = 0;
  552.       FILE *in;
  553. !     char *inname;
  554.       extern int optind;
  555.       extern char *optarg;
  556.   
  557. ***************
  558. *** 50,60 ****
  559.       spdir = artfile((char *)NULL);
  560.       spdirlen = strlen(spdir);
  561.       
  562. !     while (fgets(inname, sizeof(inname), stdin) != NULL) {
  563.           inname[strlen(inname)-1] = '\0';    /* kill newline */
  564.           in = efopen(inname, "r");
  565.           process(in, inname);
  566.           (void) fclose(in);
  567.       }
  568.       exit(0);
  569.   }
  570. --- 52,63 ----
  571.       spdir = artfile((char *)NULL);
  572.       spdirlen = strlen(spdir);
  573.       
  574. !     while ((inname = fgetms(stdin)) != NULL) {
  575.           inname[strlen(inname)-1] = '\0';    /* kill newline */
  576.           in = efopen(inname, "r");
  577.           process(in, inname);
  578.           (void) fclose(in);
  579. +         free(inname);
  580.       }
  581.       exit(0);
  582.   }
  583. ***************
  584. *** 66,95 ****
  585.   FILE *in;
  586.   char *inname;
  587.   {
  588. !     char *nl, *name;
  589. !     char line[MAXLINE], msgid[MAXLINE], expiry[MAXLINE];
  590. !     char datercv[30];
  591.       struct stat statb;
  592.       static char msgidnm[] =  "Message-ID: ";
  593.       static char expnm[] =    "Expires: ";
  594.       register char *p;
  595. -     static char trash[] = "<swill@trash>";
  596. -     extern char *strrchr();
  597.       extern char *strchr();
  598. -     extern char *strcpy();
  599.   
  600. !     /* set defaults */
  601. !     (void) strcpy(expiry, "-");
  602. !     (void) strcpy(msgid, trash);
  603.   
  604.       /* read until EOF or blank line (end of headers) */
  605. !     while (fgets(line, sizeof line, in) != NULL && strcmp(line, "\n") != 0) {
  606. !         if ((nl = strrchr(line, '\n')) != NULL)
  607. !             *nl = '\0';            /* trim newline */
  608. !         if (strncmp(line, msgidnm, STRLEN(msgidnm)) == 0)
  609. !             (void) strcpy(msgid, line+STRLEN(msgidnm));
  610. !         else if (strncmp(line, expnm, STRLEN(expnm)) == 0)
  611. !             (void) strcpy(expiry, line+STRLEN(expnm));
  612.       }
  613.   
  614.       /* generate the file name */
  615. --- 69,100 ----
  616.   FILE *in;
  617.   char *inname;
  618.   {
  619. !     char *name;
  620. !     char *line;
  621. !     char *msgid;
  622. !     char *expiry;
  623. !     time_t datercv;
  624.       struct stat statb;
  625.       static char msgidnm[] =  "Message-ID: ";
  626.       static char expnm[] =    "Expires: ";
  627.       register char *p;
  628.       extern char *strchr();
  629.   
  630. !     expiry = strsave("-");
  631. !     msgid = NULL;
  632.   
  633.       /* read until EOF or blank line (end of headers) */
  634. !     while ((line = fgetms(in)) != NULL && strcmp(line, "\n") != 0) {
  635. !         line[strlen(line)-1] = '\0';        /* trim newline */
  636. !         if (cistrncmp(line, msgidnm, STRLEN(msgidnm)) == 0) {
  637. !             if (msgid != NULL)
  638. !                 free(msgid);
  639. !             msgid = strsave(line+STRLEN(msgidnm));
  640. !         } else if (cistrncmp(line, expnm, STRLEN(expnm)) == 0) {
  641. !             free(expiry);
  642. !             expiry = strsave(line+STRLEN(expnm));
  643. !         }
  644. !         free(line);
  645.       }
  646.   
  647.       /* generate the file name */
  648. ***************
  649. *** 100,127 ****
  650.   
  651.       /* generate the date received */
  652.       (void) fstat(fileno(in), &statb);
  653. !     (void) sprintf(datercv, "%ld", statb.st_mtime);
  654.   
  655. -     /* de-tab the message id */
  656. -     for (p = strchr(msgid, '\t'); p != NULL; p = strchr(p, '\t'))
  657. -         *p = ' ';
  658.       /* deal with empty and trash articles */
  659. !     if (strcmp(msgid, trash) == 0) {
  660. !         (void) sprintf(msgid, "<%s@trash>", name);
  661. !         (void) sprintf(datercv, "0");        /* expire at once */
  662.       }
  663.   
  664.       /* whomp out the history line */
  665.       (void) fputs(msgid, stdout);
  666. !     (void) putchar('\t');
  667. !     (void) fputs(datercv, stdout);
  668. !     (void) putchar('~');
  669.       (void) fputs(expiry, stdout);
  670.       (void) putchar('\t');
  671.       (void) fputs(name, stdout);
  672.       (void) putchar('\n');
  673.       (void) fflush(stdout);
  674.   }
  675.   
  676.   /*
  677. --- 105,132 ----
  678.   
  679.       /* generate the date received */
  680.       (void) fstat(fileno(in), &statb);
  681. !     datercv = statb.st_mtime;
  682.   
  683.       /* deal with empty and trash articles */
  684. !     if (msgid == NULL || strchr(msgid, '\t') != NULL) {
  685. !         if (msgid != NULL)
  686. !             free(msgid);
  687. !         msgid = str3save("<", name, "@trash>");
  688. !         datercv = 0;
  689. !         free(expiry);
  690. !         expiry = strsave("0");
  691.       }
  692.   
  693.       /* whomp out the history line */
  694.       (void) fputs(msgid, stdout);
  695. !     printf("\t%ld~", (long)datercv);
  696.       (void) fputs(expiry, stdout);
  697.       (void) putchar('\t');
  698.       (void) fputs(name, stdout);
  699.       (void) putchar('\n');
  700.       (void) fflush(stdout);
  701. +     free(msgid);
  702. +     free(expiry);
  703.   }
  704.   
  705.   /*
  706.  
  707. *** cnpatch/tmp.file    Thu Aug 24 15:39:39 1989
  708. --- expire/histslash.c    Wed Aug 23 16:39:28 1989
  709. ***************
  710. *** 4,22 ****
  711.    */
  712.   #include <stdio.h>
  713.   #include <assert.h>
  714.   
  715.   char *progname = "histslash";
  716.   
  717. - char buf[4096];            /* paranoia -- ought to be lots */
  718.   main()
  719.   {
  720.       register char *scan;
  721.       register char *last;
  722.       extern char *strchr();
  723.   
  724. !     while (fgets(buf, sizeof(buf), stdin) != NULL) {
  725. !         scan = strchr(buf, '\t');
  726.           scan = strchr(scan+1, '\t');
  727.           scan++;
  728.           last = NULL;
  729. --- 4,22 ----
  730.    */
  731.   #include <stdio.h>
  732.   #include <assert.h>
  733. + #include "fgetmfs.h"
  734.   
  735.   char *progname = "histslash";
  736.   
  737.   main()
  738.   {
  739.       register char *scan;
  740.       register char *last;
  741. +     register char *line;
  742.       extern char *strchr();
  743.   
  744. !     while ((line = fgetms(stdin)) != NULL) {
  745. !         scan = strchr(line, '\t');
  746.           scan = strchr(scan+1, '\t');
  747.           scan++;
  748.           last = NULL;
  749. ***************
  750. *** 31,36 ****
  751.               }
  752.               scan++;
  753.           }
  754. !         fputs(buf, stdout);
  755.       }
  756.   }
  757. --- 31,37 ----
  758.               }
  759.               scan++;
  760.           }
  761. !         fputs(line, stdout);
  762. !         free(line);
  763.       }
  764.   }
  765.  
  766. *** cnpatch/tmp.file    Thu Aug 24 15:39:40 1989
  767. --- expire/mkdbm.c    Wed Aug 23 16:46:15 1989
  768. ***************
  769. *** 7,16 ****
  770.   #include <stdio.h>
  771.   #include <string.h>
  772.   #include <ctype.h>
  773.   
  774. - char buf[4096];            /* ought to be plenty */
  775.   
  776.   char *progname = "mkdbm";
  777.   typedef struct { char *dptr; int dsize; } datum;
  778.   
  779. --- 7,15 ----
  780.   #include <stdio.h>
  781.   #include <string.h>
  782.   #include <ctype.h>
  783. + #include "fgetmfs.h"
  784.   
  785.   
  786.   char *progname = "mkdbm";
  787.   typedef struct { char *dptr; int dsize; } datum;
  788.   
  789. ***************
  790. *** 20,51 ****
  791.       long place;
  792.       datum lhs;
  793.       datum rhs;
  794. !     register int ret;
  795.   
  796. !     close(creat("hist.dir", 0666));
  797. !     close(creat("hist.pag", 0666));
  798.       if (dbminit("hist") < 0)
  799.           error("unable to do dbminit(\"hist\")", "");
  800.   
  801.       for (;;) {
  802.           place = ftell(stdin);
  803. !         if (fgets(buf, sizeof(buf), stdin) == NULL)
  804.               break;
  805.   
  806. !         scan = strchr(buf, '\t');
  807. !         if (scan == NULL || buf[strlen(buf)-1] != '\n') {
  808. !             fprintf(stderr, "bad format: %s", buf);
  809.               exit(1);
  810.           }
  811.           *scan = '\0';
  812.   
  813. !         lhs.dptr = buf;
  814. !         lhs.dsize = strlen(buf) + 1;
  815.           rhs.dptr = (char *)&place;
  816.           rhs.dsize = sizeof place;
  817. !         ret = store(lhs, rhs);
  818. !         if (ret < 0)
  819. !             fprintf(stderr, "dbm failure '%s' @ %ld\n", buf, place);
  820.       }
  821.       exit(0);
  822.   }
  823. --- 19,51 ----
  824.       long place;
  825.       datum lhs;
  826.       datum rhs;
  827. !     register char *line;
  828.   
  829. !     (void) close(creat("hist.dir", 0666));
  830. !     (void) close(creat("hist.pag", 0666));
  831.       if (dbminit("hist") < 0)
  832.           error("unable to do dbminit(\"hist\")", "");
  833.   
  834.       for (;;) {
  835.           place = ftell(stdin);
  836. !         line = fgetms(stdin);
  837. !         if (line == NULL)
  838.               break;
  839.   
  840. !         scan = strchr(line, '\t');
  841. !         if (scan == NULL || line[strlen(line)-1] != '\n') {
  842. !             fprintf(stderr, "bad format: `%.60s'\n", line);
  843.               exit(1);
  844.           }
  845.           *scan = '\0';
  846.   
  847. !         lhs.dptr = line;
  848. !         lhs.dsize = strlen(line) + 1;
  849.           rhs.dptr = (char *)&place;
  850.           rhs.dsize = sizeof place;
  851. !         if (store(lhs, rhs) < 0)
  852. !             fprintf(stderr, "dbm failure `%.50s' @ %ld\n", line, place);
  853. !         free(line);
  854.       }
  855.       exit(0);
  856.   }
  857.  
  858. *** cnpatch/tmp.file    Thu Aug 24 15:39:42 1989
  859. --- expire/superkludge    Wed Aug 23 16:31:57 1989
  860. ***************
  861. *** 27,34 ****
  862.       do
  863.           awk 'BEGIN { mid = "xxx" }
  864.               /^$/ { exit }    # goes to END
  865. !             /^Supersedes:[     ]/ { sup = $2 }
  866. !             /^Message-ID:[     ]/ { mid = $2 }
  867.               END { print FILENAME, mid, sup ; exit }' $f >>/tmp/sup$$
  868.       done
  869.       awk 'NF > 3 || $2 !~ /^<.*>$/ || $3 !~ /^(<.*>)?$/' /tmp/sup$$ >/tmp/supx$$
  870. --- 27,34 ----
  871.       do
  872.           awk 'BEGIN { mid = "xxx" }
  873.               /^$/ { exit }    # goes to END
  874. !             /^[Ss][Uu][Pp][Ee][Rr][Ss][Ee][Dd][Ee][Ss]:[     ]/ { sup = $2 }
  875. !             /^[Mm][Ee][Ss][Ss][Aa][Gg][Ee]-[Ii][Dd]:[     ]/ { mid = $2 }
  876.               END { print FILENAME, mid, sup ; exit }' $f >>/tmp/sup$$
  877.       done
  878.       awk 'NF > 3 || $2 !~ /^<.*>$/ || $3 !~ /^(<.*>)?$/' /tmp/sup$$ >/tmp/supx$$
  879.  
  880. *** cnpatch/tmp.file    Thu Aug 24 15:39:43 1989
  881. --- expire/updatemin.c    Thu Aug 24 14:25:22 1989
  882. ***************
  883. *** 61,66 ****
  884. --- 61,68 ----
  885.       a = fopen("active", "r");
  886.       if (a == NULL)
  887.           fail("cannot open `%s'", ctlfile("active"));
  888. +     if (fopen(newname, "r") != NULL)
  889. +         fail("`%s' already exists", newname);
  890.       new = fopen(newname, "w");
  891.       if (new == NULL)
  892.           fail("cannot create `%s'", ctlfile(newname));
  893. ***************
  894. *** 104,109 ****
  895. --- 106,113 ----
  896.           else
  897.               fail("can't link in new `active' -- old one used", "");
  898.       }
  899. +     if (unlink(newname) < 0)
  900. +         fail("can't unlink `%s'", newname);
  901.       newsunlock();
  902.   
  903.       exit(0);
  904.  
  905. *** cnpatch/tmp.file    Thu Aug 24 15:39:44 1989
  906. --- h/Makefile    Wed Aug 23 15:40:46 1989
  907. ***************
  908. *** 1,5 ****
  909.   I = ../include
  910. ! INCLS = $(I)/alloc.h $(I)/config.h $(I)/fgetmfs.h $(I)/libc.h $(I)/news.h
  911.   
  912.   all:    $(INCLS)
  913.   
  914. --- 1,5 ----
  915.   I = ../include
  916. ! INCLS = $(I)/alloc.h $(I)/config.h $(I)/fgetmfs.h $(I)/libc.h $(I)/news.h $(I)/case.h
  917.   
  918.   all:    $(INCLS)
  919.   
  920. ***************
  921. *** 11,16 ****
  922. --- 11,18 ----
  923.       cp fgetmfs.h $@
  924.   $(I)/libc.h:    libc.h
  925.       cp libc.h $@
  926. + $(I)/case.h:    case.h
  927. +     cp case.h $@
  928.   $(I)/news.h:    news.h newshsed
  929.       sed -f newshsed news.h >$@
  930.   
  931.  
  932. *** cnpatch/tmp.file    Thu Aug 24 15:39:46 1989
  933. --- h/libc.h    Tue Aug 22 17:18:32 1989
  934. ***************
  935. *** 43,49 ****
  936.   extern int strcmp(), strncmp(), strlen();    /* strings.h */
  937.   #endif                    /* A_STABLE_WORLD */
  938.   extern char *strcpy(), *strcat(), *strncpy(), *strncat();    /* strings.h */
  939. ! extern char *index(), *rindex();    /* strings.h */
  940.   extern char *memcpy();            /* memory.h */
  941.   
  942.   #ifdef A_STABLE_WORLD
  943. --- 43,49 ----
  944.   extern int strcmp(), strncmp(), strlen();    /* strings.h */
  945.   #endif                    /* A_STABLE_WORLD */
  946.   extern char *strcpy(), *strcat(), *strncpy(), *strncat();    /* strings.h */
  947. ! extern char *strchr(), *strrchr();    /* strings.h */
  948.   extern char *memcpy();            /* memory.h */
  949.   
  950.   #ifdef A_STABLE_WORLD
  951.  
  952. *** cnpatch/tmp.file    Thu Aug 24 15:39:46 1989
  953. --- h/news.h    Thu Aug 24 14:57:07 1989
  954. ***************
  955. *** 32,38 ****
  956.   
  957.   /* fundamental constants of the implementation */
  958.   #define SMALLMEM    /* qqq for PDP-11s, PDP-8s, IBM PCs, etc. */
  959. ! #define    FASTINDEX    /* qqq if string functions are very fast */
  960.   
  961.   /* automatic configuration */
  962.   #ifdef pdp11
  963. --- 32,38 ----
  964.   
  965.   /* fundamental constants of the implementation */
  966.   #define SMALLMEM    /* qqq for PDP-11s, PDP-8s, IBM PCs, etc. */
  967. ! #define    FASTSTRCHR    /* qqq if string functions are very fast */
  968.   
  969.   /* automatic configuration */
  970.   #ifdef pdp11
  971. ***************
  972. *** 71,81 ****
  973.   /* STREQN is an optimised strncmp(a,b,n)==0; assumes n > 0 */
  974.   #define STREQN(a, b, n) ((a)[0] == (b)[0] && strncmp(a, b, n) == 0)
  975.   #define STRLEN(s) (sizeof (s) - 1)    /* s must be a char array */
  976. ! #ifdef FASTINDEX
  977. ! #define INDEX(src, chr, dest) (dest) = index(src, chr)
  978. ! extern char *index();
  979.   #else
  980. ! #define INDEX(src, chr, dest) \
  981.       for ((dest) = (src); *(dest) != '\0' && *(dest) != (chr); ++(dest)) \
  982.           ; \
  983.       if (*(dest) == '\0') \
  984. --- 71,81 ----
  985.   /* STREQN is an optimised strncmp(a,b,n)==0; assumes n > 0 */
  986.   #define STREQN(a, b, n) ((a)[0] == (b)[0] && strncmp(a, b, n) == 0)
  987.   #define STRLEN(s) (sizeof (s) - 1)    /* s must be a char array */
  988. ! #ifdef FASTSTRCHR
  989. ! #define STRCHR(src, chr, dest) (dest) = strchr(src, chr)
  990. ! extern char *strchr();
  991.   #else
  992. ! #define STRCHR(src, chr, dest) \
  993.       for ((dest) = (src); *(dest) != '\0' && *(dest) != (chr); ++(dest)) \
  994.           ; \
  995.       if (*(dest) == '\0') \
  996.  
  997. *** cnpatch/tmp.file    Thu Aug 24 15:39:49 1989
  998. --- input/Makefile    Tue Aug 22 16:58:34 1989
  999. ***************
  1000. *** 9,15 ****
  1001.   COPTS = -O
  1002.   CFLAGS = $(COPTS) $(DEFINES) -I../include
  1003.   LINTFLAGS = $(DEFINES) -I../include -ha
  1004. - LDFLAGS = $(CFLAGS)
  1005.   LIBS= ../libcnews.a
  1006.   BATCH = ../batch
  1007.   THEMBIN = newsrun newsrunning c7decode bdecode recenews recpnews rnews
  1008. --- 9,14 ----
  1009. ***************
  1010. *** 45,57 ****
  1011.       : nothing
  1012.   
  1013.   newsspool: newsspool.o $(LIBS)
  1014. !     $(CC) $(LDFLAGS) newsspool.o $(PRE) $(LIBS) $(POST) -o $@
  1015.   
  1016.   c7decode: c7decode.o $(LIBS)
  1017. !     $(CC) $(LDFLAGS) c7decode.o $(PRE) $(LIBS) $(POST) -o $@
  1018.   
  1019.   bdecode: bdecode.o $(BATCH)/crctab.o $(LIBS)
  1020. !     $(CC) $(LDFLAGS) bdecode.o $(BATCH)/crctab.o $(PRE) $(LIBS) $(POST) -o $@
  1021.   
  1022.   $(BATCH)/crctab.o:    $(BATCH)/crctab.c
  1023.       ( cd $(BATCH) ; make crctab.o )
  1024. --- 44,56 ----
  1025.       : nothing
  1026.   
  1027.   newsspool: newsspool.o $(LIBS)
  1028. !     $(CC) $(CFLAGS) $(LDFLAGS) newsspool.o $(PRE) $(LIBS) $(POST) -o $@
  1029.   
  1030.   c7decode: c7decode.o $(LIBS)
  1031. !     $(CC) $(CFLAGS) $(LDFLAGS) c7decode.o $(PRE) $(LIBS) $(POST) -o $@
  1032.   
  1033.   bdecode: bdecode.o $(BATCH)/crctab.o $(LIBS)
  1034. !     $(CC) $(CFLAGS) $(LDFLAGS) bdecode.o $(BATCH)/crctab.o $(PRE) $(LIBS) $(POST) -o $@
  1035.   
  1036.   $(BATCH)/crctab.o:    $(BATCH)/crctab.c
  1037.       ( cd $(BATCH) ; make crctab.o )
  1038.  
  1039. *** cnpatch/tmp.file    Thu Aug 24 15:39:51 1989
  1040. --- input/bdecode.c    Tue Aug 22 17:19:53 1989
  1041. ***************
  1042. *** 17,23 ****
  1043.       long nbytes2;
  1044.       int w, crc2;
  1045.       char buf[512];
  1046. !     extern char *index();
  1047.   
  1048.       myname = argv[0];
  1049.       if (sizeof(word) < 4)
  1050. --- 17,23 ----
  1051.       long nbytes2;
  1052.       int w, crc2;
  1053.       char buf[512];
  1054. !     extern char *strchr();
  1055.   
  1056.       myname = argv[0];
  1057.       if (sizeof(word) < 4)
  1058. ***************
  1059. *** 37,43 ****
  1060.           if (fgets(buf, sizeof buf, fin) == NULL)
  1061.               fatal("Missing header");
  1062.           /* trim trailing blanks (sigh) */
  1063. !         p = index(buf, '\n');
  1064.           if (p == 0)
  1065.               continue;
  1066.           while (*--p == ' ')
  1067. --- 37,43 ----
  1068.           if (fgets(buf, sizeof buf, fin) == NULL)
  1069.               fatal("Missing header");
  1070.           /* trim trailing blanks (sigh) */
  1071. !         p = strchr(buf, '\n');
  1072.           if (p == 0)
  1073.               continue;
  1074.           while (*--p == ' ')
  1075.  
  1076. *** cnpatch/tmp.file    Thu Aug 24 15:39:54 1989
  1077. --- libbig/active.fast.c    Tue Aug 22 17:20:53 1989
  1078. ***************
  1079. *** 109,115 ****
  1080.   
  1081.       if (i < nent)
  1082.           *lnarrp++ = nlp;
  1083. !     while (++i < nent && (nlp = index(nlp, '\n')) != NULL && *++nlp != '\0')
  1084.           *lnarrp++ = nlp;
  1085.       return i;        /* number of addrs stored */
  1086.   }
  1087. --- 109,115 ----
  1088.   
  1089.       if (i < nent)
  1090.           *lnarrp++ = nlp;
  1091. !     while (++i < nent && (nlp = strchr(nlp, '\n')) != NULL && *++nlp != '\0')
  1092.           *lnarrp++ = nlp;
  1093.       return i;        /* number of addrs stored */
  1094.   }
  1095.  
  1096. *** cnpatch/tmp.file    Thu Aug 24 15:40:02 1989
  1097. --- libc/fgetmfs.c    Tue Aug 22 17:21:14 1989
  1098. ***************
  1099. *** 110,116 ****
  1100.       register char *nlp;
  1101.   
  1102.       /* got a whole line: is it to be continued? */
  1103. !     if (incr > 0 && cont && (nlp = rindex(line, '\n')) != NULL &&
  1104.           nlp > line && *--nlp == '\\') {
  1105.           *nlp = '\0';            /* delete "\\\n" */
  1106.           segment = nlp;
  1107. --- 110,116 ----
  1108.       register char *nlp;
  1109.   
  1110.       /* got a whole line: is it to be continued? */
  1111. !     if (incr > 0 && cont && (nlp = strrchr(line, '\n')) != NULL &&
  1112.           nlp > line && *--nlp == '\\') {
  1113.           *nlp = '\0';            /* delete "\\\n" */
  1114.           segment = nlp;
  1115.  
  1116. *** cnpatch/tmp.file    Thu Aug 24 15:40:05 1989
  1117. --- libcnews/Makefile    Wed Aug 23 15:41:29 1989
  1118. ***************
  1119. *** 10,18 ****
  1120.   #RANLIB=:
  1121.   SRCS=complain.c config.c fopenclex.c hostname.c \
  1122.    lock.c ltoza.c ngmatch.c readline.c \
  1123. !  string.c strlower.c strsave.c str3save.c time.c
  1124.   OBJS = complain.o config.o fopenclex.o gethdr.o hostname.o lock.o ltoza.o \
  1125. !     nemalloc.o ngmatch.o str3save.o string.o strlower.o strsave.o time.o
  1126.   # workaround for System V make bug
  1127.   SHELL = /bin/sh
  1128.   
  1129. --- 10,19 ----
  1130.   #RANLIB=:
  1131.   SRCS=complain.c config.c fopenclex.c hostname.c \
  1132.    lock.c ltoza.c ngmatch.c readline.c \
  1133. !  string.c strlower.c strsave.c str3save.c time.c case.c
  1134.   OBJS = complain.o config.o fopenclex.o gethdr.o hostname.o lock.o ltoza.o \
  1135. !     nemalloc.o ngmatch.o str3save.o string.o strlower.o strsave.o time.o \
  1136. !     case.o
  1137.   # workaround for System V make bug
  1138.   SHELL = /bin/sh
  1139.   
  1140.  
  1141. *** cnpatch/tmp.file    Thu Aug 24 15:40:08 1989
  1142. --- libcnews/ngmatch.c    Tue Aug 22 17:29:16 1989
  1143. ***************
  1144. *** 62,68 ****
  1145.       for (ngp = ngs; ngp != NULL; ngp = ngcomma) {
  1146.           register boolean match;
  1147.   
  1148. !         INDEX(ngp, NGSEP, ngcomma);
  1149.           if (ngcomma != NULL)
  1150.               *ngcomma = '\0';    /* will be restored below */
  1151.           match = mpatsmatch(rngpat, ngp); /* try 1 group, n-patterns */
  1152. --- 62,68 ----
  1153.       for (ngp = ngs; ngp != NULL; ngp = ngcomma) {
  1154.           register boolean match;
  1155.   
  1156. !         STRCHR(ngp, NGSEP, ngcomma);
  1157.           if (ngcomma != NULL)
  1158.               *ngcomma = '\0';    /* will be restored below */
  1159.           match = mpatsmatch(rngpat, ngp); /* try 1 group, n-patterns */
  1160. ***************
  1161. *** 92,98 ****
  1162.           (void) fprintf(stderr, "mpatsmatch(`%s', `%s')\n", ngpat, grp);
  1163.       for (patp = ngpat; patp != NULL; patp = patcomma) {
  1164.           negation = NO;
  1165. !         INDEX(patp, NGSEP, patcomma);
  1166.           if (patcomma != NULL)
  1167.               *patcomma = '\0';    /* will be restored below */
  1168.           if (*patp == NGNEG) {
  1169. --- 92,98 ----
  1170.           (void) fprintf(stderr, "mpatsmatch(`%s', `%s')\n", ngpat, grp);
  1171.       for (patp = ngpat; patp != NULL; patp = patcomma) {
  1172.           negation = NO;
  1173. !         STRCHR(patp, NGSEP, patcomma);
  1174.           if (patcomma != NULL)
  1175.               *patcomma = '\0';    /* will be restored below */
  1176.           if (*patp == NGNEG) {
  1177. ***************
  1178. *** 141,150 ****
  1179.           register boolean match;
  1180.   
  1181.               /* null-terminate words */
  1182. !             INDEX(patwd, NGDELIM, patdot);
  1183.           if (patdot != NULL)
  1184.               *patdot = '\0';        /* will be restored below */
  1185. !             INDEX(grwd, NGDELIM, grdot);
  1186.           if (grdot != NULL)
  1187.               *grdot = '\0';        /* will be restored below */
  1188.   
  1189. --- 141,150 ----
  1190.           register boolean match;
  1191.   
  1192.               /* null-terminate words */
  1193. !             STRCHR(patwd, NGDELIM, patdot);
  1194.           if (patdot != NULL)
  1195.               *patdot = '\0';        /* will be restored below */
  1196. !             STRCHR(grwd, NGDELIM, grdot);
  1197.           if (grdot != NULL)
  1198.               *grdot = '\0';        /* will be restored below */
  1199.   
  1200. ***************
  1201. *** 197,203 ****
  1202.   {
  1203.       register char *nextng;
  1204.   
  1205. !     INDEX(ngs, NGSEP, nextng);
  1206.       if (nextng == NULL)        /* no groups left */
  1207.           return YES;
  1208.       ++nextng;            /* skip NGSEP */
  1209. --- 197,203 ----
  1210.   {
  1211.       register char *nextng;
  1212.   
  1213. !     STRCHR(ngs, NGSEP, nextng);
  1214.       if (nextng == NULL)        /* no groups left */
  1215.           return YES;
  1216.       ++nextng;            /* skip NGSEP */
  1217.  
  1218. *** cnpatch/tmp.file    Thu Aug 24 15:40:10 1989
  1219. --- libcnews/string.c    Tue Aug 22 17:29:39 1989
  1220. ***************
  1221. *** 40,46 ****
  1222.   {
  1223.       register char *nl;
  1224.   
  1225. !     INDEX(s, '\n', nl);
  1226.       if (nl != NULL)
  1227.           *nl = '\0';
  1228.   }
  1229. --- 40,46 ----
  1230.   {
  1231.       register char *nl;
  1232.   
  1233. !     STRCHR(s, '\n', nl);
  1234.       if (nl != NULL)
  1235.           *nl = '\0';
  1236.   }
  1237. ***************
  1238. *** 61,67 ****
  1239.   {
  1240.       register char *endp, *copy;
  1241.   
  1242. !     endp = index(s, c);        /* find interesting part's end of s */
  1243.       if (endp != NULL)
  1244.           *endp = '\0';        /* restored below */
  1245.       copy = strsave(s);        /* copy interesting substring of s */
  1246. --- 61,67 ----
  1247.   {
  1248.       register char *endp, *copy;
  1249.   
  1250. !     endp = strchr(s, c);        /* find interesting part's end of s */
  1251.       if (endp != NULL)
  1252.           *endp = '\0';        /* restored below */
  1253.       copy = strsave(s);        /* copy interesting substring of s */
  1254. ***************
  1255. *** 78,84 ****
  1256.       register int count = 0;
  1257.   
  1258.   #ifdef CLASSY
  1259. !     for (; (s = index(s, c)) != NULL; s = (s == NULL? NULL: s+1))
  1260.           ++count;
  1261.   #else
  1262.       while (*s != '\0')
  1263. --- 78,84 ----
  1264.       register int count = 0;
  1265.   
  1266.   #ifdef CLASSY
  1267. !     for (; (s = strchr(s, c)) != NULL; s = (s == NULL? NULL: s+1))
  1268.           ++count;
  1269.   #else
  1270.       while (*s != '\0')
  1271. ***************
  1272. *** 216,224 ****
  1273.           *lastdelim = '\0';        /* omit user's name */
  1274.   
  1275.       if (approved != NULL) {            /* moderated article */
  1276. !         site = index(approved, '@');
  1277.           if (site == NULL)
  1278. !             site = index(nullify(sender), '@');
  1279.       }
  1280.       if (site != NULL) {
  1281.           p = findhost(site+1, newpath);
  1282. --- 216,224 ----
  1283.           *lastdelim = '\0';        /* omit user's name */
  1284.   
  1285.       if (approved != NULL) {            /* moderated article */
  1286. !         site = strchr(approved, '@');
  1287.           if (site == NULL)
  1288. !             site = strchr(nullify(sender), '@');
  1289.       }
  1290.       if (site != NULL) {
  1291.           p = findhost(site+1, newpath);
  1292.  
  1293. *** cnpatch/tmp.file    Thu Aug 24 15:40:12 1989
  1294. --- libfake/Makefile    Wed Aug 23 15:49:49 1989
  1295. ***************
  1296. *** 4,11 ****
  1297.   # workaround for System V make bug
  1298.   SHELL = /bin/sh
  1299.   
  1300. ! ALL = dbm.o fsync.o getopt.o index.o ldiv.o memchr.o memcmp.o memcpy.o \
  1301. ! memset.o mkdir.o putenv.o rindex.o strchr.o strcspn.o strpbrk.o strrchr.o \
  1302.   strspn.o strtok.o symlink.o
  1303.   
  1304.   # beware -- build knows about NEEDED
  1305. --- 4,11 ----
  1306.   # workaround for System V make bug
  1307.   SHELL = /bin/sh
  1308.   
  1309. ! ALL = dbm.o fsync.o getopt.o ldiv.o memchr.o memcmp.o memcpy.o \
  1310. ! memset.o mkdir.o putenv.o strchr.o strcspn.o strpbrk.o strrchr.o \
  1311.   strspn.o strtok.o symlink.o
  1312.   
  1313.   # beware -- build knows about NEEDED
  1314.  
  1315. *** cnpatch/tmp.file    Thu Aug 24 15:40:14 1989
  1316. --- libfake/getopt.c    Tue Aug 22 17:22:05 1989
  1317. ***************
  1318. *** 9,15 ****
  1319.   
  1320.   static char    *scan = NULL;    /* Private scan pointer. */
  1321.   
  1322. ! extern char    *index();
  1323.   
  1324.   int
  1325.   getopt(argc, argv, optstring)
  1326. --- 9,15 ----
  1327.   
  1328.   static char    *scan = NULL;    /* Private scan pointer. */
  1329.   
  1330. ! extern char    *strchr();
  1331.   
  1332.   int
  1333.   getopt(argc, argv, optstring)
  1334. ***************
  1335. *** 38,44 ****
  1336.       }
  1337.   
  1338.       c = *scan++;
  1339. !     place = index(optstring, c);
  1340.   
  1341.       if (place == NULL || c == ':') {
  1342.           fprintf(stderr, "%s: unknown option -%c\n", argv[0], c);
  1343. --- 38,44 ----
  1344.       }
  1345.   
  1346.       c = *scan++;
  1347. !     place = strchr(optstring, c);
  1348.   
  1349.       if (place == NULL || c == ':') {
  1350.           fprintf(stderr, "%s: unknown option -%c\n", argv[0], c);
  1351.  
  1352. *** cnpatch/tmp.file    Thu Aug 24 15:40:27 1989
  1353. --- libstdio/Makefile    Tue Aug 22 16:59:48 1989
  1354. ***************
  1355. *** 31,40 ****
  1356.   
  1357.   stdiock.stock: stdiock.o $(LIBS)
  1358.       : search -lc before libcnews.a to get stock stdio
  1359. !     $(CC) $(CFLAGS) stdiock.o $(PRE) -lc $(LIBS) $(POST) -o $@
  1360.   stdiock.fast: stdiock.o $(OBJ) $(LIBS)
  1361.       : load *.o by hand to get tuned stdio
  1362. !     $(CC) $(CFLAGS) stdiock.o $(OBJ) $(PRE) $(LIBS) $(POST) -o $@
  1363.   
  1364.   clean:
  1365.       rm -f *.o stdiock stdiock.fast stdiock.stock junk *mon.out
  1366. --- 31,40 ----
  1367.   
  1368.   stdiock.stock: stdiock.o $(LIBS)
  1369.       : search -lc before libcnews.a to get stock stdio
  1370. !     $(CC) $(CFLAGS) $(LDFLAGS) stdiock.o $(PRE) -lc $(LIBS) $(POST) -o $@
  1371.   stdiock.fast: stdiock.o $(OBJ) $(LIBS)
  1372.       : load *.o by hand to get tuned stdio
  1373. !     $(CC) $(CFLAGS) $(LDFLAGS) stdiock.o $(OBJ) $(PRE) $(LIBS) $(POST) -o $@
  1374.   
  1375.   clean:
  1376.       rm -f *.o stdiock stdiock.fast stdiock.stock junk *mon.out
  1377.  
  1378. *** cnpatch/tmp.file    Thu Aug 24 15:40:39 1989
  1379. --- libv7/getcwd.c    Tue Aug 22 17:23:39 1989
  1380. ***************
  1381. *** 6,12 ****
  1382.   
  1383.   /* imports from libc */
  1384.   extern FILE *popen();
  1385. ! extern char *rindex();
  1386.   
  1387.   char *
  1388.   getcwd(path, size)
  1389. --- 6,12 ----
  1390.   
  1391.   /* imports from libc */
  1392.   extern FILE *popen();
  1393. ! extern char *strrchr();
  1394.   
  1395.   char *
  1396.   getcwd(path, size)
  1397. ***************
  1398. *** 23,29 ****
  1399.           (void) pclose(fp);
  1400.           return 0;
  1401.       }
  1402. !     if ((nlp = rindex(path, '\n')) != NULL)
  1403.           *nlp = '\0';
  1404.       (void) pclose(fp);
  1405.       return path;
  1406. --- 23,29 ----
  1407.           (void) pclose(fp);
  1408.           return 0;
  1409.       }
  1410. !     if ((nlp = strrchr(path, '\n')) != NULL)
  1411.           *nlp = '\0';
  1412.       (void) pclose(fp);
  1413.       return path;
  1414.  
  1415. *** cnpatch/tmp.file    Thu Aug 24 15:40:40 1989
  1416. --- libv7/gethostname.c    Tue Aug 22 17:23:17 1989
  1417. ***************
  1418. *** 6,12 ****
  1419.   #include <stdio.h>
  1420.   
  1421.   /* imports from libc */
  1422. ! extern char *index(), *strncpy();
  1423.   extern FILE *fopen(), *popen();
  1424.   
  1425.   /* forwards */
  1426. --- 6,12 ----
  1427.   #include <stdio.h>
  1428.   
  1429.   /* imports from libc */
  1430. ! extern char *strchr(), *strncpy();
  1431.   extern FILE *fopen(), *popen();
  1432.   
  1433.   /* forwards */
  1434. ***************
  1435. *** 61,67 ****
  1436.   
  1437.           (void) fgets(hostname, size, whoami);
  1438.           (void) pclose(whoami);
  1439. !         if ((ptr = index(hostname, '\n')) != NULL)
  1440.               *ptr = '\0';
  1441.       }
  1442.       if (*hostname != '\0')
  1443. --- 61,67 ----
  1444.   
  1445.           (void) fgets(hostname, size, whoami);
  1446.           (void) pclose(whoami);
  1447. !         if ((ptr = strchr(hostname, '\n')) != NULL)
  1448.               *ptr = '\0';
  1449.       }
  1450.       if (*hostname != '\0')
  1451. ***************
  1452. *** 84,90 ****
  1453.   
  1454.           (void) fgets(hostname, size, whoami);
  1455.           (void) fclose(whoami);
  1456. !         if ((ptr = index(hostname, '\n')) != NULL)
  1457.               *ptr = '\0';
  1458.       }
  1459.   }
  1460. --- 84,90 ----
  1461.   
  1462.           (void) fgets(hostname, size, whoami);
  1463.           (void) fclose(whoami);
  1464. !         if ((ptr = strchr(hostname, '\n')) != NULL)
  1465.               *ptr = '\0';
  1466.       }
  1467.   }
  1468.  
  1469. *** cnpatch/tmp.file    Thu Aug 24 15:40:44 1989
  1470. --- man/expire.8    Wed Aug 23 15:52:01 1989
  1471. ***************
  1472. *** 6,12 ****
  1473.   .ds c /usr/lib/news
  1474.   .\" =()<.ds m @<NEWSMASTER>@>()=
  1475.   .ds m usenet
  1476. ! .TH EXPIRE 8 "5 June 1989" "C News"
  1477.   .SH NAME
  1478.   expire, doexpire \- expire old news
  1479.   .br
  1480. --- 6,12 ----
  1481.   .ds c /usr/lib/news
  1482.   .\" =()<.ds m @<NEWSMASTER>@>()=
  1483.   .ds m usenet
  1484. ! .TH EXPIRE 8 "23 Aug 1989" "C News"
  1485.   .SH NAME
  1486.   expire, doexpire \- expire old news
  1487.   .br
  1488. ***************
  1489. *** 40,45 ****
  1490. --- 40,47 ----
  1491.   .B \-v
  1492.   ] [
  1493.   .B \-d
  1494. + ] [
  1495. + .B \-r
  1496.   ]
  1497.   [ controlfile ]
  1498.   .br
  1499. ***************
  1500. *** 69,75 ****
  1501.   operations are controlled by a control file
  1502.   (which can be named or supplied on standard input),
  1503.   which is not optional\(emthere is no default behavior.
  1504. ! Each line of the control file should have four white-space-separated
  1505.   fields, as follows.
  1506.   .PP
  1507.   The first field is one or more newsgroups,
  1508. --- 71,79 ----
  1509.   operations are controlled by a control file
  1510.   (which can be named or supplied on standard input),
  1511.   which is not optional\(emthere is no default behavior.
  1512. ! Each line of the control file
  1513. ! (except for empty lines and lines starting with `#', which are ignored)
  1514. ! should have four white-space-separated
  1515.   fields, as follows.
  1516.   .PP
  1517.   The first field is one or more newsgroups,
  1518. ***************
  1519. *** 179,184 ****
  1520. --- 183,195 ----
  1521.   its line, to be expired only after all others have expired.
  1522.   (Meant for use on obnoxious systems like VMS which don't support real links.)
  1523.   .TP
  1524. + .BR \-r
  1525. + suppress \fIhistory\fR rebuild.
  1526. + Mostly for emergencies.
  1527. + (This leaves the \fIhistory\fR file out of date and larger than necessary,
  1528. + but improves speed and eliminates the need for several megabytes of
  1529. + temporary storage.)
  1530. + .TP
  1531.   .BR \-v
  1532.   verbose:
  1533.   report some statistics after termination.
  1534. ***************
  1535. *** 204,209 ****
  1536. --- 215,223 ----
  1537.   \fI\*c/explist\fR as the control file,
  1538.   and reports any difficulties by sending mail to \fI\*m\fR.
  1539.   This is usually better than just running \fIexpire\fR directly.
  1540. + If space is adequate for archiving but persistently inadequate for the
  1541. + temporaries needed for history rebuilding, \fIdoexpire\fR reports this
  1542. + and invokes \fIexpire\fR with the \fB\-r\fR option.
  1543.   .PP
  1544.   .I Mkhistory
  1545.   rebuilds the \fIhistory\fR file and its auxiliaries to match the articles
  1546.  
  1547. *** cnpatch/tmp.file    Thu Aug 24 15:40:51 1989
  1548. --- misc/Makefile    Tue Aug 22 17:00:36 1989
  1549. ***************
  1550. *** 34,49 ****
  1551.       : nothing
  1552.   
  1553.   gngp:    gngp.o $(LIBS)
  1554. !     $(CC) $(CFLAGS) gngp.o $(PRE) $(LIBS) $(POST) -o $@
  1555.   
  1556.   ctime:    ctime.o $(LIBS)
  1557. !     $(CC) $(CFLAGS) ctime.o $(PRE) $(LIBS) $(POST) -o $@
  1558.   
  1559.   getdate:    getdate.o $(LIBS)
  1560. !     $(CC) $(CFLAGS) getdate.o $(PRE) $(LIBS) $(POST) -o $@
  1561.   
  1562.   newslock:    newslock.o $(LIBS)
  1563. !     $(CC) $(CFLAGS) newslock.o $(PRE) $(LIBS) $(POST) -o $@
  1564.   
  1565.   NHCFLAGS = -I$(RN) $(CFLAGS)
  1566.   RNEWSOBJS = $(RN)/history.o $(RN)/article.o $(RN)/hdrcommon.o \
  1567. --- 34,49 ----
  1568.       : nothing
  1569.   
  1570.   gngp:    gngp.o $(LIBS)
  1571. !     $(CC) $(CFLAGS) $(LDFLAGS) gngp.o $(PRE) $(LIBS) $(POST) -o $@
  1572.   
  1573.   ctime:    ctime.o $(LIBS)
  1574. !     $(CC) $(CFLAGS) $(LDFLAGS) ctime.o $(PRE) $(LIBS) $(POST) -o $@
  1575.   
  1576.   getdate:    getdate.o $(LIBS)
  1577. !     $(CC) $(CFLAGS) $(LDFLAGS) getdate.o $(PRE) $(LIBS) $(POST) -o $@
  1578.   
  1579.   newslock:    newslock.o $(LIBS)
  1580. !     $(CC) $(CFLAGS) $(LDFLAGS) newslock.o $(PRE) $(LIBS) $(POST) -o $@
  1581.   
  1582.   NHCFLAGS = -I$(RN) $(CFLAGS)
  1583.   RNEWSOBJS = $(RN)/history.o $(RN)/article.o $(RN)/hdrcommon.o \
  1584. ***************
  1585. *** 50,56 ****
  1586.    $(RN)/io.o $(RN)/msgs.o
  1587.   NHLIBS = $(LIBS) $(DBM)
  1588.   newshist:    newshist.o $(RNEWSOBJS) $(LIBS)
  1589. !     $(CC) $(NHCFLAGS) newshist.o $(RNEWSOBJS) $(PRE) $(NHLIBS) $(POST) -o $@
  1590.   
  1591.   newshist.o:    newshist.c
  1592.       $(CC) $(NHCFLAGS) -c newshist.c
  1593. --- 50,56 ----
  1594.    $(RN)/io.o $(RN)/msgs.o
  1595.   NHLIBS = $(LIBS) $(DBM)
  1596.   newshist:    newshist.o $(RNEWSOBJS) $(LIBS)
  1597. !     $(CC) $(NHCFLAGS) $(LDFLAGS) newshist.o $(RNEWSOBJS) $(PRE) $(NHLIBS) $(POST) -o $@
  1598.   
  1599.   newshist.o:    newshist.c
  1600.       $(CC) $(NHCFLAGS) -c newshist.c
  1601.  
  1602. *** cnpatch/tmp.file    Thu Aug 24 15:41:18 1989
  1603. --- relay/active.c    Tue Aug 22 17:23:57 1989
  1604. ***************
  1605. *** 165,171 ****
  1606.       register boolean result = NO;
  1607.   
  1608.       for (ng = ngs; !result && ng != NULL; ng = newng) {
  1609. !         newng = index(ng, NGSEP);
  1610.           if (newng != NULL)
  1611.               *newng = '\0';        /* restored below */
  1612.   
  1613. --- 165,171 ----
  1614.       register boolean result = NO;
  1615.   
  1616.       for (ng = ngs; !result && ng != NULL; ng = newng) {
  1617. !         newng = strchr(ng, NGSEP);
  1618.           if (newng != NULL)
  1619.               *newng = '\0';        /* restored below */
  1620.   
  1621. ***************
  1622. *** 187,193 ****
  1623.       register int field;
  1624.   
  1625.       for (field = 1; ngline != NULL && field < fieldno; ++field) {
  1626. !         ngline = index(ngline, ' ');
  1627.           if (ngline != NULL)
  1628.               ngline++;        /* point at next field */
  1629.       }
  1630. --- 187,193 ----
  1631.       register int field;
  1632.   
  1633.       for (field = 1; ngline != NULL && field < fieldno; ++field) {
  1634. !         ngline = strchr(ngline, ' ');
  1635.           if (ngline != NULL)
  1636.               ngline++;        /* point at next field */
  1637.       }
  1638.  
  1639. *** cnpatch/tmp.file    Thu Aug 24 15:41:36 1989
  1640. --- relay/control.c    Tue Aug 22 17:24:14 1989
  1641. ***************
  1642. *** 109,115 ****
  1643.           if (STREQN(s, "..", STRLEN("..")))
  1644.               return NO;
  1645.       for (s = SHELLMETAS; *s != '\0'; s++)
  1646. !         if (index(cmd, *s) != NULL)
  1647.               return NO;
  1648.       return YES;
  1649.   }
  1650. --- 109,115 ----
  1651.           if (STREQN(s, "..", STRLEN("..")))
  1652.               return NO;
  1653.       for (s = SHELLMETAS; *s != '\0'; s++)
  1654. !         if (strchr(cmd, *s) != NULL)
  1655.               return NO;
  1656.       return YES;
  1657.   }
  1658.  
  1659. *** cnpatch/tmp.file    Thu Aug 24 15:41:40 1989
  1660. --- relay/fileart.c    Tue Aug 22 17:24:32 1989
  1661. ***************
  1662. *** 103,109 ****
  1663.           "%s: mklinks called with ST_REFUSED set (can't happen)\n",
  1664.               progname);
  1665.       for (; ngs != NULL; ngs = comma) {
  1666. !         comma = index(ngs, NGSEP);
  1667.           if (comma != NULL)
  1668.               *comma = '\0';        /* will be restored below */
  1669.           ng = realngname(ngs);
  1670. --- 103,109 ----
  1671.           "%s: mklinks called with ST_REFUSED set (can't happen)\n",
  1672.               progname);
  1673.       for (; ngs != NULL; ngs = comma) {
  1674. !         comma = strchr(ngs, NGSEP);
  1675.           if (comma != NULL)
  1676.               *comma = '\0';        /* will be restored below */
  1677.           ng = realngname(ngs);
  1678.  
  1679. *** cnpatch/tmp.file    Thu Aug 24 15:41:42 1989
  1680. --- relay/hdrint.h    Tue Aug 22 16:34:22 1989
  1681. ***************
  1682. *** 19,27 ****
  1683.   #ifndef DEFDIST
  1684.   #define DEFDIST "world"        /* default Distribution: */
  1685.   #endif
  1686. ! #ifndef DEFMSGID
  1687. ! #define DEFMSGID "<message-id@absent>"
  1688. ! #endif
  1689.   
  1690.   #define JUNK "junk"
  1691.   #define ALL "all"
  1692. --- 19,25 ----
  1693.   #ifndef DEFDIST
  1694.   #define DEFDIST "world"        /* default Distribution: */
  1695.   #endif
  1696. ! #define DEFMSGID ""        /* must be empty string or contain whitespace */
  1697.   
  1698.   #define JUNK "junk"
  1699.   #define ALL "all"
  1700.  
  1701. *** cnpatch/tmp.file    Thu Aug 24 15:41:43 1989
  1702. --- relay/hdrmunge.c    Tue Aug 22 17:24:57 1989
  1703. ***************
  1704. *** 60,66 ****
  1705.       if (!art->a_xref) {
  1706.           art->a_xref = YES;
  1707.           xrefs = strsave(art->a_files);
  1708. !         for (slashp = xrefs; (slashp = index(slashp, FNDELIM)) != NULL; )
  1709.               *slashp++ = ':';
  1710.           if (fprintf(art->a_artf, "%s %s %s\n",
  1711.               xrefhdr.hdrnm, hostname(), xrefs) == EOF)
  1712. --- 60,66 ----
  1713.       if (!art->a_xref) {
  1714.           art->a_xref = YES;
  1715.           xrefs = strsave(art->a_files);
  1716. !         for (slashp = xrefs; (slashp = strchr(slashp, FNDELIM)) != NULL; )
  1717.               *slashp++ = ':';
  1718.           if (fprintf(art->a_artf, "%s %s %s\n",
  1719.               xrefhdr.hdrnm, hostname(), xrefs) == EOF)
  1720.  
  1721. *** cnpatch/tmp.file    Thu Aug 24 15:41:45 1989
  1722. --- relay/history.c    Tue Aug 22 17:25:14 1989
  1723. ***************
  1724. *** 151,161 ****
  1725.   
  1726.       trim(histent);
  1727.       /* find start of 2nd field (arrival~expiry) */
  1728. !     tabp = index(histent, FIELDSEP);
  1729.       if (tabp == NULL)
  1730.           return NULL;                /* mangled entry */
  1731.       /* find start of 3rd field (files list) */
  1732. !     else if ((tabp = index(tabp + 1, FIELDSEP)) == NULL)
  1733.           return NULL;            /* cancelled or expired art. */
  1734.       else
  1735.           return tabp + 1;
  1736. --- 151,161 ----
  1737.   
  1738.       trim(histent);
  1739.       /* find start of 2nd field (arrival~expiry) */
  1740. !     tabp = strchr(histent, FIELDSEP);
  1741.       if (tabp == NULL)
  1742.           return NULL;                /* mangled entry */
  1743.       /* find start of 3rd field (files list) */
  1744. !     else if ((tabp = strchr(tabp + 1, FIELDSEP)) == NULL)
  1745.           return NULL;            /* cancelled or expired art. */
  1746.       else
  1747.           return tabp + 1;
  1748.  
  1749. *** cnpatch/tmp.file    Thu Aug 24 15:41:47 1989
  1750. --- relay/ihave.c    Tue Aug 22 17:25:31 1989
  1751. ***************
  1752. *** 79,85 ****
  1753.       argscp = strsave(argscp);
  1754.   
  1755.       /* dig out the remote system name */
  1756. !     remotesys = rindex(argscp, ' ');    
  1757.       if (remotesys == NULL)            /* no msg-ids in command */
  1758.           remotesys = argscp;
  1759.       else {
  1760. --- 79,85 ----
  1761.       argscp = strsave(argscp);
  1762.   
  1763.       /* dig out the remote system name */
  1764. !     remotesys = strrchr(argscp, ' ');    
  1765.       if (remotesys == NULL)            /* no msg-ids in command */
  1766.           remotesys = argscp;
  1767.       else {
  1768. ***************
  1769. *** 86,92 ****
  1770.           remotesys = argscp + strlen(argscp) - 1;    /* last byte */
  1771.           while (isascii(*remotesys) && isspace(*remotesys))
  1772.               *remotesys-- = '\0';    /* back up to non-whitespace */
  1773. !         remotesys = rindex(argscp, ' ');
  1774.           if (remotesys == NULL)        /* no msg-ids in command */
  1775.               remotesys = argscp;
  1776.           else
  1777. --- 86,92 ----
  1778.           remotesys = argscp + strlen(argscp) - 1;    /* last byte */
  1779.           while (isascii(*remotesys) && isspace(*remotesys))
  1780.               *remotesys-- = '\0';    /* back up to non-whitespace */
  1781. !         remotesys = strrchr(argscp, ' ');
  1782.           if (remotesys == NULL)        /* no msg-ids in command */
  1783.               remotesys = argscp;
  1784.           else
  1785.  
  1786. *** cnpatch/tmp.file    Thu Aug 24 15:41:50 1989
  1787. --- relay/makefile    Tue Aug 22 17:01:06 1989
  1788. ***************
  1789. *** 54,60 ****
  1790.       sed '/mkfile/d' makefile | mkconv | sed 's/make/mk/g' >$@
  1791.   
  1792.   relaynews: $(OBJ) $(LIBOBJS)
  1793. !     $(CC) $(CFLAGS) $(OBJ) $(PRE) $(LIBS) $(LIBOBJS) $(POST) -o $@
  1794.   lint: $(SRC)
  1795.       $(LINT) $(LINTFLAGS) $(SRC) $(LLIBS) | $(LINTFILT)
  1796.   lint-p: $(SRC)
  1797. --- 54,60 ----
  1798.       sed '/mkfile/d' makefile | mkconv | sed 's/make/mk/g' >$@
  1799.   
  1800.   relaynews: $(OBJ) $(LIBOBJS)
  1801. !     $(CC) $(CFLAGS) $(LDFLAGS) $(OBJ) $(PRE) $(LIBS) $(LIBOBJS) $(POST) -o $@
  1802.   lint: $(SRC)
  1803.       $(LINT) $(LINTFLAGS) $(SRC) $(LLIBS) | $(LINTFILT)
  1804.   lint-p: $(SRC)
  1805.  
  1806. *** cnpatch/tmp.file    Thu Aug 24 15:41:52 1989
  1807. --- relay/procart.c    Tue Aug 22 17:25:43 1989
  1808. ***************
  1809. *** 296,301 ****
  1810. --- 296,308 ----
  1811.       if (art->h.h_path == NULL) {
  1812.           prefuse(art);
  1813.           (void) printf("no Path: header\n");
  1814. +     } else if (art->h.h_msgid == NULL || art->h.h_msgid[0] == '\0') {
  1815. +         prefuse(art);
  1816. +         (void) printf("missing Message-ID\n");
  1817. +     } else if (strchr(art->h.h_msgid, ' ') != NULL ||
  1818. +        strchr(art->h.h_msgid, '\t') != NULL) {
  1819. +         prefuse(art);
  1820. +         (void) printf("whitespace in Message-ID\n");
  1821.       } else if (alreadyseen(art->h.h_msgid)) {
  1822.           prefuse(art);
  1823.           (void) printf("duplicate\n");
  1824. ***************
  1825. *** 380,386 ****
  1826.       /* this is a deadly tedious job and I really should automate it */
  1827.       for (arts = filelist; arts != NULL && arts[0] != '\0';
  1828.            arts = (spacep == NULL? NULL: spacep+1)) {
  1829. !         spacep = index(arts, ' ');
  1830.           if (spacep != NULL)
  1831.               spacep[0] = '\0';    /* will be restored below */
  1832.           artnm = strsave(arts);
  1833. --- 387,393 ----
  1834.       /* this is a deadly tedious job and I really should automate it */
  1835.       for (arts = filelist; arts != NULL && arts[0] != '\0';
  1836.            arts = (spacep == NULL? NULL: spacep+1)) {
  1837. !         spacep = strchr(arts, ' ');
  1838.           if (spacep != NULL)
  1839.               spacep[0] = '\0';    /* will be restored below */
  1840.           artnm = strsave(arts);
  1841. ***************
  1842. *** 387,393 ****
  1843.           if (spacep != NULL)
  1844.               spacep[0] = ' ';    /* restore space */
  1845.   
  1846. !         slashp = index(artnm, FNDELIM);
  1847.           if (slashp != NULL)
  1848.               slashp[0] = '\0';    /* will be restored below */
  1849.           if (artret)
  1850. --- 394,400 ----
  1851.           if (spacep != NULL)
  1852.               spacep[0] = ' ';    /* restore space */
  1853.   
  1854. !         slashp = strchr(artnm, FNDELIM);
  1855.           if (slashp != NULL)
  1856.               slashp[0] = '\0';    /* will be restored below */
  1857.           if (artret)
  1858.  
  1859. *** cnpatch/tmp.file    Thu Aug 24 15:42:22 1989
  1860. --- relay/sys.c    Tue Aug 22 17:29:50 1989
  1861. ***************
  1862. *** 231,237 ****
  1863.   {
  1864.       register char *colon;
  1865.   
  1866. !     INDEX(line, ':', colon);
  1867.       if (colon != NULL)
  1868.           *colon++ = '\0';
  1869.       return colon;
  1870. --- 231,237 ----
  1871.   {
  1872.       register char *colon;
  1873.   
  1874. !     STRCHR(line, ':', colon);
  1875.       if (colon != NULL)
  1876.           *colon++ = '\0';
  1877.       return colon;
  1878. ***************
  1879. *** 247,253 ****
  1880.   char *field;
  1881.   int delim;
  1882.   {
  1883. !     register char *delimp = index(field, delim);
  1884.   
  1885.       if (delimp != NULL)
  1886.           *delimp++ = '\0';
  1887. --- 247,253 ----
  1888.   char *field;
  1889.   int delim;
  1890.   {
  1891. !     register char *delimp = strchr(field, delim);
  1892.   
  1893.       if (delimp != NULL)
  1894.           *delimp++ = '\0';
  1895.  
  1896. *** cnpatch/tmp.file    Thu Aug 24 15:42:26 1989
  1897. --- relay/transmit.c    Tue Aug 22 17:24:44 1989
  1898. ***************
  1899. *** 187,193 ****
  1900.       (void) strcat(cmd, ";<");
  1901.       (void) strcat(cmd, filename);
  1902.       (void) strcat(cmd, " (");
  1903. !     percent = index(syscmd, '%');
  1904.       if (percent == NULL)
  1905.           (void) strcat(cmd, syscmd);
  1906.       else {
  1907. --- 187,193 ----
  1908.       (void) strcat(cmd, ";<");
  1909.       (void) strcat(cmd, filename);
  1910.       (void) strcat(cmd, " (");
  1911. !     percent = strchr(syscmd, '%');
  1912.       if (percent == NULL)
  1913.           (void) strcat(cmd, syscmd);
  1914.       else {
  1915. ***************
  1916. *** 194,200 ****
  1917.           char *pcent2;
  1918.   
  1919.           ++percent;
  1920. !         pcent2 = index(percent, '%');
  1921.           if (pcent2 != NULL) {
  1922.               art->a_status |= ST_DROPPED;
  1923.               (void) fprintf(stderr, "%s: `%s' contains two %%'s\n",
  1924. --- 194,200 ----
  1925.           char *pcent2;
  1926.   
  1927.           ++percent;
  1928. !         pcent2 = strchr(percent, '%');
  1929.           if (pcent2 != NULL) {
  1930.               art->a_status |= ST_DROPPED;
  1931.               (void) fprintf(stderr, "%s: `%s' contains two %%'s\n",
  1932.  
  1933. *** cnpatch/tmp.file    Thu Aug 24 15:42:43 1989
  1934. --- rna/makefile    Tue Aug 22 17:01:43 1989
  1935. ***************
  1936. *** 44,50 ****
  1937.       : warning, defs.h may not be right for your system
  1938.   
  1939.   readnews: $(ROFILES) defs.h $(LIBS)
  1940. !     $(CC) $(CFLAGS) $(ROFILES) $(PRE) $(LIBS) $(POST) -o $@
  1941.   
  1942.   newsinstall:
  1943.       : "install all control files; don't overwrite any!"
  1944. --- 44,50 ----
  1945.       : warning, defs.h may not be right for your system
  1946.   
  1947.   readnews: $(ROFILES) defs.h $(LIBS)
  1948. !     $(CC) $(CFLAGS) $(LDFLAGS) $(ROFILES) $(PRE) $(LIBS) $(POST) -o $@
  1949.   
  1950.   newsinstall:
  1951.       : "install all control files; don't overwrite any!"
  1952.  
  1953. Files that are new:
  1954.  
  1955. new h/case.h (patch can't create, so diff against null):
  1956. Index: h/case.h
  1957. *** cnpatch/tmp.preposterously.long.name.to.make.patch.behave.right    Thu Aug 24 15:38:50 1989
  1958. --- h/case.h    Thu Aug 24 15:37:09 1989
  1959. ***************
  1960. *** 0 ****
  1961. --- 1,5 ----
  1962. + extern int cistrncmp();
  1963. + /* must call the above once before invoking the macro below */
  1964. + extern char casemap[];
  1965. + #define    TOLOW(c)    (casemap[(c)])
  1966.  
  1967. new libcnews/case.c (patch can't create, so diff against null):
  1968. Index: libcnews/case.c
  1969. *** cnpatch/tmp.preposterously.long.name.to.make.patch.behave.right    Thu Aug 24 15:38:50 1989
  1970. --- libcnews/case.c    Thu Aug 24 15:37:42 1989
  1971. ***************
  1972. *** 0 ****
  1973. --- 1,80 ----
  1974. + /*
  1975. +  * case-mapping stuff
  1976. +  *
  1977. +  * We exploit the fact that we are dealing only with headers here, and
  1978. +  * headers are limited to the ASCII characters by RFC822.  It is barely
  1979. +  * possible that we might be dealing with a translation into another
  1980. +  * character set, but in particular it's very difficult for a header
  1981. +  * character to be negative without blowing standard compliance.
  1982. +  */
  1983. + #include <stdio.h>
  1984. + #include "string.h"
  1985. + #include "case.h"
  1986. + #define    MAPSIZE    256        /* overkill for ASCII */
  1987. + char casemap[MAPSIZE];        /* relies on init to '\0' */
  1988. + static int primed = 0;        /* has casemap been set up? */
  1989. + /*
  1990. +  - prime - set up case-mapping stuff
  1991. +  */
  1992. + static void
  1993. + prime()
  1994. + {
  1995. +     register char *lp;
  1996. +     register char *up;
  1997. +     register int c;
  1998. +     static char lower[] = "abcdefghijklmnopqrstuvwxyz";
  1999. +     static char upper[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  2000. +     for (lp = lower, up = upper; *lp != '\0'; lp++, up++) {
  2001. +         c = *lp;
  2002. +         casemap[c] = c;
  2003. +         casemap[*up] = c;
  2004. +     }
  2005. +     for (c = 0; c < MAPSIZE; c++)
  2006. +         if (casemap[c] == '\0')
  2007. +             casemap[c] = c;
  2008. +     primed = 1;
  2009. + }
  2010. + /*
  2011. +  - cistrncmp - case-independent strncmp
  2012. +  */
  2013. + int                /* < == > 0 */
  2014. + cistrncmp(s1, s2, len)
  2015. + char *s1;
  2016. + char *s2;
  2017. + int len;
  2018. + {
  2019. +     register char *p1;
  2020. +     register char *p2;
  2021. +     register int n;
  2022. +     if (!primed)
  2023. +         prime();
  2024. +     p1 = s1;
  2025. +     p2 = s2;
  2026. +     n = len;
  2027. +     while (--n >= 0 && *p1 != '\0' && TOLOW(*p1) == TOLOW(*p2)) {
  2028. +         p1++;
  2029. +         p2++;
  2030. +     }
  2031. +     if (n < 0)
  2032. +         return(0);
  2033. +     /*
  2034. +      * The following case analysis is necessary so that characters
  2035. +      * which look negative collate low against normal characters but
  2036. +      * high against the end-of-string NUL.
  2037. +      */
  2038. +     if (*p1 == '\0' && *p2 == '\0')
  2039. +         return(0);
  2040. +     else if (*p1 == '\0')
  2041. +         return(-1);
  2042. +     else if (*p2 == '\0')
  2043. +         return(1);
  2044. +     else
  2045. +         return(TOLOW(*p1) - TOLOW(*p2));
  2046. + }
  2047.  
  2048.  
  2049. end of patch 24-Aug-1989
  2050. -- 
  2051. V7 /bin/mail source: 554 lines.|     Henry Spencer at U of Toronto Zoology
  2052. 1989 X.400 specs: 2200+ pages. | uunet!attcan!utzoo!henry henry@zoo.toronto.edu
  2053.  
  2054.  
  2055.