home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume7 / 2.11news / patch.13 < prev    next >
Internet Message Format  |  1988-03-03  |  56KB

  1. From rick@seismo.CSS.GOV Mon Nov 23 15:02:37 1987
  2. Path: seismo!rick
  3. From: rick@seismo.CSS.GOV (Rick Adams)
  4. Newsgroups: news.software.b
  5. Subject: news 2.11 src patch #13
  6. Message-ID: <44192@beno.seismo.CSS.GOV>
  7. Date: 23 Nov 87 20:02:37 GMT
  8. Organization: Center for Seismic Studies, Arlington, VA
  9. Lines: 2089
  10.  
  11. Description:
  12.     This is patch 13 of the news sources.  It addresses the following
  13.     problems (p) and includes several new features (f):
  14.  
  15.     (p) - The "H" flag in the sys file was broken some versions ago
  16.     causing parts of the history data to be thrown away before it could
  17.     be effectively used by the use of the flag in the sys file.  This
  18.     code has been corrected.
  19.  
  20.     (f) - Support for NFS client systems which mount LIBDIR and SPOOLDIR
  21.     directories located on a NFS server.
  22.  
  23.     (f) - LIBDIR/moderators lists the name of the moderators that can
  24.     post to a given moderated group locally.  Moderators no longer have
  25.     to remember to include an Approved: header in their messages.
  26.  
  27.     (f) - new MODFILEONLY switch in defs.dist.  Turning this switch on
  28.     causes inews to ignore Approved: headers in locally submitted
  29.     articles.  All local moderators *must* be listed in
  30.     LIBDIR/moderators when this switch is in use.
  31.  
  32.     (f) - The fascist and moderator code will accept groups of users
  33.     (etc/group) as well as a list of users in the LIBDIR/authorized and
  34.     LIBDIR/moderators files, respectively.  Truly a hack - a backslash
  35.     preceding the username signifies a group name instead.
  36.  
  37.     (f) - Bug groups ala M.I.T. mail to BUGS-XXXX bboards.
  38.     LIBDIR/buggroups contains an entry for each newsgroup that defines
  39.     the beginning of a newsgroup hierarchy of "bug" groups.  Posting to
  40.     a non-existent sub-newsgroup under the declared hierarchy causes
  41.     the posting to be sent to the declared newsgroup instead.
  42.  
  43.     (f) - recnews update to take advantage of the -x switch in inews.
  44.     You may now specify that a certain site in the sys file should not
  45.     receive the incoming posting no matter what when gatewaying a mail
  46.     message into the news system.
  47.  
  48. Fix:
  49.     cd to the src directory and apply the following patch.
  50.  
  51. Index: Makefile.dst
  52. Prereq: 1.27
  53. *** .d/Makefile.dst    Wed Nov  4 14:56:12 1987
  54. --- Makefile.dst    Thu Nov 19 16:54:08 1987
  55. ***************
  56. *** 1,2 ****
  57. ! # '@(#)Makefile.dst    1.27    11/4/87'
  58.   # Generic Makefile.
  59. --- 1,2 ----
  60. ! # '@(#)Makefile.dst    1.28    11/19/87'
  61.   # Generic Makefile.
  62. ***************
  63. *** 41,42 ****
  64. --- 41,50 ----
  65.   
  66. + # Order is important here
  67. + INST = full
  68. + #NFSCLIENT INST = nfs
  69. + #NFSCLIENT NFSCLIENT= -DNFSCLIENT
  70. + NFSSPOOLDIR = /nfsnews/$(SPOOLDIR)
  71. + NFSLIBDIR = /nfsnews/$(LIBDIR)
  72.   DEFS =    -DRNEWS=\"$(BINDIR)/rnews\" -DSPOOLDIR=\"$(SPOOLDIR)\" \
  73. ***************
  74. *** 44,46 ****
  75.       -DBINDIR=\"$(BINDIR)\" -DNEWSUSR=\"$(NEWSUSR)\" \
  76. !     -DNEWSGRP=\"$(NEWSGRP)\" ${SERVER}
  77.   
  78. --- 52,54 ----
  79.       -DBINDIR=\"$(BINDIR)\" -DNEWSUSR=\"$(NEWSUSR)\" \
  80. !     -DNEWSGRP=\"$(NEWSGRP)\" ${SERVER} ${NFSCLIENT}
  81.   
  82. ***************
  83. *** 118,120 ****
  84.   SCRIPTS = sendbatch rmgroup checkgroups
  85. ! OTHERS = inews $(UTILS) $(SCRIPTS)
  86.   COMMANDS = readnews checknews postnews vnews
  87. --- 126,129 ----
  88.   SCRIPTS = sendbatch rmgroup checkgroups
  89. ! NFSOTHERS = inews
  90. ! OTHERS = $(NFSOTHERS) $(UTILS) $(SCRIPTS)
  91.   COMMANDS = readnews checknews postnews vnews
  92. ***************
  93. *** 122,126 ****
  94.   # dependencies
  95. ! all: $(P) $(OTHERS) $(COMMANDS)
  96.   
  97. ! install: all help vnews.help installit
  98.       chmod 755 ./installit
  99. --- 131,141 ----
  100.   # dependencies
  101. ! all: $(INST)all
  102.   
  103. ! fullall: $(P) $(OTHERS) $(COMMANDS)
  104. ! nfsall: $(P) $(NFSOTHERS) $(COMMANDS)
  105. ! install: $(INST)install
  106. ! fullinstall: all help vnews.help installit
  107.       chmod 755 ./installit
  108. ***************
  109. *** 149,150 ****
  110. --- 164,179 ----
  111.   
  112. + nfsinstall: nfsall help vnews.help
  113. +     chmod 755 ./installit
  114. +     -test -d $(DESTDIR)$(BINDIR) || mkdir $(DESTDIR)$(BINDIR)
  115. +     -test -d $(DESTDIR)$(LIBDIR) || mkdir $(DESTDIR)$(LIBDIR)
  116. +     for i in $(COMMANDS); do \
  117. +         ./installit -m 755 -o $(NEWSUSR) -g $(NEWSGRP) -s $$i \
  118. +             $(DESTDIR)$(BINDIR); \
  119. +     done
  120. +     cp help vnews.help $(DESTDIR)$(LIBDIR)
  121. +     ./installit -m 6755 -o root -g $(NEWSGRP) -s inews \
  122. +         $(DESTDIR)$(LIBDIR)
  123. +     -rm -f $(DESTDIR)$(BINDIR)/rnews
  124. + #VMS     vms -v @euninstal
  125.   defs.h:    defs.dist localize.sh Makefile.dst Makefile
  126. ***************
  127. *** 159,161 ****
  128.   
  129. ! update: install.sh makeactive.sh
  130.       sh install.sh $(SPOOLDIR) $(LIBDIR) $(BINDIR) $(NEWSUSR) $(NEWSGRP) $(OSTYPE)
  131. --- 188,192 ----
  132.   
  133. ! update: $(INST)update
  134. ! fullupdate: install.sh makeactive.sh
  135.       sh install.sh $(SPOOLDIR) $(LIBDIR) $(BINDIR) $(NEWSUSR) $(NEWSGRP) $(OSTYPE)
  136. ***************
  137. *** 162,163 ****
  138. --- 193,200 ----
  139.       chmod 6755 $(LIBDIR)/inews
  140. + nfsupdate: install.sh
  141. +     sh install.sh $(SPOOLDIR) $(LIBDIR) $(BINDIR) $(NEWSUSR) $(NEWSGRP) $(OSTYPE) $(NFSSPOOLDIR) $(NFSLIBDIR)
  142. +     chown root $(LIBDIR)/inews
  143. +     chmod 6755 $(LIBDIR)/inews
  144.   
  145.  
  146. Index: control.c
  147. Prereq: 2.56
  148. *** .d/control.c    Wed Nov  4 14:56:35 1987
  149. --- control.c    Thu Nov 19 16:54:11 1987
  150. ***************
  151. *** 21,23 ****
  152.   #ifdef SCCSID
  153. ! static char    *SccsId = "@(#)control.c    2.56    11/4/87";
  154.   #endif /* SCCSID */
  155. --- 21,23 ----
  156.   #ifdef SCCSID
  157. ! static char    *SccsId = "@(#)control.c    2.57    11/19/87";
  158.   #endif /* SCCSID */
  159. ***************
  160. *** 146,147 ****
  161. --- 146,148 ----
  162.   
  163. + #ifndef NFSCLIENT
  164.   /*
  165. ***************
  166. *** 599,600 ****
  167. --- 600,602 ----
  168.   }
  169. + #endif /* !NFSCLIENT */
  170.   
  171. ***************
  172. *** 619,620 ****
  173. --- 621,623 ----
  174.           error("cancel: Too few arguments.");
  175. + #ifndef NFSCLIENT
  176.       (void) strcpy(whatsisname, senderof(&header));
  177. ***************
  178. *** 691,692 ****
  179. --- 694,696 ----
  180.       }
  181. + #endif /* !NFSCLIENT */
  182.       return 0;
  183. ***************
  184. *** 694,695 ****
  185. --- 698,700 ----
  186.   
  187. + #ifndef NFSCLIENT
  188.   /*
  189. ***************
  190. *** 779,780 ****
  191. --- 784,786 ----
  192.   }
  193. + #endif /* !NFSCLIENT */
  194.   
  195. ***************
  196. *** 970,971 ****
  197. --- 976,978 ----
  198.   
  199. + #ifndef NFSCLIENT
  200.   /*
  201. ***************
  202. *** 1016,1017 ****
  203. --- 1023,1025 ----
  204.   }
  205. + #endif /* !NFSCLIENT */
  206.   
  207.  
  208. Index: defs.dist
  209. Prereq: 2.59
  210. *** .d/defs.dist    Sun Oct 18 18:03:03 1987
  211. --- defs.dist    Thu Nov 19 16:54:11 1987
  212. ***************
  213. *** 16,18 ****
  214.   
  215. ! /*    @(#)defs.dist    2.59    10/15/87    */
  216.   
  217. --- 16,18 ----
  218.   
  219. ! /*    @(#)defs.dist    2.60    11/19/87    */
  220.   
  221. ***************
  222. *** 92,93 ****
  223. --- 92,96 ----
  224.   /* #define ORGDISTRIB    "froozum"    /* For organization wide control message handling */
  225. + /* #define MODFILEONLY        /* define when local postings to moderated */
  226. +                 /* groups must be approved by the contents */
  227. +                 /* of the $(LIB)/moderators file       */
  228.   
  229. ***************
  230. *** 131 ****
  231. --- 134,154 ----
  232.   #endif /* M_XENIX */
  233. + /* for NFS Support */
  234. + #ifdef NFSCLIENT        /* NFSSYSNAME found in $(LIB)/nfssysname */
  235. + # define NFSCMDFORMAT "/usr/ucb/rsh %s /usr/lib/news/inews -p < %s"
  236. + # define NFSCMDARGS NFSSYSNAME,ARTICLE
  237. +     /* If NFSCLIENT is flagged in Makefile, then we're compiling code
  238. +      * for an NFS client system.  In this case, inews on the client is
  239. +      * expected to only do some preliminary checking.  The full check is
  240. +      * expected to happen on the host NFSCLIENT.  The two statements above
  241. +      * are used to form a command which is called by system(command) in the
  242. +      * code.  The two arguments are most probably the only pieces of
  243. +      * information that one will need from within the program.  The first
  244. +      * argument (NFSSYSNAME) is the name of the master system that is
  245. +      * suppose to perform the final checks and post the article.  The
  246. +      * second argument (ARTicle) is a string which contains the /tmp
  247. +      * file name of the file that has the article to be posted. Note:
  248. +      * all program and file names should be fully qualified with directory
  249. +      * names for security purposes!!!!
  250. +      */
  251. + #endif /* NFSCLIENT */
  252.  
  253. Index: funcs.c
  254. Prereq: 2.36
  255. *** .d/funcs.c    Thu Oct  8 00:20:21 1987
  256. --- funcs.c    Thu Nov 19 16:54:13 1987
  257. ***************
  258. *** 18,20 ****
  259.   #ifdef SCCSID
  260. ! static char    *SccsId = "@(#)funcs.c    2.36    10/7/87";
  261.   #endif /* SCCSID */
  262. --- 18,20 ----
  263.   #ifdef SCCSID
  264. ! static char    *SccsId = "@(#)funcs.c    2.37    11/19/87";
  265.   #endif /* SCCSID */
  266. ***************
  267. *** 638,639 ****
  268. --- 638,641 ----
  269.       char facuser[BUFLEN], facgroups[BUFLEN], factemp[BUFLEN];
  270. +     char *getgrplist();
  271. +     char *grplist = NULL;
  272.       register char  *facptr;
  273. ***************
  274. *** 647,652 ****
  275.       facfd = fopen(factemp, "r");
  276. !     if (facfd != NULL) { /* If no such file, we go with the global default */
  277. !         while (fscanf(facfd, "%[^:]:%s\n", facuser, factemp) != EOF)
  278. !         {
  279.               if (feof(facfd))
  280. --- 649,652 ----
  281.       facfd = fopen(factemp, "r");
  282. !     if (facfd != NULL) { /* If no such file, use global default only */
  283. !         while (fscanf(facfd, "%[^:]:%s\n", facuser, factemp) != EOF) {
  284.               if (feof(facfd))
  285. ***************
  286. *** 653,655 ****
  287.                   break;
  288. !             if (strncmp(facuser, user, BUFLEN) == 0) {
  289.                   (void) strcat(facgroups, ",");
  290. --- 653,665 ----
  291.                   break;
  292. !             if (facuser[0] == '#') continue;
  293. !             if (facuser[0] == '\\') {
  294. !                 if (!grplist) grplist = getgrplist(user);
  295. !                 facptr = facuser;
  296. !                 facptr++;
  297. !                 if (ngmatch(facptr, grplist)) {
  298. !                     (void) strcat(facgroups, ",");
  299. !                     (void) strcat(facgroups, factemp);
  300. !                     continue;
  301. !                 }
  302. !             } else if (STRNCMP(facuser, user, BUFLEN) == 0) {
  303.                   (void) strcat(facgroups, ",");
  304. ***************
  305. *** 694 ****
  306. --- 704,753 ----
  307.   #endif /* FASCIST */
  308. + /*  This routine is meant to be called only once.  On a system with a
  309. +  *  large /etc/group file, this routine is a HOG!!!!!  In order to save
  310. +  *  ourselves from pain, this routine will look up groups for "user"
  311. +  * the first time.  After that, it will always return the same results...
  312. +  */
  313. + char *
  314. + getgrplist(user)
  315. + register char *user;
  316. + {
  317. +     register struct group *gr;
  318. +     register struct passwd *pw;
  319. +     register char **cp;
  320. +     register int len;
  321. +     static int grpdone = FALSE;
  322. +     static char grplist[LBUFLEN];
  323. + #ifdef DEBUG
  324. +     fprintf(stderr, "getgrplist entered...\n");
  325. + #endif /* DEBUG */
  326. +     if (grpdone == FALSE) {
  327. + #ifdef DEBUG
  328. +         fprintf(stderr, "... actually reading /etc/group...\n");
  329. + #endif /* DEBUG */
  330. +         pw = getpwnam(user);
  331. +         setgrent();
  332. +         while (gr = getgrent()) {
  333. +             if (pw) if (pw->pw_gid == gr->gr_gid) {
  334. +                 strcat(grplist, gr->gr_name);
  335. +                 strcat(grplist, ",");
  336. +                 continue;
  337. +             }    
  338. +             for (cp = gr->gr_mem; cp && *cp; cp++)
  339. +                 if (STRCMP(*cp, user) == 0) {
  340. +                     strcat(grplist, gr->gr_name);
  341. +                     strcat(grplist, ",");
  342. +                     break;
  343. +                 }
  344. +         }
  345. +         if ((len = strlen(grplist))) grplist[len-1] = '\0';
  346. +         grpdone = TRUE;
  347. +     }
  348. + #ifdef DEBUG
  349. +     fprintf(stderr, "Group list - %s\n", grplist);
  350. + #endif /* DEBUG */
  351. +     return grplist;
  352. + }
  353.  
  354. Index: iextern.c
  355. Prereq: 2.18
  356. *** .d/iextern.c    Wed Oct  7 16:52:10 1987
  357. --- iextern.c    Thu Nov 19 16:54:13 1987
  358. ***************
  359. *** 6,8 ****
  360.   #ifdef SCCSID
  361. ! static char    *SccsId = "@(#)iextern.c    2.18    9/24/87";
  362.   #endif /* SCCSID */
  363. --- 6,8 ----
  364.   #ifdef SCCSID
  365. ! static char    *SccsId = "@(#)iextern.c    2.19    11/19/87";
  366.   #endif /* SCCSID */
  367. ***************
  368. *** 34 ****
  369. --- 34,36 ----
  370.   char    is_mod[NAMELEN];        /* contains newsgroup if moderated */
  371. + int    is_mod_file_okay;        /* true if /usr/lib/news/moderators */
  372. +                     /*  okays posting by the user */
  373.  
  374. Index: ifuncs.c
  375. Prereq: 2.66
  376. *** .d/ifuncs.c    Thu Oct  8 00:21:23 1987
  377. --- ifuncs.c    Thu Nov 19 16:54:17 1987
  378. ***************
  379. *** 18,20 ****
  380.   #ifdef SCCSID
  381. ! static char    *SccsId = "@(#)ifuncs.c    2.66    10/7/87";
  382.   #endif /* SCCSID */
  383. --- 18,20 ----
  384.   #ifdef SCCSID
  385. ! static char    *SccsId = "@(#)ifuncs.c    2.67    11/19/87";
  386.   #endif /* SCCSID */
  387. ***************
  388. *** 64,65 ****
  389. --- 64,66 ----
  390.   
  391. + #ifndef NFSCLIENT
  392.   #ifndef GENERICPATH
  393. ***************
  394. *** 472,473 ****
  395. --- 473,475 ----
  396.   }
  397. + #endif /* !NFSCLIENT */
  398.   
  399. ***************
  400. *** 546,547 ****
  401. --- 548,550 ----
  402.   
  403. + #ifndef NFSCLIENT
  404.       idlock(lcident);
  405. ***************
  406. *** 577,578 ****
  407. --- 580,582 ----
  408.   #endif /* !DBM */
  409. + #endif /* !NFSCLIENT */
  410.       histline[0] = '\0';
  411. ***************
  412. *** 580,581 ****
  413. --- 584,586 ----
  414.       addhist("\t");
  415. + #ifndef NFSCLIENT
  416.   #ifdef DEBUG
  417. ***************
  418. *** 584,585 ****
  419. --- 589,593 ----
  420.       return FALSE;
  421. + #else /* NFSCLIENT */
  422. +     return TRUE;
  423. + #endif /* NFSCLIENT */
  424.   }
  425. ***************
  426. *** 602,603 ****
  427. --- 610,612 ----
  428.   #endif /* !DBM */
  429. +     char tmphline[PATHLEN];
  430.   
  431. ***************
  432. *** 626,628 ****
  433.       /* We assume that history has already been called, calling dbminit. */
  434. !     p = index(hline, '\t');
  435.       if (p)
  436. --- 635,638 ----
  437.       /* We assume that history has already been called, calling dbminit. */
  438. !     strcpy(tmphline,hline);
  439. !     p = index(tmphline, '\t');
  440.       if (p)
  441. ***************
  442. *** 629,632 ****
  443.           *p = 0;
  444. !     lcase(hline);
  445. !     lhs.dptr = hline;
  446.       lhs.dsize = strlen(lhs.dptr) + 1;
  447. --- 639,642 ----
  448.           *p = 0;
  449. !     lcase(tmphline);
  450. !     lhs.dptr = tmphline;
  451.       lhs.dsize = strlen(lhs.dptr) + 1;
  452. ***************
  453. *** 788,790 ****
  454.    */
  455. ! ngfcheck(isproc)
  456.   {
  457. --- 798,801 ----
  458.    */
  459. ! ngfcheck(user, isproc, is_mod_init)
  460. ! char    *user;
  461.   {
  462. ***************
  463. *** 793,795 ****
  464.       register int    i, j;
  465. !     register int    ngcount, okcount, havealiased;
  466.       register int    pass;
  467. --- 804,806 ----
  468.       register int    i, j;
  469. !     register int    ngcount, okcount, dorecheck;
  470.       register int    pass;
  471. ***************
  472. *** 796,797 ****
  473. --- 807,809 ----
  474.       char *        ngs[sizeof header.nbuf / 2];
  475. +     char *        ngsbug[sizeof header.nbuf / 2];
  476.       char        uses[sizeof header.nbuf / 2];
  477. ***************
  478. *** 800,803 ****
  479.   
  480. !     havealiased = ngcount = 0;
  481. !     is_mod[0] = '\0';
  482.       /*
  483. --- 812,828 ----
  484.   
  485. ! /* uses values
  486. ! **  0 - haven't seen the newsgroup name anyplace
  487. ! **  1 - write newsgroup name back into Newsgroup: line
  488. ! **  2 - exact newsgroup name found in active or aliases file
  489. ! **  3 - newsgroup name found as prefix in bugs file (but not #2)
  490. ! **  4 - (2) plus name in bugs file
  491. ! */
  492. ! #define NGUNSEEN 0
  493. ! #define NGOK 1
  494. ! #define NGALIAS 2
  495. ! #define NGBUGS 3
  496. ! #define NGABUGS 4
  497. !     ngcount = 0;
  498.       /*
  499. ***************
  500. *** 814,815 ****
  501. --- 839,842 ----
  502.           ngs[ngcount] = cp;
  503. +         ngsbug[ngcount] = (char *) NULL;
  504. +         uses[ngcount] = NGUNSEEN;
  505.           do {
  506. ***************
  507. *** 830,832 ****
  508.           }
  509. !         uses[ngcount] = 1;    /* it should go in "Newsgroups" line */
  510.           ++ngcount;
  511. --- 857,859 ----
  512.           }
  513. !         uses[ngcount] = NGOK;    /* it should go in "Newsgroups" line */
  514.           ++ngcount;
  515. ***************
  516. *** 837,839 ****
  517.   recheck:
  518. !     okcount = 0;
  519.       rewind(actfp); clearerr(actfp);
  520. --- 864,868 ----
  521.   recheck:
  522. !     dorecheck = okcount = 0;
  523. !     is_mod[0] = '\0';
  524. !     is_mod_file_okay = is_mod_init;
  525.       rewind(actfp); clearerr(actfp);
  526. ***************
  527. *** 842,847 ****
  528.               continue;    /* strange line in input! */
  529. -         /* newsgroup 12345 12345 X */
  530. -         /*  cp +    01234567890123 */
  531. -         if (!isproc && cp[13]  == 'n')
  532. -             continue;    /* can't post to this group! */
  533.           *cp = '\0';
  534. --- 871,872 ----
  535. ***************
  536. *** 848,854 ****
  537.           for (i = 0; i < ngcount; ++i)
  538. !             if (uses[i] >= 1 && STRCMP(bfr, ngs[i]) == 0) {
  539. !                 uses[i] = 2;    /* it should be localized too */
  540. !                 if (cp[13] == 'm')
  541. !                     strcpy(is_mod, bfr);
  542. !                 ++okcount;
  543.               }
  544. --- 873,890 ----
  545.           for (i = 0; i < ngcount; ++i)
  546. !             if (STRCMP(bfr, ngs[i]) == NGUNSEEN) { /* localize? */
  547. !                 /* newsgroup 12345 12345 X */
  548. !                 /*  cp +    01234567890123 */
  549. !                 if (!isproc && cp[13]  == 'n')
  550. !                     uses[i] = NGOK;
  551. !                 else {
  552. !                     if (uses[i] < NGALIAS)
  553. !                         uses[i] = NGALIAS;
  554. !                     if (cp[13] == 'm') {
  555. !                         strcpy(is_mod, bfr);
  556. !                         if (!is_mod_file_okay)
  557. !                              is_mod_file_okay =
  558. !                                mod_file_okay(user,bfr);
  559. !                     }
  560. !                     ++okcount;
  561. !                 }
  562.               }
  563. ***************
  564. *** 855,856 ****
  565. --- 891,929 ----
  566.       }
  567. +     /*
  568. +     ** See what groups we can find in the bugs file
  569. +     */
  570. +     if ((f = fopen(BUGFILE, "r")) != NULL) {
  571. +         while (fgets(bfr, BUFLEN, f) == bfr) {
  572. +             if (bfr[0] == '#')
  573. +                 continue;
  574. +             cp = index(bfr, '\n');
  575. +             *cp = '.';
  576. +             for (i = 0; i < ngcount; ++i) {
  577. +                 register int bfrlen = strlen(bfr);
  578. +                 register int ngslen = strlen(ngs[i]);
  579. +                 if (uses[i] == NGBUGS || uses[i] == NGABUGS)
  580. +                     continue;
  581. +                 if (PREFIX(ngs[i], bfr) ||
  582. +                     (bfrlen-1 == ngslen &&
  583. +                      !STRNCMP(ngs[i], bfr, ngslen))) {
  584. +                     if (uses[i] == NGALIAS)
  585. +                         uses[i] = NGABUGS;
  586. +                     else {
  587. +                         bfr[bfrlen-1] = '\0';
  588. +                         cp = "Bug group %s -> %s [ok]";
  589. +                         log(cp, ngs[i], bfr);
  590. +                         if (ngsbug[i] == (char *) NULL)
  591. +                             ngsbug[i] = ngs[i];
  592. +                         ngs[i] = AllocCpy(bfr);
  593. +                         bfr[bfrlen-1] = '.';
  594. +                         uses[i] = NGBUGS;
  595. +                         okcount++;
  596. +                         dorecheck++;
  597. +                     }
  598. +                 }
  599. +             }
  600. +         }
  601. +         (void) fclose(f);
  602. +     }
  603.   #ifdef ALWAYSALIAS
  604. ***************
  605. *** 859,863 ****
  606.       /*
  607. !     ** Handle groups absent from active file.
  608.       */
  609. !     if (havealiased == 0 && okcount < ngcount) {
  610.           /*
  611. --- 932,936 ----
  612.       /*
  613. !     ** Handle groups absent from active and bug_groups files.
  614.       */
  615. !     if (okcount < ngcount) {
  616.           /*
  617. ***************
  618. *** 866,868 ****
  619.           f = xfopen(ALIASES, "r");
  620. !         while (okcount < ngcount && fscanf(f, "%s %s%*[^\n]", abuf, bfr) == 2)
  621.               for (i = 0; i < ngcount; ++i) {
  622. --- 939,944 ----
  623.           f = xfopen(ALIASES, "r");
  624. !         while (okcount < ngcount &&
  625. !              fscanf(f, "%s %s%*[^\n]", abuf, bfr) == 2) {
  626. !             if (abuf[0] == '#')
  627. !                 continue;
  628.               for (i = 0; i < ngcount; ++i) {
  629. ***************
  630. *** 869,871 ****
  631.   #ifndef ALWAYSALIAS
  632. !                 if (uses[i] == 2)
  633.                       continue;
  634. --- 945,947 ----
  635.   #ifndef ALWAYSALIAS
  636. !                 if (uses[i] > NGOK && uses[i] != NGBUGS)
  637.                       continue;
  638. ***************
  639. *** 872,885 ****
  640.   #endif /* ALWAYSALIAS */
  641. !                 if (STRCMP(ngs[i], abuf) != 0)
  642.                       continue;
  643. !                 if (isproc)
  644.                       cp = "Aliased newsgroup %s to %s";
  645. !                 else
  646.                       cp = "Please change %s to %s";
  647.                   logerr(cp, abuf, bfr);
  648.                   ngs[i] = AllocCpy(bfr);
  649. !                 uses[i] = 2;
  650. !                 ++havealiased;
  651. !                 ++okcount;
  652.               }
  653.           (void) fclose(f);
  654. --- 948,975 ----
  655.   #endif /* ALWAYSALIAS */
  656. !                 cp = (char *) NULL;
  657. !                 if (uses[i] == NGBUGS)
  658. !                     if (STRCMP(ngsbug[i], abuf) == 0)
  659. !                     cp = "Aliased newsgroup %s to %s";
  660. !                 if (cp == (char *) NULL) {
  661. !                        if (STRCMP(ngs[i], abuf) != 0)
  662.                       continue;
  663. !                        if (isproc)
  664.                       cp = "Aliased newsgroup %s to %s";
  665. !                        else
  666.                       cp = "Please change %s to %s";
  667. +                 }
  668.                   logerr(cp, abuf, bfr);
  669. +                 if (uses[i] == NGBUGS) {
  670. +                     free(ngs[i]);
  671. +                     ngsbug[i] = (char *) NULL;
  672. +                 }
  673.                   ngs[i] = AllocCpy(bfr);
  674. !                 ++dorecheck;
  675. ! #ifdef ALWAYSALIAS
  676. !                 if (uses[i] != NGBUGS)
  677. ! #endif /* ALWAYSALIAS */
  678. !                     ++okcount;
  679. !                 uses[i] = NGALIAS;
  680.               }
  681. +         }
  682.           (void) fclose(f);
  683. ***************
  684. *** 886,888 ****
  685.           for (i = 0; i < ngcount; ++i) {
  686. !             if (uses[i] == 2)
  687.                   continue;
  688. --- 976,978 ----
  689.           for (i = 0; i < ngcount; ++i) {
  690. !             if (uses[i] > NGOK)
  691.                   continue;
  692. ***************
  693. *** 902,912 ****
  694.               newssave(infp, (char *) NULL);
  695. -         /*
  696. -          * Unfortunately, if you alias an unmoderated group to a
  697. -          * moderated group, you must recheck the active file to see
  698. -          * if the new group is moderated. Rude but necessary.
  699. -          */
  700. -         if (havealiased)
  701. -             goto recheck;    
  702.       }
  703.       /*
  704.       ** Zap duplicates.
  705. --- 992,1005 ----
  706.               newssave(infp, (char *) NULL);
  707.       }
  708.       /*
  709. +      * Unfortunately, if you alias an unmoderated group to a
  710. +      * moderated group, you must recheck the active file to see
  711. +      * if the new group is moderated. Rude but necessary.
  712. +      */
  713. +     if (dorecheck)
  714. +         goto recheck;
  715. +     /*
  716.       ** Zap duplicates.
  717. ***************
  718. *** 914,926 ****
  719.       for (i = 0; i < ngcount - 1; ++i) {
  720. !         if (uses[i] == 0)
  721.               continue;
  722. !         for (j = i + 1; j < ngcount; ++j) {
  723. !             if (uses[j] == 0)
  724.                   continue;
  725.               if (STRCMP(ngs[i], ngs[j]) != 0)
  726. !                 continue;
  727. !             logerr("Duplicate %s removed", ngs[j]);
  728. !             if (uses[i] < uses[j])
  729. !                 uses[i] = uses[j];
  730. !             uses[j] = 0;
  731.           }
  732. --- 1007,1063 ----
  733.       for (i = 0; i < ngcount - 1; ++i) {
  734. !         if (uses[i] == NGUNSEEN)
  735.               continue;
  736. !         for (j = i + 1; ((j < ngcount) && (uses[i] != NGUNSEEN)); ++j){
  737. !             register int kill = -1;
  738. !             register int keep = -1;
  739. !             if (uses[j] == NGUNSEEN)
  740.                   continue;
  741. +             if (uses[i] == NGABUGS || uses[j] == NGABUGS) {
  742. +                 register int k = i;
  743. +                 register int l = j;
  744. +                 if (uses[i] == NGABUGS && uses[j] == NGABUGS) {
  745. +                     if (strlen(ngs[j]) < strlen(ngs[i])) {
  746. +                         k = j;
  747. +                         l = i;
  748. +                     }
  749. +                 } else if (uses[i] == NGABUGS) {
  750. +                     k = j;
  751. +                     l = i;
  752. +                 }
  753. +                 strcpy(bfr, ngs[k]);
  754. +                 strcat(bfr, ".");
  755. +                 if (PREFIX(ngs[l], bfr)) {
  756. +                     kill = k;
  757. +                     keep = l;
  758. +                     if (uses[k] != NGBUGS ||
  759. +                         ngsbug[l] == (char *) NULL)
  760. +                         logerr("Duplicate %s removed",
  761. +                             ngs[k]);
  762. +                 }
  763. +             }
  764. +             if (kill < 0) {
  765.               if (STRCMP(ngs[i], ngs[j]) != 0)
  766. !                     continue;
  767. !                 keep = i;
  768. !                 kill = j;
  769. !                 if (uses[j] != NGBUGS)
  770. !                     logerr("Duplicate %s removed", ngs[j]);
  771. !                 if (uses[i] < uses[j])
  772. !                     uses[i] = uses[j];
  773. !             }
  774. !             if (kill >= 0) {
  775. !                 if (uses[kill] == NGBUGS) {
  776. !                     if (ngsbug[keep] == (char *) NULL)
  777. !                         ngsbug[keep] = ngsbug[kill];
  778. !                     else if (ngsbug[kill] != (char*) NULL){
  779. !                         sprintf(bfr, "%s,%s",
  780. !                             ngsbug[keep],
  781. !                             ngsbug[kill]);
  782. !                         if (ngsbug[keep] < tbuf || ngsbug[keep] > &tbuf[sizeof tbuf - 1])
  783. !                             free(ngsbug[keep]);
  784. !                         ngsbug[keep] = AllocCpy(bfr);
  785. !                     }
  786. !                 }
  787. !                 uses[kill] = NGUNSEEN;
  788. !             }
  789.           }
  790. ***************
  791. *** 946,948 ****
  792.                   continue;
  793. !             j = strlen(ngs[i]);
  794.               if (j + 2 > avail) {
  795. --- 1083,1088 ----
  796.                   continue;
  797. !             if (pass == 1)
  798. !                 j = strlen(ngsbug[i] == (char *) NULL ? ngs[i] : ngsbug[i]);
  799. !             else
  800. !                 j = strlen(ngs[i]);
  801.               if (j + 2 > avail) {
  802. ***************
  803. *** 951,953 ****
  804.               }
  805. !             (void) strcpy(cp, ngs[i]);
  806.               cp += j;
  807. --- 1091,1097 ----
  808.               }
  809. !             if (pass == 1)
  810. !                 (void) strcpy(cp,
  811. !                     ngsbug[i] == (char *) NULL ? ngs[i] : ngsbug[i]);
  812. !             else
  813. !                 (void) strcpy(cp, ngs[i]);
  814.               cp += j;
  815. ***************
  816. *** 965,967 ****
  817.       */
  818. !     for (i = 0; i < ngcount; ++i)
  819.           if (ngs[i] < tbuf || ngs[i] > &tbuf[sizeof tbuf - 1])
  820. --- 1109,1111 ----
  821.       */
  822. !     for (i = 0; i < ngcount; ++i) {
  823.           if (ngs[i] < tbuf || ngs[i] > &tbuf[sizeof tbuf - 1])
  824. ***************
  825. *** 968,970 ****
  826. --- 1112,1124 ----
  827.               free(ngs[i]);
  828. +         if (ngsbug[i] < tbuf || ngsbug[i] > &tbuf[sizeof tbuf - 1])
  829. +             free(ngsbug[i]);
  830. +     }
  831.       return nbuf[0] == '\0';
  832. + #undef NGUNSEEN 0
  833. + #undef NGOK 1
  834. + #undef NGALIAS 2
  835. + #undef NGBUGS 3
  836. + #undef NGABUGS 4
  837.   }
  838. ***************
  839. *** 971,972 ****
  840. --- 1125,1168 ----
  841.   
  842. + /* Check $LIB/moderators to see if user is listed as a known moderator
  843. +  * of the newsgroup in ngname..... return TRUE if user is ok.
  844. +  */
  845. + mod_file_okay(user, ngname)
  846. + char    *user, *ngname;
  847. + {
  848. +     FILE *mfd;
  849. +     char *grplist = NULL;
  850. +     char *p, *getgrplist();
  851. +     int ret = FALSE;
  852. +     char mfn[BUFLEN], mgrp[BUFLEN], mlist[LBUFLEN];
  853. +     sprintf(mfn, "%s/%s", LIB, "moderators");
  854. +     mfd = fopen(mfn, "r");
  855. +     if (mfd != NULL) 
  856. +        while ((!ret) && fscanf(mfd, "%[^:]:%s\n", mgrp, mlist) != EOF) {
  857. +         if (feof(mfd)) break;
  858. +         if (mgrp[0] == '#') continue;
  859. +         if (!STRCMP(ngname, mgrp)) {
  860. +             while (*(p = ((p = rindex(mlist, ',')) ? p : mlist ))
  861. +                   && (ret == FALSE)) {
  862. +                 if (*p == ',') {
  863. +                     *p = '\0';
  864. +                     p++;
  865. +                 }
  866. +                 if (*p == '\\') {
  867. +                     *p = '\0';
  868. +                     p++;
  869. +                     if (!grplist)
  870. +                         grplist = getgrplist(user);
  871. +                     if (ngmatch(p,grplist)) ret = TRUE;
  872. +                 } else if (!STRCMP(p, user))
  873. +                     ret = TRUE;
  874. +                 *p = '\0';
  875. +             }
  876. +         }
  877. +     }
  878. +     fclose(mfd);
  879. +     return ret;
  880. + }
  881.   /*
  882. ***************
  883. *** 1427,1429 ****
  884.           i = DEADTIME;
  885. !         while (link(SUBFILE, LOCKFILE)) {
  886.               if (errno != EEXIST)
  887. --- 1623,1625 ----
  888.           i = DEADTIME;
  889. !         while (link(SEQFILE, LOCKFILE)) {
  890.               if (errno != EEXIST)
  891. ***************
  892. *** 1444,1445 ****
  893. --- 1640,1645 ----
  894.   #endif /* !VMS */
  895. + #ifdef NFSCLIENT
  896. + #define PROC 0004
  897. + #endif /* NFSCLIENT */
  898.   
  899.  
  900. Index: inews.c
  901. Prereq: 2.83
  902. *** .d/inews.c    Wed Nov  4 14:57:35 1987
  903. --- inews.c    Thu Nov 19 16:54:20 1987
  904. ***************
  905. *** 19,21 ****
  906.   #ifdef SCCSID
  907. ! static char    *SccsId = "@(#)inews.c    2.83    11/4/87";
  908.   #endif /* SCCSID */
  909. --- 19,21 ----
  910.   #ifdef SCCSID
  911. ! static char    *SccsId = "@(#)inews.c    2.84    11/19/87";
  912.   #endif /* SCCSID */
  913. ***************
  914. *** 80,82 ****
  915.   'c',    ' ',        FALSE,    UNKNOWN,UNKNOWN,    header.ctlmsg,
  916. ! 'C',    ' ',        FALSE,    UNKNOWN,CREATENG,    header.ctlmsg,
  917.   #define hflag    options[9].flag
  918. --- 80,83 ----
  919.   'c',    ' ',        FALSE,    UNKNOWN,UNKNOWN,    header.ctlmsg,
  920. ! #define COPT 'C'
  921. ! COPT,    ' ',        FALSE,    UNKNOWN,CREATENG,    header.ctlmsg,
  922.   #define hflag    options[9].flag
  923. ***************
  924. *** 139,140 ****
  925. --- 140,142 ----
  926.       actfp = xfopen(ACTIVE, "r+");
  927. + #ifndef NFSCLIENT
  928.   #ifdef    LOCKF
  929. ***************
  930. *** 192,193 ****
  931. --- 194,196 ----
  932.       }
  933. + #endif /* !NFSCLIENT */
  934.   
  935. ***************
  936. *** 194,195 ****
  937. --- 197,199 ----
  938.       if (!STRNCMP(ptr+1, "rnews", 5)) {
  939. + #ifndef NFSCLIENT
  940.           mode = PROC;
  941. ***************
  942. *** 199,200 ****
  943. --- 203,212 ----
  944.           }
  945. + #else /* NFSCLIENT */
  946. +         mfd = mailhdr((struct hbuf *)NULL, "Improper use of INEWS");
  947. +         if (mfd != NULL) {
  948. +             fprintf(mfd,"System: %s\n\nINEWS is running improperly as RNEWS on slave NFS site by user %s.\n", LOCALSYSNAME, username);
  949. +             (void) mclose(mfd);
  950. +             exit(1);
  951. +         }
  952. + #endif /* NFSCLIENT */
  953.   #ifdef NICENESS
  954. ***************
  955. *** 240,242 ****
  956. --- 252,258 ----
  957.       (void) ftime(&Now);
  958. + #ifndef NFSCLIENT
  959.       if (uid == 0 && duid == 0) {
  960. + #else /* NFSCLIENT */
  961. +         if (duid == 0) {
  962. + #endif /* NFSCLIENT */
  963.           /*
  964. ***************
  965. *** 245,246 ****
  966. --- 261,269 ----
  967.            * when root invokes a setuid program.
  968. +          *
  969. +          * On NFS slave systems, inews is setuid to ROOT.  This allows
  970. +          * inews to setuid/gid (real and effective) to NEWSUSR and
  971. +          * NEWSGRP respectively.  This *must* happen so that the "rsh"
  972. +          * program will run as user NEWSUSR and not as the user running
  973. +          * inews. "rsh" runs as the "real" user even when the program
  974. +          * calling it is setuid.
  975.            */
  976. ***************
  977. *** 302,303 ****
  978. --- 325,332 ----
  979.               found:;
  980. + #ifdef NFSCLIENT
  981. +             if (optpt->optlet == COPT) {
  982. +                 fprintf(stderr, "Cannot create new newsgroups from an NFS slave system.\n\n");
  983. +                 xxit(1);
  984. +             }
  985. + #endif /* NFSCLIENT */
  986.               if (optpt->flag == TRUE || (mode != UNKNOWN &&
  987. ***************
  988. *** 353,354 ****
  989. --- 382,384 ----
  990.   
  991. + #ifndef NFSCLIENT
  992.       if (mode == CREATENG)
  993. ***************
  994. *** 355,356 ****
  995. --- 385,387 ----
  996.           createng();
  997. + #endif /* !NFSCLIENT */
  998.   
  999. ***************
  1000. *** 457,458 ****
  1001. --- 488,497 ----
  1002.       if (mode == PROC) {
  1003. + #ifdef NFSCLIENT
  1004. +         mfd = mailhdr((struct hbuf *)NULL, "Improper use of INEWS");
  1005. +         if (mfd != NULL) {
  1006. +             fprintf(mfd,"System: %s\n\nINEWS is running improperly as RNEWS on slave NFS site by user %s.\n", LOCALSYSNAME, username);
  1007. +             (void) mclose(mfd);
  1008. +             exit(1);
  1009. +         }
  1010. + #else /* !NFSCLIENT */
  1011.           checkbatch();
  1012. ***************
  1013. *** 472,473 ****
  1014. --- 511,513 ----
  1015.           xxit(0);
  1016. + #endif /* !NFSCLIENT */
  1017.       }
  1018. ***************
  1019. *** 497,499 ****
  1020. --- 537,541 ----
  1021.   #endif /* FASCIST */
  1022. + #ifndef NFSCLIENT
  1023.           ctlcheck();
  1024. + #endif /* !NFSCLIENT */
  1025.       }
  1026. ***************
  1027. *** 500,501 ****
  1028. --- 542,544 ----
  1029.   
  1030. + #ifndef NFSCLIENT
  1031.       if (mode == CREATENG)
  1032. ***************
  1033. *** 502,503 ****
  1034. --- 545,547 ----
  1035.           createng();
  1036. + #endif /* !NFSCLIENT */
  1037.   
  1038. ***************
  1039. *** 532,533 ****
  1040. --- 576,578 ----
  1041.           LOCALSYSNAME, f);
  1042. + #ifndef NFSCLIENT
  1043.       (void) sprintf(cbuf, "touch %s;chmod 666 %s", f, f);
  1044. ***************
  1045. *** 538,539 ****
  1046. --- 583,587 ----
  1047.           fprintf(mfd, "Corrective action failed - check suid bits.\n");
  1048. + #else /* NFSCLIENT */
  1049. +     fprintf(mfd, "Corrective action must take place on \"%s\", the master NFS news system.\n", NFSSYSNAME);
  1050. + #endif /* NFSCLIENT */
  1051.       (void) mclose(mfd);
  1052. ***************
  1053. *** 559,560 ****
  1054. --- 607,609 ----
  1055.           LOCALSYSNAME, dir);
  1056. + #ifndef NFSCLIENT
  1057.       (void) mkdir(dir, 0775);
  1058. ***************
  1059. *** 564,565 ****
  1060. --- 613,617 ----
  1061.           fprintf(mfd, "Corrective action failed - check suid bits.\n");
  1062. + #else /* NFSCLIENT */
  1063. +     fprintf(mfd, "Corrective action must take place on \"%s\", the master NFS news system.\n", NFSSYSNAME);
  1064. + #endif /* NFSCLIENT */
  1065.       (void) mclose(mfd);
  1066. ***************
  1067. *** 611,612 ****
  1068. --- 663,665 ----
  1069.   
  1070. + #ifndef NFSCLIENT
  1071.   dospool(batchcmd, dolhwrite)
  1072. ***************
  1073. *** 836,837 ****
  1074. --- 889,891 ----
  1075.   }
  1076. + #endif /* !NFSCLIENT */
  1077.   
  1078. ***************
  1079. *** 855,858 ****
  1080.       /* Clean up Newsgroups: line */
  1081. !     if (!is_ctl && mode != CREATENG)
  1082. !         is_invalid = ngfcheck(mode == PROC);
  1083.   
  1084. --- 909,917 ----
  1085.       /* Clean up Newsgroups: line */
  1086. !     if (!is_ctl && mode != CREATENG) {
  1087. ! #ifdef MODFILEONLY
  1088. !         if (mode <= UNPROC) header.approved[0] = '\0';
  1089. ! #endif /* MODFILEONLY */
  1090. !         is_invalid =
  1091. !         ngfcheck(username, mode == PROC, header.approved[0] != '\0');
  1092. !     }
  1093.   
  1094. ***************
  1095. *** 876,877 ****
  1096. --- 935,937 ----
  1097.   
  1098. + #ifndef NFSCLIENT
  1099.       if (is_invalid) {
  1100. ***************
  1101. *** 901,902 ****
  1102. --- 961,963 ----
  1103.       }
  1104. + #endif /* !NFSCLIENT */
  1105.   
  1106. ***************
  1107. *** 903,950 ****
  1108.       if (is_mod[0] != '\0'     /* one of the groups is moderated */
  1109. !         && header.approved[0] == '\0') { /* and unapproved */
  1110. !         struct hbuf mhdr;
  1111. !         FILE *mfd, *mhopen();
  1112. !         register char *p;
  1113. !         char modadd[BUFLEN], *replyname();
  1114.   #ifdef DONTFOWARD
  1115. !         if(mode == PROC) {
  1116. !             logerr("Unapproved article in moderated group %s",
  1117. !                 is_mod);
  1118. !             if (localize("junk"))
  1119. !                 savehist(histline);
  1120. !             goto writeout;
  1121. !         }
  1122.   #endif /* DONTFORWARD */
  1123. !         fprintf(stderr,"%s is moderated and may not be posted to",
  1124. !             is_mod);
  1125. !         fprintf(stderr," directly.\nYour article is being mailed to");
  1126. !         fprintf(stderr," the moderator who will post it for you.\n");
  1127. !         /* Let's find a path to the backbone */
  1128. !         sprintf(bfr, "%s/mailpaths", LIB);
  1129. !         mfd = xfopen(bfr, "r");
  1130. !         do {
  1131. !             if (fscanf(mfd, "%s %s", bfr, modadd) != 2)
  1132. !                 xerror("Can't find backbone in %s/mailpaths",
  1133. !                     LIB);
  1134. !         } while (STRCMP(bfr, "backbone") != 0 && !ngmatch(is_mod, bfr));
  1135. !         (void) fclose(mfd);
  1136. !         /* fake a header for mailhdr */
  1137. !         mhdr.from[0] = '\0';
  1138. !         mhdr.replyto[0] = '\0';
  1139. !         p = is_mod;
  1140. !         while (*++p)
  1141. !             if (*p == '.')
  1142. !                 *p = '-';
  1143. !         sprintf(mhdr.path, modadd, is_mod);
  1144. !         mfd = mhopen(&mhdr);
  1145. !         if (mfd == NULL)
  1146. !             xerror("Can't send mail to %s", mhdr.path);
  1147. !         fprintf(mfd, "To: %s\n", replyname(&mhdr));
  1148. !         lhwrite(&header, mfd);
  1149. !         putc('\n', mfd);
  1150. !         while ((c = getc(infp)) != EOF)
  1151. !             putc(c, mfd);
  1152. !         mclose(mfd);
  1153. !         log("Article mailed to %s", mhdr.path);
  1154. !         xxit(0);
  1155.       }
  1156. --- 964,1020 ----
  1157.       if (is_mod[0] != '\0'     /* one of the groups is moderated */
  1158. !         && header.approved[0] == '\0') { /* and unapproved */
  1159. !         if (is_mod_file_okay) {
  1160. !             (void) sprintf(header.approved, "%s@%s",
  1161. !                     username, FROMSYSNAME);
  1162. !         } else {
  1163. !             struct hbuf mhdr;
  1164. !             FILE *mfd, *mhopen();
  1165. !             register char *p;
  1166. !             char modadd[BUFLEN], *replyname();
  1167. ! #ifndef NFSCLIENT
  1168.   #ifdef DONTFOWARD
  1169. !             if(mode == PROC) {
  1170. !                 logerr("Unapproved article in moderated group %s",
  1171. !                     is_mod);
  1172. !                 if (localize("junk"))
  1173. !                     savehist(histline);
  1174. !                 goto writeout;
  1175. !             }
  1176.   #endif /* DONTFORWARD */
  1177. ! #endif /* !NFSCLIENT */
  1178. !             fprintf(stderr,"%s is moderated and may not ", is_mod);
  1179. !             fprintf(stderr,"be posted to directly.\nYour ");
  1180. !             fprintf(stderr, "article is being mailed to the ");
  1181. !             fprintf(stderr, "moderator who will post it for ");
  1182. !             fprintf(stderr, "you.\n");
  1183. !             /* Let's find a path to the backbone */
  1184. !             sprintf(bfr, "%s/mailpaths", LIB);
  1185. !             mfd = xfopen(bfr, "r");
  1186. !             do {
  1187. !                 if (fscanf(mfd, "%s %s", bfr, modadd) != 2)
  1188. !                     xerror("Can't find backbone in %s/mailpaths",
  1189. !                         LIB);
  1190. !             } while (STRCMP(bfr, "backbone") != 0
  1191. !                  && !ngmatch(is_mod, bfr));
  1192. !             (void) fclose(mfd);
  1193. !             /* fake a header for mailhdr */
  1194. !             mhdr.from[0] = '\0';
  1195. !             mhdr.replyto[0] = '\0';
  1196. !             p = is_mod;
  1197. !             while (*++p)
  1198. !                 if (*p == '.')
  1199. !                     *p = '-';
  1200. !             sprintf(mhdr.path, modadd, is_mod);
  1201. !             mfd = mhopen(&mhdr);
  1202. !             if (mfd == NULL)
  1203. !                 xerror("Can't send mail to %s", mhdr.path);
  1204. !             fprintf(mfd, "To: %s\n", replyname(&mhdr));
  1205. !             lhwrite(&header, mfd);
  1206. !             putc('\n', mfd);
  1207. !             while ((c = getc(infp)) != EOF)
  1208. !                 putc(c, mfd);
  1209. !             mclose(mfd);
  1210. !             log("Article mailed to %s", mhdr.path);
  1211. !             xxit(0);
  1212. !         }
  1213.       }
  1214. ***************
  1215. *** 951,952 ****
  1216. --- 1021,1023 ----
  1217.   
  1218. + #ifndef NFSCLIENT
  1219.       if (mode != PROC && spool_news != DONT_SPOOL)  {
  1220. ***************
  1221. *** 962,963 ****
  1222. --- 1033,1035 ----
  1223.       }
  1224. + #endif /* !NFSCLIENT */
  1225.   
  1226. ***************
  1227. *** 965,966 ****
  1228. --- 1037,1039 ----
  1229.           exitcode = control(&header);
  1230. + #ifndef NFSCLIENT
  1231.           if (localize("control") && exitcode != 0)
  1232. ***************
  1233. *** 993,994 ****
  1234. --- 1066,1068 ----
  1235.           }
  1236. + #endif /* !NFSCLIENT */
  1237.       }
  1238. ***************
  1239. *** 1039,1040 ****
  1240. --- 1113,1115 ----
  1241.           if (mode != PROC) {
  1242. + #ifndef NFSCLIENT
  1243.               int pid;
  1244. ***************
  1245. *** 1057,1058 ****
  1246. --- 1132,1143 ----
  1247.           broadcast(mode==PROC);
  1248. + #else /* NFSCLIENT */
  1249. +             int status;
  1250. +             char command[LBUFLEN];
  1251. +             (void) sprintf(command, NFSCMDFORMAT, NFSCMDARGS);
  1252. +             status = system(command);
  1253. +             (void) unlink(ARTICLE);
  1254. +             exit(status);
  1255. +         }
  1256. + #endif /* NFSCLIENT */
  1257.       }
  1258. ***************
  1259. *** 1080,1081 ****
  1260. --- 1165,1167 ----
  1261.               break;
  1262. + #ifndef NFSCLIENT
  1263.            if (mode == PROC) {    /* zap trailing empty lines */
  1264. ***************
  1265. *** 1118,1119 ****
  1266. --- 1204,1206 ----
  1267.            }
  1268. + #endif /* !NFSCLIENT */
  1269.           if (mode != PROC && tty && STRCMP(bfr, ".\n") == 0)
  1270. ***************
  1271. *** 1216,1217 ****
  1272. --- 1303,1306 ----
  1273.   
  1274. + #ifndef NFSCLIENT
  1275.   /*
  1276. ***************
  1277. *** 1404 ****
  1278. --- 1493,1494 ----
  1279.   }
  1280. + #endif /* !NFSCLIENT */
  1281.  
  1282. Index: install.sh
  1283. Prereq: 1.18
  1284. *** .d/install.sh    Wed Oct  7 16:53:04 1987
  1285. --- install.sh    Thu Nov 19 16:54:21 1987
  1286. ***************
  1287. *** 1,6 ****
  1288. ! : '@(#)install.sh    1.18    9/24/87'
  1289.   
  1290. ! if test "$#" != 6
  1291.   then
  1292. !     echo "usage: $0 spooldir libdir bindir nuser ngroup ostype"
  1293.       exit 1
  1294. --- 1,6 ----
  1295. ! : '@(#)install.sh    1.19    11/19/87'
  1296.   
  1297. ! if test "$#" -lt 6
  1298.   then
  1299. ! echo "usage: $0 spooldir libdir bindir nuser ngroup ostype [nfs_spooldir nfs_libdir]"
  1300.       exit 1
  1301. ***************
  1302. *** 13,14 ****
  1303. --- 13,16 ----
  1304.   OSTYPE=$6
  1305. + NFSSPOOLDIR=$7
  1306. + NFSLIBDIR=$8
  1307.   
  1308. ***************
  1309. *** 31,33 ****
  1310.       v7)    SYSNAME=`uuname -l`
  1311. !         touch $LIBDIR/history.pag $LIBDIR/history.dir;;
  1312.       *)    echo "$0: Unknown Ostype"
  1313. --- 33,42 ----
  1314.       v7)    SYSNAME=`uuname -l`
  1315. !         if test "$NFSSPOOLDIR" = ""
  1316. !         then
  1317. !             touch $LIBDIR/history.pag $LIBDIR/history.dir
  1318. !         else
  1319. !             rm -f $LIBDIR/history.dir $LIBDIR/history.pag
  1320. !             ln -s $NFSLIBDIR/history.dir $LIBDIR/history.dir
  1321. !             ln -s $NFSLIBDIR/history.pag $LIBDIR/history.pag
  1322. !         fi;;
  1323.       *)    echo "$0: Unknown Ostype"
  1324. ***************
  1325. *** 43,54 ****
  1326.   : Ensure SPOOLDIR exists
  1327. ! for i in $SPOOLDIR $SPOOLDIR/.rnews
  1328. ! do
  1329. !     if test ! -d $i
  1330. !     then
  1331. !         mkdir $i
  1332. !     fi
  1333. !     chmod 777 $i
  1334. !     chown $NEWSUSR $i
  1335. !     chgrp $NEWSGRP $i
  1336. ! done
  1337.   
  1338. --- 52,72 ----
  1339.   : Ensure SPOOLDIR exists
  1340. ! if test "$NFSSPOOLDIR" = ""
  1341. ! then
  1342. !     for i in $SPOOLDIR $SPOOLDIR/.rnews
  1343. !     do
  1344. !         if test ! -d $i
  1345. !         then
  1346. !             mkdir $i
  1347. !         fi
  1348. !         chmod 777 $i
  1349. !         chown $NEWSUSR $i
  1350. !         chgrp $NEWSGRP $i
  1351. !     done
  1352. ! else
  1353. !     rm -rf $SPOOLDIR
  1354. !     ln -s $NFSSPOOLDIR $SPOOLDIR
  1355. !     chmod 777 $SPOOLDIR
  1356. !     chown $NEWSUSR $SPOOLDIR
  1357. !     chgrp $NEWSGRP $SPOOLDIR
  1358. ! fi
  1359.   
  1360. ***************
  1361. *** 58,60 ****
  1362.   : Ensure certain files in LIBDIR exist
  1363. ! touch $LIBDIR/history $LIBDIR/active $LIBDIR/log $LIBDIR/errlog $LIBDIR/users
  1364.   chmod 666 $LIBDIR/users
  1365. --- 76,86 ----
  1366.   : Ensure certain files in LIBDIR exist
  1367. ! if test "$NFSLIBDIR" = ""
  1368. ! then
  1369. !     touch $LIBDIR/history $LIBDIR/active
  1370. ! else
  1371. !     rm -f $LIBDIR/history $LIBDIR/active
  1372. !     ln -s $NFSLIBDIR/history $LIBDIR/history
  1373. !     ln -s $NFSLIBDIR/active $LIBDIR/active
  1374. ! fi
  1375. ! touch  $LIBDIR/log $LIBDIR/errlog $LIBDIR/users
  1376.   chmod 666 $LIBDIR/users
  1377. ***************
  1378. *** 62,63 ****
  1379. --- 88,91 ----
  1380.   : If no sys file, make one.
  1381. + if test "$NFSLIBDIR" = ""
  1382. + then
  1383.   if test ! -f $LIBDIR/sys
  1384. ***************
  1385. *** 74,75 ****
  1386. --- 102,107 ----
  1387.   fi
  1388. + else
  1389. +     rm -f $LIBDIR/sys
  1390. +     ln -s $NFSLIBDIR/sys $LIBDIR/sys
  1391. + fi
  1392.   
  1393. ***************
  1394. *** 82,83 ****
  1395. --- 114,117 ----
  1396.   : If no mailpaths, make one.
  1397. + if test "$NFSLIBDIR" = ""
  1398. + then
  1399.   if test ! -s $LIBDIR/mailpaths
  1400. ***************
  1401. *** 91,95 ****
  1402.   fi
  1403.   
  1404. ! sh makeactive.sh $LIBDIR $SPOOLDIR $NEWSUSR $NEWSGRP
  1405.   
  1406.   for i in $LIBDIR/ngfile $BINDIR/inews $LIBDIR/localgroups $LIBDIR/moderators \
  1407. --- 125,141 ----
  1408.   fi
  1409. + else
  1410. +     rm -f $LIBDIR/mailpaths
  1411. +     ln -s $NFSLIBDIR/mailpaths $LIBDIR/mailpaths
  1412. + fi
  1413.   
  1414. ! if test "$NFSLIBDIR" = ""
  1415. ! then
  1416. !     sh makeactive.sh $LIBDIR $SPOOLDIR $NEWSUSR $NEWSGRP
  1417. ! else
  1418. !     rm -f $LIBDIR/newsgroups
  1419. !     ln -s $NFSLIBDIR/newsgroups $LIBDIR/newsgroups
  1420. ! fi
  1421.   
  1422. + if test "$NFSLIBDIR" = ""
  1423. + then
  1424.   for i in $LIBDIR/ngfile $BINDIR/inews $LIBDIR/localgroups $LIBDIR/moderators \
  1425. ***************
  1426. *** 117,118 ****
  1427. --- 163,165 ----
  1428.   fi
  1429. + fi
  1430.   
  1431. ***************
  1432. *** 129,130 ****
  1433. --- 176,183 ----
  1434.   : if no aliases file, make one
  1435. + if test "$NFSLIBDIR" != ""
  1436. + then
  1437. +     rm -f $LIBDIR/aliases
  1438. +     ln -s $NFSLIBDIR/aliases $LIBDIR/aliases
  1439. +     rm -f $LIBDIR/aliases.new
  1440. + else
  1441.   if test ! -f $LIBDIR/aliases
  1442. ***************
  1443. *** 151,152 ****
  1444. --- 204,206 ----
  1445.   fi
  1446. + fi
  1447.   
  1448. ***************
  1449. *** 153,154 ****
  1450. --- 207,210 ----
  1451.   : if no distributions file, make one
  1452. + if test "$NFSLIBDIR" = ""
  1453. + then
  1454.   if test ! -f $LIBDIR/distributions
  1455. ***************
  1456. *** 165,166 ****
  1457. --- 221,226 ----
  1458.   echo site particpates in a regional distribution such as '"ba"' or '"dc"'.
  1459. + fi
  1460. + else
  1461. +     rm -f $LIBDIR/distributions
  1462. +     ln -s $NFSLIBDIR/distributions $LIBDIR/distributions
  1463.   fi
  1464.  
  1465. Index: iparams.h
  1466. Prereq: 2.17
  1467. *** .d/iparams.h    Fri Nov 21 16:04:36 1986
  1468. --- iparams.h    Thu Nov 19 16:54:21 1987
  1469. ***************
  1470. *** 4,6 ****
  1471.   
  1472. ! /*    @(#)iparams.h    2.17    11/21/86    */
  1473.   
  1474. --- 4,6 ----
  1475.   
  1476. ! /*    @(#)iparams.h    2.18    11/19/87    */
  1477.   
  1478. ***************
  1479. *** 20,21 ****
  1480. --- 20,25 ----
  1481.   
  1482. + #ifdef NFSCLIENT
  1483. + extern    char    *NFSSYSNAME;
  1484. + #endif /* NFSCLIENT */
  1485.   struct msgtype {
  1486. ***************
  1487. *** 29,31 ****
  1488.   extern    FILE    *infp, *actfp;
  1489. ! extern    int    tty, is_ctl;
  1490.   extern    char    filename[BUFLEN], is_mod[NAMELEN], not_here[SBUFLEN], *DFLTNG;
  1491. --- 33,35 ----
  1492.   extern    FILE    *infp, *actfp;
  1493. ! extern    int    tty, is_ctl, is_mod_file_okay;
  1494.   extern    char    filename[BUFLEN], is_mod[NAMELEN], not_here[SBUFLEN], *DFLTNG;
  1495.  
  1496. Index: localize.client
  1497. *** /dev/null    Thu Nov 19 16:28:13 1987
  1498. --- localize.client    Thu Nov 19 16:54:22 1987
  1499. ***************
  1500. *** 0 ****
  1501. --- 1,168 ----
  1502. + # -- DISCUSSION --
  1503. + # 
  1504. + # With this latest release of the Netnews software, it may appear to some that
  1505. + # the new NNTP support code and the new NFS support code do more or less the
  1506. + # same thing.  You're probably asking yourself, "What are the differences if
  1507. + # any and what do I go by to help me choose which way to go?"  Well, first let
  1508. + # me say that neither method is better than the other.  I can clearly see a
  1509. + # use for both models right here at Rutgers University.  And, that's what we
  1510. + # really have here - two different models - two different means of supporting
  1511. + # a distributed network news system.  The difference between the two is
  1512. + # mostly one of administration.
  1513. + # 
  1514. + # The NNTP extensions to the Netnews code allow your users to take advantage
  1515. + # of something that only rn users were able to take advantage of up until now.
  1516. + # Now, your users may use their favorite user interface program to access the
  1517. + # news from a distant host.  Administratively, the NNTP model implies that
  1518. + # complete control of the news system is done solely on the master NNTP
  1519. + # server.  If you do not need the ability to have some level of control at the
  1520. + # client system level, use of the NNTP extensions is definitely the way to go.
  1521. + # 
  1522. + # The NFS extensions allows for local administration of the news system at the
  1523. + # client level.  Right after installation, most of the administrative files in
  1524. + # LIBDIR will simply be soft links to the same files on the NFS master.
  1525. + # However, you can break these links and create actual files on the client.
  1526. + # Certainly, some files must remain as links.  Files such as "active" or
  1527. + # "newsgroups" should always remain as links to the master NFS system for
  1528. + # instance.  The ability to break links may, for example, allow you to choose
  1529. + # a different set of users to apply the fascist code to or name a moderator of
  1530. + # a moderated newsgroup but only allow him to post from his client (and not
  1531. + # from the NFS master news server), etc...  Essentially, the NFS client
  1532. + # version of inews is a stripped down version of the real thing.  The only
  1533. + # thing it doesn't do is attempt to write to NFSSPOOLDIR and NFSLIBDIR.  All
  1534. + # consistency checks performed by the real inews in the normal case are
  1535. + # performed by the NFS client version on the local system.  So, if you're
  1536. + # environment is such that you need local administrative control on the client
  1537. + # systems, the use of the NFS extensions is your best bet.
  1538. + # 
  1539. + # 
  1540. + # -- INSTALLATION --
  1541. + # 
  1542. + # The file "localize.client" is a slightly modified copy of the shell script
  1543. + # used at Rutgers University to establish a particular system as a news NFS
  1544. + # client system.  One should be familiar with NFS before attempting to use
  1545. + # this new feature.  News should be installed on the master NFS server before
  1546. + # attempting to install it on client system(s).
  1547. + # 
  1548. + # The NFSCLIENT code is enabled by including the NFSCLIENT (non-optional),
  1549. + # NFSSPOOLDIR (optional) and NFSLIBDIR (optional) definitions in your Makefile
  1550. + # edit script. NFSSPOOLDIR and NFSLIBDIR are needed only during the initial
  1551. + # installation of the code and are, in fact, only used by the Makefile when
  1552. + # calling the install.sh script.  NFSSPOOLDIR and NFSLIBDIR default to
  1553. + # /nfsnews/$(SPOOLDIR) and /nfsnews/$(LIBDIR) where "nfsnews" is expected to
  1554. + # be a mount point or soft link on the local system which ultimately points at
  1555. + # the master system.
  1556. + # 
  1557. + # With the NFSCLIENT code enabled the Makefile and installation scripts will
  1558. + # do the following:
  1559. + # 
  1560. + #     o - On an NFS client system, only a small number of the programs in
  1561. + #     this source directory need to be compiled.  Makefile will be
  1562. + #     configured to compile only those modules.
  1563. + # 
  1564. + #     o - The installation script will attempt to install only those
  1565. + #     modules compiled.  It will also attempt to establish a soft link
  1566. + #     from SPOOLDIR to NFSSPOOLDIR.  It will create a local LIBDIR,
  1567. + #     install a very select group of programs in it and attempt to create
  1568. + #     soft links from the local LIBDIR configuration files to those found
  1569. + #     in NFSLIBDIR.  Obviously, news should be installed on the master NFS
  1570. + #     server first.
  1571. + # 
  1572. + # *NOTE* - You will need to create a file called LIBDIR/nfssysname.  In it,
  1573. + # place the fully qualified host name of the system which is to act as the NFS
  1574. + # news server.  You do this right after installing the software.
  1575. + # 
  1576. + # 
  1577. + # -- CAVEATS --
  1578. + # 
  1579. + #     Under the default configuration, an NFS client will attempt to use
  1580. + #     "rsh" to send news from the client to the server.  To make this
  1581. + #     work, inews on the client will set itself to run both real and
  1582. + #     effectively as the "news" user.  Unfortunately, rsh requires that
  1583. + #     the real uid match between the two systems.  The hidden implication
  1584. + #     here is that the .rhosts file in the news home directory on the
  1585. + #     master NFS system will have to be modified to allow all clients to
  1586. + #     rsh to it.
  1587. + # 
  1588. + #     If you look below, you'll see that edits have been made to
  1589. + #     NFSCMDFORMAT and NFSCMDARGS which are located in defs.dist.  In
  1590. + #     effect, you may change the program that inews attempts to use to
  1591. + #     deliver articles to the NFS server.  In this example, I'm using a
  1592. + #     modified nntpxmit which will accept a host name and a file name as
  1593. + #     its arguments.  For those of you who are aware of how nntpxmit
  1594. + #     works, the new -a switch says that the file contains the actual
  1595. + #     article as opposed to a list of filenames containing articles.  This
  1596. + #     feature will be supported in nntpxmit 1.4.  With the new nntpxmit,
  1597. + #     the .rhosts hacking mentioned above will not be needed.
  1598. + # 
  1599. + # -- BUGS --
  1600. + # 
  1601. + #     I don't know of any.  This code has been running at Rutgers since
  1602. + #     version 2.10.3 of news.
  1603. + # 
  1604. + #     I have not attempted to run this code together with Stan Barber's
  1605. + #     nntp support code.  Offhand, I'm guessing that you'll be in for some
  1606. + #     nasty surprises if you attempt to do so.
  1607. + # 
  1608. + # -- WHERE TO FIND HELP --
  1609. + # 
  1610. + #     This script and a real working knowledge of NFS is all one really
  1611. + #     needs.  However, I'm am willing to answer most any question
  1612. + #     regarding the NFS support code.  My address and telephone number are
  1613. + #     given below....
  1614. + #
  1615. + #  Mel Pleasant
  1616. + #  (201) 932-2023  --  uucp: {most-any-backbone-site}!rutgers!pleasant
  1617. + #           internet: pleasant@RUTGERS.EDU
  1618. + #
  1619. + rm -f Makefile
  1620. + cp Makefile.dst Makefile
  1621. + chmod u+w Makefile
  1622. + ed - Makefile  <<'EOF'
  1623. + /HOME=/s/exptools//
  1624. + /NEWSGRP/s/news/daemon/
  1625. + /BATCHDIR/s;batch;newsbatch/batch;
  1626. + /BINDIR/s;bin;local/bin;
  1627. + /UUXFLAGS/s/-r -z/-r -z -n -gd/
  1628. + /LNRNEWS/s/ln/ln -s/
  1629. + g/^#NFSCLIENT /s///
  1630. + g/^#V7 /s///
  1631. + g/^#USG /d
  1632. + g/^#BSD4_3 /d
  1633. + g/^#BSD4_2 /s///
  1634. + g/^#BSD4_1 /d
  1635. + g/#NOTVMS/s/#NOTVMS.*//
  1636. + w
  1637. + q
  1638. + EOF
  1639. + rm -f defs.h
  1640. + cp defs.dist defs.h
  1641. + chmod u+w defs.h
  1642. + ed - defs.h <<'EOF'
  1643. + /ROOTID/s/10/100/
  1644. + /N_UMASK/s/000/022/
  1645. + /DFLTSUB/s/general,all.announce/all,all.all/
  1646. + /ADMSUB/s/general,all.announce/announce,all.announce,general,all.general/
  1647. + /DFTXMIT/s/-z/-z -gd/
  1648. + s;uux;/usr/bin/uux;
  1649. + /UXMIT/s/-z/-z -gd/
  1650. + s;uux;/usr/bin/uux;
  1651. + /DFTEDITOR/s;vi;/bin/emacs;
  1652. + /INTERNET/s;/\* ;;
  1653. + /MYDOMAIN/s/\.UUCP//
  1654. + /GHNAME/s;/\* ;;
  1655. + /DOXREFS/s;/\* ;;
  1656. + /BSD4_2/s;/\* ;;
  1657. + /ALWAYSALIAS/s;/\* ;;
  1658. + /SENDMAIL/s;/\* ;;
  1659. + /MYORG/s/Frobozz Inc., St. Louis/Rutgers Univ., New Brunswick, N.J./
  1660. + /FASCIST/s;/\* ;;
  1661. + s/all\.all/systems.dev/
  1662. + /ORGDISTRIB/s;/\* ;;
  1663. + s/froozum/ru/
  1664. + /MODFILEONLY/s;/\* ;;
  1665. + /NFSCMDFORMAT/s;".*";"/usr/lib/news/nntpxmit -a \\"%s\\" \\"%s\\"";
  1666. + /NFSCMDARGS/s/NFSSYSNAME,ARTICLE/ARTICLE,NFSSYSNAME/
  1667. + w
  1668. + q
  1669. + EOF
  1670.  
  1671. Index: params.h
  1672. Prereq: 2.26
  1673. *** .d/params.h    Wed Nov  4 14:57:43 1987
  1674. --- params.h    Thu Nov 19 16:54:23 1987
  1675. ***************
  1676. *** 4,6 ****
  1677.   
  1678. ! /*    @(#)params.h    2.26    11/4/87    */
  1679.   
  1680. --- 4,6 ----
  1681.   
  1682. ! /*    @(#)params.h    2.27    11/19/87    */
  1683.   
  1684. ***************
  1685. *** 67,69 ****
  1686.   extern    char    *SPOOL, *LIB, *BIN, *SUBFILE, *ACTIVE;
  1687. ! extern    char    *LOCKFILE, *SEQFILE, *ARTFILE;
  1688.   extern    char    *news_version, *Progname;
  1689. --- 67,69 ----
  1690.   extern    char    *SPOOL, *LIB, *BIN, *SUBFILE, *ACTIVE;
  1691. ! extern    char    *LOCKFILE, *SEQFILE, *ARTFILE, *BUGFILE;
  1692.   extern    char    *news_version, *Progname;
  1693.  
  1694. Index: pathinit.c
  1695. Prereq: 1.24
  1696. *** .d/pathinit.c    Thu Oct  8 00:22:31 1987
  1697. --- pathinit.c    Thu Nov 19 16:54:24 1987
  1698. ***************
  1699. *** 36,38 ****
  1700.   #ifdef SCCSID
  1701. ! static char    *SccsId = "@(#)pathinit.c    1.24    10/7/87";
  1702.   #endif /* SCCSID */
  1703. --- 36,38 ----
  1704.   #ifdef SCCSID
  1705. ! static char    *SccsId = "@(#)pathinit.c    1.25    11/19/87";
  1706.   #endif /* SCCSID */
  1707. ***************
  1708. *** 58,62 ****
  1709.   char *LOCKFILE, *SEQFILE, *ARTICLE, *INFILE, *TELLME;
  1710.   
  1711. ! int c_cancel(), c_newgroup(), c_ihave(), c_sendme(), c_rmgroup(),
  1712.       c_sendsys(), c_version(), c_checkgroups(), c_unimp();
  1713.   
  1714. --- 58,67 ----
  1715.   char *LOCKFILE, *SEQFILE, *ARTICLE, *INFILE, *TELLME;
  1716. + int c_cancel();
  1717.   
  1718. ! #ifdef NFSCLIENT
  1719. ! char *NFSSYSNAME;
  1720. ! #else /* !NFSCLIENT */
  1721. ! int c_newgroup(), c_ihave(), c_sendme(), c_rmgroup(),
  1722.       c_sendsys(), c_version(), c_checkgroups(), c_unimp();
  1723. + #endif /* !NFSCLIENT */
  1724.   
  1725. ***************
  1726. *** 64,65 ****
  1727. --- 69,71 ----
  1728.       "cancel", NULL, c_cancel,
  1729. + #ifndef NFSCLIENT
  1730.       "newgroup", NULL, c_newgroup,
  1731. ***************
  1732. *** 73,74 ****
  1733. --- 79,81 ----
  1734.       "delsub", NULL, c_unimp,
  1735. + #endif /* !NFSCLIENT */
  1736.       NULL, NULL, NULL
  1737. ***************
  1738. *** 78,80 ****
  1739.   #if defined(INEW) || defined(READ)
  1740. ! char *ALIASES;
  1741.   #endif /* INEW || READ */
  1742. --- 85,87 ----
  1743.   #if defined(INEW) || defined(READ)
  1744. ! char *ALIASES, *BUGFILE;
  1745.   #endif /* INEW || READ */
  1746. ***************
  1747. *** 123,125 ****
  1748. --- 130,146 ----
  1749.       extern char *mydomain();
  1750. + #endif /* CHKN */
  1751.   
  1752. + #ifdef HOME
  1753. +     /* Relative to the home directory of user HOME */
  1754. +     (void) sprintf(bfr, "%s/%s", logdir(HOME), SPOOLDIR);
  1755. +     SPOOL = AllocCpy(bfr);
  1756. +     (void) sprintf(bfr, "%s/%s", logdir(HOME), LIBDIR);
  1757. +     LIB = AllocCpy(bfr);
  1758. + #else /* !HOME */
  1759. +     /* Fixed paths defined in Makefile */
  1760. +     SPOOL = AllocCpy(SPOOLDIR);
  1761. +     LIB = AllocCpy(LIBDIR);
  1762. + #endif /* !HOME */
  1763. + #ifndef CHKN
  1764.       uname(&ubuf);
  1765. ***************
  1766. *** 154,167 ****
  1767.   
  1768. - #ifdef HOME
  1769. -     /* Relative to the home directory of user HOME */
  1770. -     (void) sprintf(bfr, "%s/%s", logdir(HOME), SPOOLDIR);
  1771. -     SPOOL = AllocCpy(bfr);
  1772. -     (void) sprintf(bfr, "%s/%s", logdir(HOME), LIBDIR);
  1773. -     LIB = AllocCpy(bfr);
  1774. - #else /* !HOME */
  1775. -     /* Fixed paths defined in Makefile */
  1776. -     SPOOL = AllocCpy(SPOOLDIR);
  1777. -     LIB = AllocCpy(LIBDIR);
  1778. - #endif /* !HOME */
  1779.   #ifdef LOGDIR
  1780. --- 175,176 ----
  1781. ***************
  1782. *** 200,201 ****
  1783. --- 209,211 ----
  1784.       Sprintf(ALIASES, "%s/aliases", LIB);
  1785. +     Sprintf(BUGFILE, "%s/buggroups", LIB);
  1786.   # endif /* READ || INEW */
  1787. ***************
  1788. *** 204,205 ****
  1789. --- 214,216 ----
  1790.       Sprintf(SEQFILE, "%s/seq", LIB);
  1791. + #ifndef NFSCLIENT
  1792.       Sprintf(ARTICLE, "%s/.arXXXXXX", SPOOL);
  1793. ***************
  1794. *** 206,207 ****
  1795. --- 217,223 ----
  1796.       Sprintf(INFILE, "%s/.inXXXXXX", SPOOL);
  1797. + #else /* NFSCLIENT */
  1798. +     Sprintf(ARTICLE, "/tmp/.arXXXXXX", SPOOL);
  1799. +     Sprintf(INFILE, "/tmp/.inXXXXXX", SPOOL);
  1800. +     parse_nfssysname();
  1801. + #endif /* NFSCLIENT */
  1802.   /*
  1803. ***************
  1804. *** 352,353 ****
  1805. --- 368,397 ----
  1806.   #endif /* NOTIFY */
  1807. + #ifdef NFSCLIENT
  1808. + parse_nfssysname()
  1809. + {
  1810. +     FILE *nfsfd;
  1811. +     extern FILE *mailhdr();
  1812. +     char *nfsp;
  1813. +     char buf[BUFSIZ];
  1814. +     sprintf(buf, "%s/nfssysname", LIB);
  1815. +     if ((nfsfd = fopen(buf, "r"))) {
  1816. +         (void) fgets(buf, sizeof buf, nfsfd);
  1817. +         (void) fclose(nfsfd);
  1818. +         if (nfsp = index(buf, '\n')) *nfsp = '\0';
  1819. +         NFSSYSNAME = AllocCpy(buf);
  1820. +         return;
  1821. +     }
  1822. +     if (nfsfd = mailhdr((struct hbuf *)NULL, "Missing File")) {
  1823. +         (void) fprintf(nfsfd, "Can't find %s.\n\n", buf);
  1824. +         (void) fprintf(nfsfd, "On an NFS client, inews cannot ");
  1825. +         (void) fprintf(nfsfd, "operate without this file.\n");
  1826. +         (void) mclose(nfsfd);
  1827. +     }
  1828. +     xerror("Can't find %s.\nComplain to your new/systems manager.\n", buf);
  1829. + }    
  1830. + #endif /* NFSCLIENT */
  1831.   #endif /* INEW */
  1832.  
  1833. Index: postnews.c
  1834. Prereq: 1.34
  1835. *** .d/postnews.c    Wed Nov  4 14:57:57 1987
  1836. --- postnews.c    Thu Nov 19 16:54:27 1987
  1837. ***************
  1838. *** 19,21 ****
  1839.   #ifdef SCCSID
  1840. ! static char    *SccsId = "@(#)postnews.c    1.34    11/4/87";
  1841.   #endif /* SCCSID */
  1842. --- 19,21 ----
  1843.   #ifdef SCCSID
  1844. ! static char    *SccsId = "@(#)postnews.c    1.35    11/19/87";
  1845.   #endif /* SCCSID */
  1846. ***************
  1847. *** 107,109 ****
  1848.           getpr("In what newsgroup was the article posted? ",ng);
  1849. !         if (!valid_ng(ng, &i, &j, &canpost))
  1850.               if (canpost == 'i' )
  1851. --- 107,109 ----
  1852.           getpr("In what newsgroup was the article posted? ",ng);
  1853. !         if (!valid_ng(ng, &i, &j, &canpost, TRUE))
  1854.               if (canpost == 'i' )
  1855. ***************
  1856. *** 304,306 ****
  1857.   #endif    /* !SERVER */
  1858. !         if (valid_ng(buf, &i, &i, &canpost)) {
  1859.               if (n++ != 0)
  1860. --- 304,306 ----
  1861.   #endif    /* !SERVER */
  1862. !         if (valid_ng(buf, &i, &i, &canpost, FALSE)) {
  1863.               if (n++ != 0)
  1864. ***************
  1865. *** 925,929 ****
  1866.   /* verify that newsgroup exists, and get number of entries */
  1867. ! valid_ng(ng, maxart, minart, canpost)
  1868. ! char *ng;
  1869.   long *maxart, *minart;
  1870.   char *canpost;
  1871. --- 925,931 ----
  1872.   /* verify that newsgroup exists, and get number of entries */
  1873. ! valid_ng(ng, maxart, minart, canpost, exact)
  1874. !      char *ng;
  1875. !      
  1876.   long *maxart, *minart;
  1877. + int exact;
  1878.   char *canpost;
  1879. ***************
  1880. *** 930,933 ****
  1881.   {
  1882. !     char ng_check[BUFLEN], ng_read[BUFLEN];
  1883.       FILE *fp;
  1884.   
  1885. --- 932,936 ----
  1886.   {
  1887. !     char ng_check[BUFLEN], ng_read[BUFLEN], *cp;
  1888.       FILE *fp;
  1889. +     int found_ng;
  1890.   
  1891. ***************
  1892. *** 964,966 ****
  1893.       }
  1894. !     *canpost = 'i';
  1895.       *maxart = 0;
  1896. --- 967,969 ----
  1897.       }
  1898. !     (void) fclose(fp);
  1899.       *maxart = 0;
  1900. ***************
  1901. *** 967,970 ****
  1902.       *minart = 0;
  1903.       (void) fclose(fp);
  1904. !     return FALSE;
  1905.   }
  1906. --- 970,992 ----
  1907.       *minart = 0;
  1908. +     *canpost = 'i';
  1909. +     if (exact) {
  1910. +         return FALSE;
  1911. +     }
  1912. +     if ((fp = fopen(BUGFILE, "r")) == NULL) {
  1913. +         return FALSE;
  1914. +     }
  1915. +     found_ng = FALSE;
  1916. +     while (!found_ng && fgets(ng_check, BUFLEN, fp) == ng_check) {
  1917. +         if (ng_check[0] == '#')
  1918. +             continue;
  1919. +         cp = index(ng_check, '\n');
  1920. +         *cp = '.';
  1921. +         if (prefix(ng, ng_check))
  1922. +             found_ng = TRUE;
  1923. +     }
  1924.       (void) fclose(fp);
  1925. !     if (!found_ng)
  1926. !         return FALSE;
  1927. !     *canpost = 'y';
  1928. !     return TRUE;
  1929.   }
  1930.  
  1931. Index: process.c
  1932. Prereq: 2.17
  1933. *** .d/process.c    Wed Dec 17 18:23:25 1986
  1934. --- process.c    Thu Nov 19 16:54:28 1987
  1935. ***************
  1936. *** 18,20 ****
  1937.   #ifdef SCCSID
  1938. ! static char    *SccsId = "@(#)process.c    2.17    12/16/86";
  1939.   #endif /* SCCSID */
  1940. --- 18,20 ----
  1941.   #ifdef SCCSID
  1942. ! static char    *SccsId = "@(#)process.c    2.18    11/19/87";
  1943.   #endif /* SCCSID */
  1944. ***************
  1945. *** 40,41 ****
  1946. --- 40,42 ----
  1947.   'h',    '\0',    FALSE,    OPTION,    ANY,        UNKNOWN,(char *)NULL,
  1948. + 'A',    '\0',    FALSE,    OPTION, UNKNOWN,    UNKNOWN,(char *)NULL,
  1949.   #ifdef TMAIL
  1950.  
  1951. Index: recnews.c
  1952. Prereq: 2.15
  1953. *** .d/recnews.c    Wed Nov  4 14:58:14 1987
  1954. --- recnews.c    Thu Nov 19 16:54:30 1987
  1955. ***************
  1956. *** 1,3 ****
  1957.   /*
  1958. !  * recnews [to newsgroup] [from user] [approved by]
  1959.    *
  1960. --- 1,3 ----
  1961.   /*
  1962. !  * recnews [to newsgroup] [from user] [approved by] [exclude site]
  1963.    *
  1964. ***************
  1965. *** 45,46 ****
  1966. --- 45,48 ----
  1967.    *         for use with local groups for mailing lists with 2.11.
  1968. +  * pleasant@rutgers.EDU: add fourth argument which uses the -x switch in inews
  1969. +  *
  1970.    */
  1971. ***************
  1972. *** 48,50 ****
  1973.   #ifdef SCCSID
  1974. ! static char    *SccsId = "@(#)recnews.c    2.15    11/4/87";
  1975.   #endif /* SCCSID */
  1976. --- 50,52 ----
  1977.   #ifdef SCCSID
  1978. ! static char    *SccsId = "@(#)recnews.c    2.16    11/19/87";
  1979.   #endif /* SCCSID */
  1980. ***************
  1981. *** 92,93 ****
  1982. --- 94,96 ----
  1983.   char    approved[BFSZ];        /* Approved: */
  1984. + char    not_this_site[BFSZ];    /* Don't post to this site */
  1985.   int    fromset;        /* from passed on command line */
  1986. ***************
  1987. *** 123,124 ****
  1988. --- 126,131 ----
  1989.           approved[0] = '\0';
  1990. +     if (argc > 4 && *argv[4]) {
  1991. +         sprintf(not_this_site, " -x \"%s\"", argv[4]);
  1992. +     } else
  1993. +         not_this_site[0] = '\0';
  1994.   
  1995. ***************
  1996. *** 176,178 ****
  1997.           case INCLUSIVE:
  1998. !             sprintf(cmdbuf,"exec %s -p", inews);
  1999.               pipe = popen(cmdbuf,"w");
  2000. --- 183,185 ----
  2001.           case INCLUSIVE:
  2002. !             sprintf(cmdbuf,"exec %s%s -p", inews, not_this_site);
  2003.               pipe = popen(cmdbuf,"w");
  2004. ***************
  2005. *** 196,200 ****
  2006.               sprintf(cmdbuf,
  2007. !                 "exec %s -t \"%s\" -n \"%s\" -f \"%s\"%s",
  2008.                   inews, *subject ? subject : "(none)",
  2009. !                 newsgroup, from, approved);
  2010.   #ifdef debug
  2011. --- 203,207 ----
  2012.               sprintf(cmdbuf,
  2013. !                 "exec %s -t \"%s\" -n \"%s\" -f \"%s\"%s%s",
  2014.                   inews, *subject ? subject : "(none)",
  2015. !                 newsgroup, from, approved, not_this_site);
  2016.   #ifdef debug
  2017. ***************
  2018. *** 224,227 ****
  2019.               sprintf(cmdbuf,
  2020. !                 "exec \"%s\" -t \"%s\" -n \"%s\" -f \"%s\"%s",
  2021. !                 inews, subject, newsgroup, from, approved);
  2022.   #ifdef debug
  2023. --- 231,235 ----
  2024.               sprintf(cmdbuf,
  2025. !                 "exec \"%s\" -t \"%s\" -n \"%s\" -f \"%s\"%s%s",
  2026. !                 inews, subject, newsgroup, from, approved,
  2027. !                 not_this_site);
  2028.   #ifdef debug
  2029.  
  2030. Index: uname.c
  2031. Prereq: 2.16
  2032. *** .d/uname.c    Wed Oct  7 16:55:03 1987
  2033. --- uname.c    Thu Nov 19 16:54:31 1987
  2034. ***************
  2035. *** 23,25 ****
  2036.   #ifdef SCCSID
  2037. ! static char    *SccsId = "@(#)uname.c    2.16    9/24/87";
  2038.   #endif /* SCCSID */
  2039. --- 23,25 ----
  2040.   #ifdef SCCSID
  2041. ! static char    *SccsId = "@(#)uname.c    2.17    11/19/87";
  2042.   #endif /* SCCSID */
  2043. ***************
  2044. *** 43,44 ****
  2045. --- 43,46 ----
  2046.       gethostname(uptr->nodename, sizeof (uptr->nodename));
  2047. +     for (cp = uptr->nodename; *cp == '\0'; cp++)
  2048. +         if (isupper(*cp)) *cp = tolower(*cp);
  2049.       cp = mydomain();
  2050.  
  2051. Index: patchlevel.h
  2052. Prereq: 12
  2053. *** .d/patchlevel.h    Wed Nov  4 14:46:19 1987
  2054. --- patchlevel.h    Thu Nov 19 17:28:23 1987
  2055. ***************
  2056. *** 1,3 ****
  2057. ! #define    PATCHLEVEL    12
  2058.   
  2059. ! #define NEWS_VERSION   "B 2.11 11/04/87"
  2060. --- 1,3 ----
  2061. ! #define    PATCHLEVEL    13
  2062.   
  2063. ! #define NEWS_VERSION   "B 2.11 11/19/87"
  2064.  
  2065.  
  2066.