home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume7 / 2.11news / part15 < prev    next >
Text File  |  1986-11-30  |  62KB  |  2,676 lines

  1. Subject:  v07i054:  2.11 News Source, Part05/09
  2. Newsgroups: mod.sources
  3. Approved: mirror!rs
  4.  
  5. Submitted by: seismo!rick (Rick Adams)
  6. Mod.sources: Volume 7, Issue 54
  7. Archive-name: 2.11news/Part15
  8.  
  9. # To extract, sh this file
  10. #
  11. #    news 2.11 source part 5 of 9
  12. #
  13. if test ! -d src
  14. then
  15.     mkdir src
  16. fi
  17. echo x - src/expire.c 1>&2
  18. sed 's/.//' >src/expire.c <<'*-*-END-of-src/expire.c-*-*'
  19. -/*
  20. - * This software is Copyright (c) 1986 by Rick Adams.
  21. - *
  22. - * Permission is hereby granted to copy, reproduce, redistribute or
  23. - * otherwise use this software as long as: there is no monetary
  24. - * profit gained specifically from the use or reproduction or this
  25. - * software, it is not sold, rented, traded or otherwise marketed, and
  26. - * this copyright notice is included prominently in any copy
  27. - * made.
  28. - *
  29. - * The author make no claims as to the fitness or correctness of
  30. - * this software for any use whatsoever, and it is provided as is. 
  31. - * Any use of this software is at the user's own risk.
  32. - *
  33. - * expire - expire daemon runs around and nails all articles that
  34. - *         have expired.
  35. - */
  36. -
  37. -#ifdef SCCSID
  38. -static char    *SccsId = "@(#)expire.c    2.47    10/23/86";
  39. -#endif /* SCCSID */
  40. -
  41. -#include "params.h"
  42. -#include <errno.h>
  43. -#if defined(BSD4_2) || defined(BSD4_1C)
  44. -# include <sys/dir.h>
  45. -# include <sys/file.h>
  46. -#else
  47. -# include "ndir.h"
  48. -# ifdef LOCKF
  49. -# include <unistd.h>
  50. -# endif /* LOCKF */
  51. -#endif
  52. -
  53. -char *Progname = "expire";    /* used by xerror to identify failing program */
  54. -
  55. -/*    Number of array entries to allocate at a time.    */
  56. -#define SPACE_INCREMENT    1000
  57. -
  58. -struct expdata {
  59. -    char *e_name;
  60. -    long e_min, e_max;
  61. -    time_t    e_droptime, e_expiretime;
  62. -    char e_ignorexp;
  63. -    char e_doarchive;
  64. -    char e_doexpire;
  65. -};
  66. -
  67. -extern int    errno;
  68. -char    NARTFILE[BUFLEN], OARTFILE[BUFLEN];
  69. -char    PAGFILE[BUFLEN], DIRFILE[BUFLEN];
  70. -char    NACTIVE[BUFLEN], OACTIVE[BUFLEN];
  71. -char    recdate[BUFLEN];
  72. -long    rectime, exptime;
  73. -extern char *OLDNEWS;
  74. -int    verbose = 0;
  75. -int    ignorexp = 0;
  76. -int    doarchive = 0;
  77. -int    nohistory = 0;
  78. -int    dorebuild = 0;
  79. -int    usepost = 0;
  80. -int    frflag = 0;
  81. -int    updateactive = 0;
  82. -char    baduser[BUFLEN];
  83. -extern     char filename[], nbuf[];
  84. -
  85. -struct timeb Now;
  86. -
  87. -/*
  88. - * This code uses realloc to get more of the multhist array.
  89. - */
  90. -struct multhist {
  91. -    char    *mh_ident;
  92. -    char    *mh_file;
  93. -} *multhist;
  94. -unsigned int mh_size;
  95. -char *calloc();
  96. -char *realloc();
  97. -struct tm *gmtime();
  98. -
  99. -typedef struct {
  100. -    char *dptr;
  101. -    int dsize;
  102. -} datum;
  103. -
  104. -long    expincr;
  105. -long    dropincr;
  106. -long    atol();
  107. -time_t    cgtdate(), time();
  108. -FILE *popen();
  109. -struct passwd *pw;
  110. -struct group *gp;
  111. -char    arpat[LBUFLEN];
  112. -int    arpatlen = 0;
  113. -char    ngpat[LBUFLEN];
  114. -int    ngpatlen = 0;
  115. -char    afline[BUFLEN];
  116. -char    grpsleft[BUFLEN];
  117. -struct hbuf h;
  118. -int    ExpireLock;
  119. -
  120. -main(argc, argv)
  121. -int    argc;
  122. -char    **argv;
  123. -{
  124. -    register char    *p1, *p2, *p3;
  125. -    register time_t newtime, today;
  126. -    register FILE *fp = NULL;
  127. -    FILE    *ohfd, *nhfd;
  128. -    DIR    *ngdirp = NULL;
  129. -    static struct direct *ngdir;
  130. -    char fn[BUFLEN];
  131. -    int i, LockFd;
  132. -#ifndef DBM
  133. -    char *ptr, chr;
  134. -    FILE *subfd[10];
  135. -    char *histfile();
  136. -#endif /* !DBM */
  137. -
  138. -    pathinit();
  139. -    (void) umask(N_UMASK);
  140. -
  141. -    /*
  142. -     * Try to run as NEWSUSR/NEWSGRP
  143. -     */
  144. -    if ((pw = getpwnam(NEWSUSR)) == NULL)
  145. -        xerror("Cannot get NEWSUSR pw entry");
  146. -
  147. -    uid = pw->pw_uid;
  148. -    if ((gp = getgrnam(NEWSGRP)) == NULL)
  149. -        xerror("Cannot get NEWSGRP gr entry");
  150. -    gid = gp->gr_gid;
  151. -    (void) setgid(gid);
  152. -    (void) setuid(uid);
  153. -
  154. -    expincr = DFLTEXP;
  155. -    dropincr = HISTEXP;
  156. -    ngpat[0] = ',';
  157. -    arpat[0] = ',';
  158. -    while (argc > 1) {
  159. -        switch (argv[1][1]) {
  160. -        case 'v':
  161. -            if (isdigit(argv[1][2]))
  162. -                verbose = argv[1][2] - '0';
  163. -            else if (argc > 2 && argv[2][0] != '-') {
  164. -
  165. -                argv++;
  166. -                argc--;
  167. -                verbose = atoi(argv[1]);
  168. -            } else
  169. -                verbose = 1;
  170. -            if (verbose < 3)
  171. -                setbuf(stdout, (char *)NULL);
  172. -            break;
  173. -        case 'e':    /* Use this as default expiration time */
  174. -            if (argc > 2 && argv[2][0] != '-') {
  175. -                argv++;
  176. -                argc--;
  177. -                expincr = atol(argv[1]) * DAYS;
  178. -            } else if (isdigit(argv[1][2]))
  179. -                expincr = atol(&argv[1][2]) * DAYS;
  180. -            break;
  181. -        case 'E':    /* Use this as default forget time */
  182. -            if (argc > 2 && argv[2][0] != '-') {
  183. -                argv++;
  184. -                argc--;
  185. -                dropincr = atol(argv[1]) * DAYS;
  186. -            } else if (isdigit(argv[1][2]))
  187. -                dropincr = atol(&argv[1][2]) * DAYS;
  188. -            break;
  189. -        case 'I':    /* Ignore any existing expiration date */
  190. -            ignorexp = 2;
  191. -            break;
  192. -        case 'i':    /* Ignore any existing expiration date */
  193. -            ignorexp = 1;
  194. -            break;
  195. -        case 'n':
  196. -            if (argc > 2) {
  197. -                argv++;
  198. -                argc--;
  199. -                while (argc > 1 && argv[1][0] != '-') {
  200. -                    int argvlen;
  201. -                    argvlen = strlen(argv[1]);
  202. -                    if (ngpatlen + argvlen + 2 > sizeof (ngpat)) {
  203. -                        xerror("Too many groups specified for -n\n");
  204. -                    }
  205. -                    if (ngpat[ngpatlen] == '\0') {
  206. -                        ngpat[ngpatlen++] = ',';
  207. -                        ngpat[ngpatlen] = '\0';
  208. -                    }
  209. -                    strcpy(&ngpat[ngpatlen], argv[1]);
  210. -                    ngpatlen += argvlen;
  211. -                    argv++;
  212. -                    argc--;
  213. -                }
  214. -                argv--;
  215. -                argc++;
  216. -            }
  217. -            break;
  218. -        case 'a':    /* archive expired articles */
  219. -            if (access(OLDNEWS,0) < 0){
  220. -                perror(OLDNEWS);
  221. -                xerror("No archiving possible\n");
  222. -            }
  223. -            doarchive++;
  224. -            if (argc > 2) {
  225. -                argv++;
  226. -                argc--;
  227. -                while (argc > 1 && argv[1][0] != '-') {
  228. -                    int argvlen;
  229. -                    argvlen = strlen(argv[1]);
  230. -                    if (arpatlen + argvlen + 2 > sizeof (arpat)) {
  231. -                        xerror("Too many groups specified for -a\n");
  232. -                    }
  233. -                    if (arpat[arpatlen] == '\0') {
  234. -                        arpat[arpatlen++] = ',';
  235. -                        arpat[arpatlen] = '\0';
  236. -                    }
  237. -                    strcpy(&arpat[arpatlen], argv[1]);
  238. -                    arpatlen += argvlen;
  239. -                    argv++;
  240. -                    argc--;
  241. -                }
  242. -                argv--;
  243. -                argc++;
  244. -            }
  245. -            break;
  246. -        case 'h':    /* ignore history */
  247. -            nohistory++;
  248. -            break;
  249. -        case 'r':    /* rebuild history file */
  250. -            dorebuild++;
  251. -            nohistory++;
  252. -            break;
  253. -        case 'p':
  254. -            usepost++;
  255. -            break;
  256. -        case 'f':
  257. -            frflag++;
  258. -            if (argc > 2) {
  259. -                strcpy(baduser, argv[2]);
  260. -                argv++;
  261. -                argc--;
  262. -            }
  263. -            break;
  264. -        case 'u':
  265. -            updateactive++;
  266. -            break;
  267. -        default:
  268. -            printf("Usage: expire [ -v [level] ] [-e days ] [-i] [-a] [-r] [-h] [-p] [-u] [-f username] [-n newsgroups]\n");
  269. -            xxit(1);
  270. -        }
  271. -        argc--;
  272. -        argv++;
  273. -    }
  274. -    if (dropincr < expincr) {
  275. -        dropincr = HISTEXP;
  276. -        fprintf(stderr, "History expiration time < article expiration time. Default used.\n");
  277. -    }
  278. -    if (ngpat[0] == ',')
  279. -        (void) strcpy(ngpat, "all,");
  280. -    if (arpat[0] == ',')
  281. -        (void) strcpy(arpat, "all,");
  282. -    (void) ftime(&Now);
  283. -    today = Now.time;
  284. -    if (chdir(SPOOL))
  285. -        xerror("Cannot chdir %s", SPOOL);
  286. -
  287. -    if (verbose) {
  288. -        printf("expire: nohistory %d, rebuild %d, doarchive %d\n",
  289. -            nohistory, dorebuild, doarchive);
  290. -        printf("newsgroups: %s\n",ngpat);
  291. -        if (doarchive)
  292. -            printf("archiving: %s\n",arpat);
  293. -    }
  294. -
  295. -    (void) sprintf(OARTFILE, "%s/%s", LIB, "ohistory");
  296. -    (void) sprintf(NARTFILE, "%s/%s", LIB, "nhistory");
  297. -
  298. -    (void) sprintf(OACTIVE, "%s/%s", LIB, "oactive");
  299. -    (void) sprintf(NACTIVE, "%s/%s", LIB, "nactive");
  300. -
  301. -    if (updateactive)
  302. -        goto doupdateactive;
  303. -
  304. -#ifdef DBM
  305. -    if (!dorebuild) {
  306. -        (void) sprintf(PAGFILE, "%s/%s", LIB, "nhistory.pag");
  307. -        (void) sprintf(DIRFILE, "%s/%s", LIB, "nhistory.dir");
  308. -        (void) close(creat(PAGFILE, 0666));
  309. -        (void) close(creat(DIRFILE, 0666));
  310. -         initdbm(NARTFILE);
  311. -    }
  312. -#endif
  313. -
  314. -    if (nohistory) {
  315. -        ohfd = xfopen(ACTIVE, "r");
  316. -        if (dorebuild) {
  317. -            /* Allocate initial space for multiple newsgroup (for an
  318. -               article) array */
  319. -            multhist = (struct multhist *)calloc (SPACE_INCREMENT,
  320. -                    sizeof (struct multhist));
  321. -            mh_size = SPACE_INCREMENT;
  322. -
  323. -            (void) sprintf(afline, "exec sort -t\t +1.6 -2 +1 >%s", NARTFILE);
  324. -            if ((nhfd = popen(afline, "w")) == NULL)
  325. -                xerror("Cannot exec %s", afline);
  326. -        } else
  327. -            nhfd = xfopen("/dev/null", "w");
  328. -    } else {
  329. -        ohfd = xfopen(ARTFILE, "r");
  330. -        nhfd = xfopen(NARTFILE, "w");
  331. -    }
  332. -
  333. -    /* set up exclusive locking so inews doesn't run while expire does */
  334. -#if defined(BSD4_2) || defined(LOCKF)
  335. -    LockFd = open(ACTIVE, 2);
  336. -#ifdef    LOCKF
  337. -    (void) lockf(LockFd, F_LOCK, 0);
  338. -#else    /* BSD4_2 */
  339. -    (void) flock(LockFd, LOCK_EX);
  340. -#endif    /* BSd4_2 */
  341. -#else    /* !BSD4_2 && !LOCKF */
  342. -    i = 0;
  343. -    sprintf(afline,"%s.lock", ACTIVE);
  344. -    while (LINK(ACTIVE, afline) < 0 && errno == EEXIST) {
  345. -        if (i++ > 5)
  346. -            xerror("Can't get lock for expire");
  347. -        sleep(i*2);
  348. -    }
  349. -        
  350. -#endif    /* !BSD4_2  && !LOCKF */
  351. -
  352. -    for(i=0;i<NUNREC;i++)
  353. -        h.unrec[i] = NULL;
  354. -
  355. -    while (TRUE) {
  356. -        fp = NULL;
  357. -        if (nohistory) {
  358. -            recdate[0] = '\0';
  359. -            do {
  360. -                if (ngdir == NULL) {
  361. -                    if ( ngdirp != NULL )
  362. -                        closedir(ngdirp);
  363. -                    if (fgets(afline, BUFLEN, ohfd) == NULL)
  364. -                        goto out;
  365. -                    (void) strcpy(nbuf, afline);
  366. -                    p1 = index(nbuf, ' ');
  367. -                    if (p1 == NULL)
  368. -                        p1 = index(nbuf, '\n');
  369. -                    if (p1 != NULL)
  370. -                        *p1 = NULL;
  371. -                    if (!ngmatch(nbuf, ngpat))
  372. -                        continue;
  373. -
  374. -                    /* Change a group name from
  375. -                       a.b.c to a/b/c */
  376. -                    for (p1=nbuf; *p1; p1++)
  377. -                        if (*p1 == '.')
  378. -                            *p1 = '/';
  379. -
  380. -                    if ((ngdirp = opendir(nbuf)) == NULL)
  381. -                        continue;
  382. -
  383. -                }
  384. -                ngdir = readdir(ngdirp);
  385. -            /*    Continue looking if not an article.    */
  386. -            } while (ngdir == NULL || !islegal(fn,nbuf,ngdir->d_name));
  387. -
  388. -            p2 = fn;
  389. -            if (verbose > 2)
  390. -                printf("article: %s\n", fn);
  391. -            strcpy(filename, dirname(fn));
  392. -            fp = access(filename, 04) ? NULL : art_open(filename, "r");
  393. -        } else {
  394. -            char dc;
  395. -            if (fgets(afline, BUFLEN, ohfd) == NULL)
  396. -                break;
  397. -            if (verbose > 2)
  398. -                printf("article: %s", afline);
  399. -            p1 = index(afline, '\t');
  400. -            if (!p1)
  401. -                continue;
  402. -            *p1 = '\0';
  403. -            (void) strcpy(h.ident, afline);
  404. -            *p1 = '\t';
  405. -            p2 = index(p1 + 1, '\t');
  406. -            if (!p2)
  407. -                continue;
  408. -            *p2 = '\0';
  409. -            (void) strcpy(recdate, p1+1);
  410. -            rectime = cgtdate(recdate);
  411. -            *p2++ = '\t';
  412. -            (void) strcpy(nbuf, p2);
  413. -            p3 = index(nbuf, '/');
  414. -            if (p3) {
  415. -                register char *p4;
  416. -
  417. -                p4 = index(p3, '\n');
  418. -                if (p4) {
  419. -                    while (p4[-1] == ' ')
  420. -                        p4--;
  421. -                    *p4 = '\0';
  422. -                }
  423. -
  424. -                /*
  425. -                 * convert list of newsgroups from
  426. -                 *    ng1/num ng2/num ...
  427. -                 * to
  428. -                 *    ng1,ng2,...
  429. -                 */
  430. -                p4 = p3;
  431. -                do {
  432. -                    *p3++ = NGDELIM;
  433. -                    while (*p4 != '\0' && *p4 != ' ')
  434. -                        p4++;
  435. -                    if (*p4++ == '\0') {
  436. -                        *--p3 = '\0';
  437. -                        break;
  438. -                    }
  439. -                    while (*p3 = *p4++) {
  440. -                        if (*p3 == '/')
  441. -                            break;
  442. -                        else
  443. -                            p3++;
  444. -                    }
  445. -                } while (*p3);
  446. -            } else {
  447. -                /*
  448. -                 * Nothing after the 2nd tab.  This happens
  449. -                 * when there's no message left in the spool
  450. -                 * directory, only the memory of it in the
  451. -                 * history file. Use date in the history file
  452. -                 * to decide if we should keep this article.
  453. -                 */
  454. -                grpsleft[0] = '\0';
  455. -                goto checkdate;
  456. -            }
  457. -            if (!ngmatch(nbuf, ngpat) ||
  458. -                 ((rectime+expincr > today) && !dorebuild &&
  459. -                     !frflag && !usepost && recdate[0] != ' '))
  460. -                goto keephist;
  461. -            if (!dorebuild && !frflag && !usepost &&
  462. -                recdate[0] != ' ') {
  463. -                grpsleft[0] = '\0';
  464. -                goto nailit; /* just expire it */
  465. -            }
  466. -
  467. -            /*
  468. -             * Look for the file--possibly several times,
  469. -             * if it was posted to several news groups.
  470. -             */
  471. -            dc = ' ';
  472. -            p3 = p2;
  473. -            while (dc != '\n') {
  474. -                p1 = index(p3, ' ');
  475. -                if (p1) {
  476. -                    dc = ' ';
  477. -                    *p1 = '\0';
  478. -                } else {
  479. -                    p1 = index(p3, '\n');
  480. -                    if (p1 && p1 > p3) {
  481. -                        dc = '\n';
  482. -                        *p1 = '\0';
  483. -                    } else {
  484. -                        fp = NULL;
  485. -                        break;
  486. -                    }
  487. -                }
  488. -                strcpy(filename, dirname(p3));
  489. -                if (access(filename, 4) == 0 &&
  490. -                    ((fp=art_open(filename, "r")) != NULL))
  491. -                        break;
  492. -                p3 = p1 + 1;
  493. -            }
  494. -            if (p1)
  495. -                *p1 = dc;
  496. -        }
  497. -
  498. -        if (fp == NULL) {
  499. -            /*
  500. -             * this probably means that the article has been
  501. -             * cancelled.  Lets assume that, and make an
  502. -             * entry in the history file to that effect.
  503. -             */
  504. -            if (verbose)
  505. -                perror(filename);
  506. -            strcpy(p2, "cancelled\n");
  507. -            grpsleft[0] = '\0';
  508. -            goto checkdate;
  509. -        }
  510. -        for(i=0; i<NUNREC; i++)
  511. -            if (h.unrec[i] != NULL)
  512. -                free(h.unrec[i]);
  513. -            else
  514. -                break;
  515. -        if (!hread(&h, fp, TRUE)) {
  516. -            printf("Garbled article %s.\n", filename);
  517. -            (void) fclose(fp);
  518. -            /*
  519. -             * Usually means disk ran out of space.
  520. -             * Drop this article from our history file
  521. -             * completely, so we have a chance of picking
  522. -             * it up again from another feed ..
  523. -             */
  524. -            goto nailit;
  525. -        }
  526. -        if (nohistory) {
  527. -            if (recdate[0] == '\0') {
  528. -                struct stat statb;
  529. -                if (fstat(fileno(fp), &statb) < 0)
  530. -                    rectime = cgtdate(h.subdate);
  531. -                else
  532. -                    rectime = statb.st_mtime;
  533. -            } else
  534. -                rectime = cgtdate(recdate);
  535. -        }
  536. -        if (dorebuild) {
  537. -            register char    *cp, *lastslash;
  538. -            register struct multhist *mhp;
  539. -
  540. -            /*
  541. -             * Format of filename until now was /SPOOL/a/b/c/4
  542. -             * and this code changes it to a.b.c/4 (the correct
  543. -             * kind of entry in the history file.)
  544. -             *
  545. -             * This can't be a strcpy because the addresses overlap
  546. -             * and some machines can't handle that.
  547. -             */
  548. -            p1 = filename;
  549. -            cp = p1 + strlen(SPOOL);
  550. -            while (*++cp) {
  551. -                if (*cp == '/') {
  552. -                    lastslash = p1;
  553. -                    *p1++ = '.';
  554. -                } else
  555. -                    *p1++ = *cp;
  556. -            }
  557. -            *p1 = '\0';
  558. -            *lastslash = '/';
  559. -
  560. -            if ((cp = index(h.nbuf, NGDELIM)) == NULL) {
  561. -                struct tm *tm;
  562. -saveit:
  563. -                tm = gmtime(&rectime);
  564. -                if (fprintf(nhfd,
  565. -#ifdef USG
  566. -                     "%s\t%s%2.2d/%2.2d/%d %2.2d:%2.2d\t%s\n",
  567. -#else /* !USG */
  568. -                     "%s\t%s%02d/%02d/%d %02d:%02d\t%s\n",
  569. -#endif /* !USG */
  570. -                    h.ident, h.expdate[0] ? " " : "",
  571. -                    tm->tm_mon+1, tm->tm_mday, tm->tm_year,
  572. -                    tm->tm_hour, tm->tm_min, filename)
  573. -                    == EOF)
  574. -                        xerror("History write failed");
  575. -                (void) fclose(fp);
  576. -                continue;
  577. -            }
  578. -            for (mhp = multhist; mhp < multhist+mh_size && mhp->mh_ident != NULL; mhp++) {
  579. -                if (mhp->mh_file == NULL)
  580. -                    continue;
  581. -                if (strcmp(mhp->mh_ident, h.ident))
  582. -                    continue;
  583. -                (void) strcat(filename, " ");
  584. -                (void) strcat(filename, mhp->mh_file);
  585. -                free(mhp->mh_file);
  586. -                mhp->mh_file = NULL;
  587. -                /*
  588. -                 * if we have all the links, write to hist now
  589. -                 */
  590. -                if (chrcnt(filename, ' ') == chrcnt(cp,NGDELIM))
  591. -                    goto saveit;
  592. -                break;
  593. -            }
  594. -
  595. -            /*
  596. -             * Here is where we realloc the multhist space rather
  597. -             * than the old way of static allocation.  It's
  598. -             * really trivial.  We just clear out the space
  599. -             * in case it was reused.  The old static array was
  600. -             * guaranteed to be cleared since it was cleared when
  601. -             * the process started.
  602. -             */
  603. -            if (mhp >= multhist + mh_size) {
  604. -                multhist = (struct multhist *)
  605. -                    realloc ((char *)multhist,
  606. -                      sizeof (struct multhist) *
  607. -                      (SPACE_INCREMENT + mh_size));
  608. -                if (multhist == NULL)
  609. -                    xerror("Too many articles with multiple newsgroups");
  610. -                for (mhp = multhist + mh_size;
  611. -                  mhp < multhist+mh_size+SPACE_INCREMENT;
  612. -                    mhp++) {
  613. -                    mhp->mh_ident = NULL;
  614. -                    mhp->mh_file = NULL;
  615. -                }
  616. -                mhp = multhist + mh_size;
  617. -                mh_size += SPACE_INCREMENT;
  618. -            }
  619. -
  620. -            if (mhp->mh_ident == NULL) {
  621. -                mhp->mh_ident = malloc(strlen(h.ident)+1);
  622. -                (void) strcpy(mhp->mh_ident, h.ident);
  623. -            }
  624. -            cp = malloc(strlen(filename) + 1);
  625. -            if (cp == NULL)
  626. -                xerror("Out of memory");
  627. -            (void) strcpy(cp, filename);
  628. -            mhp->mh_file = cp;
  629. -            (void) fclose(fp);
  630. -            continue;
  631. -        }
  632. -
  633. -        (void) fclose(fp);
  634. -
  635. -        if (h.expdate[0]) {
  636. -            Now.time = rectime;
  637. -            exptime = cgtdate(h.expdate);
  638. -        }
  639. -        newtime = (usepost ? cgtdate(h.subdate) : rectime) + expincr;
  640. -        if (!h.expdate[0] || ignorexp == 2 ||
  641. -            (ignorexp == 1 && newtime < exptime))
  642. -            exptime = newtime;
  643. -        if (frflag ? strcmp(baduser,h.from)==0 : today >= exptime) {
  644. -nailit:
  645. -#ifdef DEBUG
  646. -            printf("cancel %s\n", filename);
  647. -#else /* !DEBUG */
  648. -            if (verbose)
  649. -                printf("cancel %s\n", h.ident);
  650. -            ulall(p2, &h);
  651. -            (void) sprintf(p2, "%s\n", grpsleft);
  652. -            if (verbose > 2 && grpsleft[0])
  653. -                printf("Some good in %s\n", h.ident);
  654. -#endif /* !DEBUG */
  655. -        } else {
  656. -            if (verbose > 2)
  657. -                printf("Good article %s\n", h.ident);
  658. -            grpsleft[0] = '!';
  659. -        }
  660. -
  661. -checkdate:
  662. -        if (grpsleft[0] == '\0' && today >= rectime + dropincr) {
  663. -            if (verbose > 3)
  664. -                printf("Drop history of %s - %s\n",
  665. -                    h.ident, recdate);
  666. -        } else {
  667. -            long hpos;
  668. -keephist:
  669. -            hpos = ftell(nhfd);
  670. -
  671. -            if (verbose > 3)
  672. -                printf("Retain history of %s - %s\n",
  673. -                    h.ident, recdate);
  674. -            if (fputs(afline, nhfd) == EOF)
  675. -                xerror("history write failed");
  676. -#ifdef DBM
  677. -            if (!dorebuild)
  678. -                remember(h.ident, hpos);
  679. -#endif /* DBM */
  680. -        }
  681. -    }
  682. -out:
  683. -    if (dorebuild) {
  684. -        register struct multhist *mhp;
  685. -        struct tm *tm;
  686. -        for (mhp = multhist; mhp < multhist+mh_size && mhp->mh_ident != NULL; mhp++)
  687. -            if (mhp->mh_file != NULL) {
  688. -                if (verbose)
  689. -                    printf("Article: %s [%s] Cannot find all links\n", mhp->mh_ident, mhp->mh_file);
  690. -                (void) sprintf(filename,"%s/%s",SPOOL,mhp->mh_file);
  691. -                for (p1 = filename; *p1 != ' ' && *p1 != '\0'; p1++)
  692. -                    if (*p1 == '.')
  693. -                        *p1 = '/';
  694. -                *p1 = '\0';
  695. -                if ((fp = art_open(filename, "r")) == NULL) {
  696. -                    if (verbose)
  697. -                        printf("Can't open %s.\n", filename);
  698. -                    continue;
  699. -                }
  700. -                if (!hread(&h, fp, TRUE)) {
  701. -                    printf("Garbled article %s.\n", filename);
  702. -                    (void) fclose(fp);
  703. -                    continue;
  704. -                } else {
  705. -                    struct stat statb;
  706. -                    if (fstat(fileno(fp), &statb) < 0)
  707. -                        rectime = cgtdate(h.subdate);
  708. -                    else
  709. -                        rectime = statb.st_mtime;
  710. -                }
  711. -                tm = gmtime(&rectime);
  712. -                if (
  713. -#ifdef USG
  714. -                    fprintf(nhfd,"%s\t%s%2.2d/%2.2d/%d %2.2d:%2.2d\t%s\n",
  715. -#else /* !USG */
  716. -                    fprintf(nhfd,"%s\t%s%02d/%02d/%d %02d:%02d\t%s\n",
  717. -#endif /* !USG */
  718. -                    h.ident, h.expdate[0] ? " " : "",
  719. -                    tm->tm_mon+1, tm->tm_mday, tm->tm_year,
  720. -                    tm->tm_hour, tm->tm_min, mhp->mh_file)
  721. -                    == EOF )
  722. -                        xerror("History write failed");
  723. -                (void) fclose(fp);
  724. -                continue;
  725. -            }
  726. -        (void) pclose(nhfd);
  727. -        free ((char *)multhist);
  728. -    } else
  729. -        if (fclose(nhfd))
  730. -            xerror("History write failed, %s", errmsg(errno));
  731. -
  732. -    if (dorebuild || !nohistory) {
  733. -        (void) rename(ARTFILE, OARTFILE);
  734. -        (void) rename(NARTFILE, ARTFILE);
  735. -#ifdef DBM
  736. -        if (dorebuild)
  737. -            rebuilddbm( );
  738. -        else {
  739. -            char tempname[BUFLEN];
  740. -            (void) sprintf(tempname,"%s.pag", ARTFILE);
  741. -            (void) strcat(NARTFILE, ".pag");
  742. -            (void) rename(NARTFILE, tempname);
  743. -            (void) sprintf(tempname,"%s.dir", ARTFILE);
  744. -            (void) strcpy(rindex(NARTFILE, '.'), ".dir");
  745. -            (void) rename(NARTFILE, tempname);
  746. -        }
  747. -#endif
  748. -    }
  749. -#ifndef DBM
  750. -    /* rebuild history subfiles */
  751. -    for (i = 0; i < 10; i++) {
  752. -        (void) sprintf(fn, "%s.d/%c", ARTFILE, i + '0');
  753. -        close(creat(fn, 0644));
  754. -        subfd[i] = xfopen(fn, "w+");
  755. -    }
  756. -    ohfd = xfopen(ARTFILE, "r");
  757. -    while (fgets(fn, BUFLEN, ohfd) != NULL) {
  758. -        ptr = histfile(fn);
  759. -        chr = *(ptr + strlen(ptr) - 1);
  760. -        if (isdigit(chr))
  761. -            i = chr - '0';
  762. -        else
  763. -            i = 0;
  764. -        fputs(fn, subfd[i]);
  765. -    }
  766. -    (void) fclose(ohfd);
  767. -    for (i = 0; i < 10; i++)
  768. -        if (ferror(subfd[i]) || fclose(subfd[i]))
  769. -            xerror("History subfile write");
  770. -#endif /* !DBM */
  771. -
  772. -doupdateactive:
  773. -    ohfd = xfopen(ACTIVE, "r");
  774. -    nhfd = xfopen(NACTIVE, "w");
  775. -    do {
  776. -        long n;
  777. -        long maxart, minart;
  778. -        char cansub;
  779. -        int gdsize, hassubs;
  780. -        struct stat stbuf;
  781. -
  782. -        if (fgets(afline, BUFLEN, ohfd) == NULL)
  783. -            continue;
  784. -        if (sscanf(afline,"%s %ld %ld %c",nbuf,&maxart, &minart,
  785. -            &cansub) < 4)
  786. -            xerror("Active file corrupt");
  787. -        if (!ngmatch(nbuf, ngpat)) {
  788. -            if (fputs(afline, nhfd) == EOF)
  789. -                xerror("active file write failed");
  790. -            continue;
  791. -        }
  792. -        minart = 99999L;
  793. -        /* Change a group name from a.b.c to a/b/c */
  794. -        for (p1=nbuf; *p1; p1++)
  795. -            if (*p1 == '.')
  796. -                *p1 = '/';
  797. -
  798. -        hassubs = stat(nbuf, &stbuf) != 0 || stbuf.st_nlink != 2;
  799. -        gdsize = strlen(nbuf);
  800. -        if ((ngdirp = opendir(nbuf)) != NULL) {
  801. -            while (ngdir = readdir(ngdirp)) {
  802. -                nbuf[gdsize] = '/';
  803. -                (void) strcpy(&nbuf[gdsize+1], ngdir->d_name);
  804. -                /* We have to do a stat because of micro.6809 */
  805. -                if (hassubs && (stat(nbuf, &stbuf) < 0 ||
  806. -                    !(stbuf.st_mode&S_IFREG)) )
  807. -                    continue;
  808. -                n = atol(ngdir->d_name);
  809. -                if (n > 0 && n < minart)
  810. -                    minart = n;
  811. -                if (n > 0 && n > maxart)
  812. -                    maxart = n;
  813. -            }
  814. -            closedir(ngdirp);
  815. -        }
  816. -        afline[gdsize] = '\0';
  817. -        if (minart > maxart)
  818. -            minart = maxart;
  819. -        if (fprintf(nhfd,"%s %05ld %05ld %c\n", afline, maxart,
  820. -            minart, cansub) == EOF)
  821. -            xerror("Active file write failed");
  822. -    } while (!feof(ohfd));
  823. -    if (fclose(nhfd))
  824. -        xerror("Active file write failed, %s", errmsg(errno));
  825. -    (void) fclose(ohfd); /* unlocking inews as a side effect */
  826. -#ifndef BSD4_2
  827. -    sprintf(bfr, "%s.lock", ACTIVE);
  828. -    (void) UNLINK(bfr);
  829. -#endif    /* !BSD4_2 */
  830. -
  831. -    (void) rename(ACTIVE, OACTIVE);
  832. -    (void) rename(NACTIVE, ACTIVE);
  833. -
  834. -    execl(RNEWS, "rnews", "-U", (char *)NULL);
  835. -    perror(RNEWS);
  836. -    xxit(1);
  837. -}
  838. -
  839. -/* Unlink (using unwound tail recursion) all the articles in 'artlist'. */
  840. -ulall(artlist, hp)
  841. -char    *artlist;
  842. -struct hbuf *hp;
  843. -{
  844. -    register char    *p, *q;
  845. -    int    last = 0;
  846. -    char    newname[BUFLEN];
  847. -    time_t    timep[2];
  848. -    char *fn;
  849. -
  850. -    grpsleft[0] = '\0';
  851. -    do {
  852. -        if (verbose > 2)
  853. -            printf("ulall '%s', '%s'\n", artlist, hp->subdate);
  854. -        if (nohistory) {
  855. -            last = 1;
  856. -        } else {
  857. -            while (*artlist == ' ' || *artlist == '\n' || *artlist == ',')
  858. -                artlist++;
  859. -            if (*artlist == '\0')
  860. -                return;
  861. -            p = index(artlist, ' ');
  862. -            if (p == NULL) {
  863. -                last = 1;
  864. -                p = index(artlist, '\n');
  865. -            }
  866. -            if (p == NULL) {
  867. -                last = 1;
  868. -                fn = dirname(artlist);
  869. -                if (UNLINK(fn) < 0 && errno != ENOENT)
  870. -                    perror(fn);
  871. -                return;
  872. -            }
  873. -            if (p)
  874. -                *p = 0;
  875. -        }
  876. -        strcpy(newname, artlist);
  877. -        q = index(newname,'/');
  878. -        if (q) {
  879. -            *q++ = NGDELIM;
  880. -            *q = '\0';
  881. -        } else {
  882. -            q = index(newname, '\0');
  883. -            if (q == artlist)        /* null -> the end */
  884. -                return;
  885. -            /* should be impossible to get here */
  886. -        }
  887. -        fn = dirname(artlist);
  888. -        if (ngmatch(newname, ngpat)) {
  889. -            if (doarchive){
  890. -                if (ngmatch(newname, arpat)) {
  891. -                    q = fn + strlen(SPOOL) + 1;
  892. -                    (void) sprintf(newname, "%s/%s", OLDNEWS, q);
  893. -                    if (verbose)
  894. -                        printf("link %s to %s\n", fn, newname);
  895. -                    if (LINK(fn, newname) == -1) {
  896. -                        if (mkparents(newname) == 0)
  897. -                            if (LINK(fn, newname) == -1)
  898. -                                fcopy(fn, newname);
  899. -                    }
  900. -                    timep[0] = timep[1] = cgtdate(hp->subdate);
  901. -                    (void) utime(newname, timep);
  902. -                }
  903. -            }
  904. -            if (verbose)
  905. -                printf("unlink %s\n", fn);
  906. -            if (UNLINK(fn) < 0 && errno != ENOENT)
  907. -                perror(fn);
  908. -        } else {
  909. -            if (verbose > 3)
  910. -                printf("retain %s (%s)\n", hp->ident, fn);
  911. -            strcat(grpsleft, artlist);
  912. -            strcat(grpsleft, " ");
  913. -        }
  914. -        artlist = p + 1;
  915. -    } while (!last);
  916. -}
  917. -
  918. -fcopy(fn, newname)
  919. -char *fn, *newname;
  920. -{
  921. -    int f1, f2;
  922. -    int r;
  923. -    char buf[BUFSIZ];
  924. -    f1 = open(fn, 0);
  925. -    if (f1 < 0)
  926. -        return -1;
  927. -    f2 = open(newname, 1);
  928. -    if (f2 < 0) {
  929. -        if (errno == ENOENT) {
  930. -            f2 = creat(newname,0644);
  931. -            if (f2 < 0) {
  932. -                close(f1);
  933. -                return -1;
  934. -            }
  935. -        } else {
  936. -            close(f1);
  937. -            return -1;
  938. -        }
  939. -    }
  940. -    while((r=read(f1, buf, BUFSIZ)) > 0)
  941. -        write(f2, buf, r);
  942. -    (void) close(f1);
  943. -    (void) close(f2);
  944. -    return 0;
  945. -}
  946. -
  947. -/* 
  948. - * Count instances of c in s
  949. - */
  950. -chrcnt(s, c)
  951. -register char *s;
  952. -register c;
  953. -{
  954. -    register n = 0;
  955. -    register cc;
  956. -
  957. -    while (cc = *s++)
  958. -        if (cc == c)
  959. -            n++;
  960. -    return n;
  961. -}
  962. -
  963. -/*
  964. - * If any parent directories of this dir don't exist, create them.
  965. - */
  966. -mkparents(fullname)
  967. -char *fullname;
  968. -{
  969. -    char buf[200];
  970. -    register char *p;
  971. -    int rc;
  972. -
  973. -    (void) strcpy(buf, fullname);
  974. -    p = rindex(buf, '/');
  975. -    if (p)
  976. -        *p = '\0';
  977. -    if (access(buf, 0) == 0)
  978. -        return 0;
  979. -    mkparents(buf);
  980. -    if ((rc = mkdir(buf, 0755)) < 0)
  981. -        perror("mkdir failed");
  982. -    if (verbose)
  983. -        printf("mkdir %s, rc %d\n", buf, rc);
  984. -
  985. -    return rc;
  986. -}
  987. -
  988. -
  989. -/*    Make sure this file is a legal article. */
  990. -islegal(fullname, path, name)
  991. -register char *fullname;
  992. -register char *path;
  993. -register char *name;
  994. -{
  995. -    struct stat buffer;
  996. -
  997. -    (void) sprintf(fullname, "%s/%s", path, name);
  998. -
  999. -    /* make sure the article is numeric. */
  1000. -    while (*name != '\0')
  1001. -        if (!isascii(*name) || !isdigit(*name))
  1002. -            return 0;
  1003. -        else
  1004. -            name++;
  1005. -
  1006. -    /*  Now make sure we don't have a group like net.micro.432,
  1007. -     *  which is numeric but not a regular file -- i.e., check
  1008. -     *  for being a regular file.
  1009. -     */
  1010. -    if ((stat(fullname, &buffer) == 0) &&
  1011. -        ((buffer.st_mode & S_IFMT) == S_IFREG)) {
  1012. -        /* Now that we found a legal group in a/b/c/4
  1013. -           notation, switch it to a.b.c/4 notation.  */
  1014. -        for (name = fullname; name != NULL && *name != '\0'; name++)
  1015. -            if (*name == '/' && name != rindex (name, '/'))
  1016. -                *name = '.';
  1017. -
  1018. -            return 1;
  1019. -    }
  1020. -    return 0;
  1021. -}
  1022. -
  1023. -#ifdef DBM
  1024. -/*
  1025. - * This is taken mostly intact from ../cvt/cvt.hist.c and is used at the
  1026. - * end by the options that make a new history file.
  1027. - * Routine to convert history file to dbm file.  The old 3 field
  1028. - * history file is still kept there, because we need it for expire
  1029. - * and for a human readable copy.  But we keep a dbm hashed copy
  1030. - * around by message ID so we can answer the yes/no question "have
  1031. - * we already seen this message".  The content is the ftell offset
  1032. - * into the real history file when we get the article - you can't
  1033. - * really do much with this because the file gets compacted.
  1034. - */
  1035. -
  1036. -FILE *fd;
  1037. -
  1038. -char namebuf[BUFSIZ];
  1039. -char lb[BUFSIZ];
  1040. -
  1041. -rebuilddbm()
  1042. -{
  1043. -    register char *p;
  1044. -    long fpos;
  1045. -
  1046. -    (void) umask(0);
  1047. -    (void) sprintf(namebuf, "%s.dir", ARTFILE);
  1048. -    (void) close(creat(namebuf, 0666));
  1049. -    (void) sprintf(namebuf, "%s.pag", ARTFILE);
  1050. -    (void) close(creat(namebuf, 0666));
  1051. -    (void) sprintf(namebuf, "%s", ARTFILE);
  1052. -
  1053. -    fd = fopen(namebuf, "r");
  1054. -    if (fd == NULL) {
  1055. -        perror(namebuf);
  1056. -        xxit(2);
  1057. -    }
  1058. -
  1059. -    initdbm(namebuf);
  1060. -    while (fpos=ftell(fd), fgets(lb, BUFSIZ, fd) != NULL) {
  1061. -        p = index(lb, '\t');
  1062. -        if (p)
  1063. -            *p = 0;
  1064. -        remember(lb, fpos);
  1065. -    }
  1066. -}
  1067. -
  1068. -remember(article, fileoff)
  1069. -register char *article;
  1070. -long fileoff;
  1071. -{
  1072. -    datum    lhs, rhs;
  1073. -
  1074. -    lcase(article);
  1075. -    lhs.dptr = article;
  1076. -    lhs.dsize = strlen(article) + 1;
  1077. -    rhs.dptr = (char *) &fileoff;
  1078. -    rhs.dsize = sizeof fileoff;
  1079. -
  1080. -    if (verbose > 5)
  1081. -        printf("remember: %s @ %ld\n", article, fileoff);
  1082. -    if (store(lhs, rhs) < 0)
  1083. -        xerror("dbm store failed");
  1084. -}
  1085. -#endif /* DBM */
  1086. -
  1087. -xxit(i)
  1088. -{
  1089. -    sprintf(bfr,"%s.lock", ACTIVE);
  1090. -    (void) UNLINK(bfr);
  1091. -    exit(i);
  1092. -}
  1093. *-*-END-of-src/expire.c-*-*
  1094. echo x - src/readr.c 1>&2
  1095. sed 's/.//' >src/readr.c <<'*-*-END-of-src/readr.c-*-*'
  1096. -/*
  1097. - * This software is Copyright (c) 1986 by Rick Adams.
  1098. - *
  1099. - * Permission is hereby granted to copy, reproduce, redistribute or
  1100. - * otherwise use this software as long as: there is no monetary
  1101. - * profit gained specifically from the use or reproduction or this
  1102. - * software, it is not sold, rented, traded or otherwise marketed, and
  1103. - * this copyright notice is included prominently in any copy
  1104. - * made.
  1105. - *
  1106. - * The author make no claims as to the fitness or correctness of
  1107. - * this software for any use whatsoever, and it is provided as is. 
  1108. - * Any use of this software is at the user's own risk.
  1109. - *
  1110. - * readr - /bin/mail and msgs interface and associated functions.
  1111. - */
  1112. -
  1113. -#ifdef SCCSID
  1114. -static char    *SccsId = "@(#)readr.c    2.58    10/23/86";
  1115. -#endif /* SCCSID */
  1116. -
  1117. -#include "rparams.h"
  1118. -#if defined(BSD4_2) || defined(BSD4_1C)
  1119. -#include <sys/dir.h>
  1120. -#else
  1121. -#include "ndir.h"
  1122. -#endif /* !BSD4_2 && !BSD4_1C */
  1123. -#include <setjmp.h>
  1124. -#include <errno.h>
  1125. -
  1126. -extern int errno;
  1127. -
  1128. -char *Progname = "readnews";    /* used by xerror to identify failing program */
  1129. -
  1130. -static char    lbuf[BUFLEN*2];
  1131. -long atol();
  1132. -
  1133. -#define    saveart    oobit = bit;strcpy(ofilename1, filename);strcpy(ogroupdir, groupdir);hptr = h;h = hold;hold = hptr;ongsize = pngsize
  1134. -#define NLINES(h, fp) (h->numlines[0] ? h->intnumlines : (h->intnumlines=linecnt(fp),sprintf(h->numlines, "%d", h->intnumlines), h->intnumlines))
  1135. -
  1136. -char *tft = "/tmp/folXXXXXX";
  1137. -
  1138. -/*
  1139. - * These were made static for u370 with its buggy cc.
  1140. - * I judged it better to have one copy with no ifdefs than
  1141. - * to conditionally compile them as automatic variables
  1142. - * in readr (which they originally were).  Performance
  1143. - * considerations might warrant moving some of the simple
  1144. - * things into register variables, but I don't know what
  1145. - * breaks the u370 cc.
  1146. - */
  1147. -static char goodone[BUFLEN];        /* last decent article        */
  1148. -static char ogroupdir[BUFLEN];        /* last groupdir        */
  1149. -static char address[PATHLEN];        /* for reply copy        */
  1150. -static char edcmdbuf[128];
  1151. -static int rfq = 0;            /* for last article        */
  1152. -static long ongsize;            /* Previous ngsize        */
  1153. -static long pngsize;            /* Printing ngsize        */
  1154. -static char *bptr;            /* temp pointer.        */
  1155. -static struct srec srec;        /* srec for sys file entries    */
  1156. -static char *tfilename;            /* temporary file name         */
  1157. -static char ofilename1[BUFLEN];        /* previous file name        */
  1158. -static struct hbuf hbuf1, hbuf2,    /* for minusing            */
  1159. -        *h = &hbuf1,        /* current header        */
  1160. -        *hold = &hbuf2,        /* previous header        */
  1161. -        *hptr;            /* temporary             */
  1162. -static char *ptr1, *ptr2, *ptr3;    /* for reply manipulation    */
  1163. -static int  abs = FALSE;        /* TRUE if we asked absolutely    */
  1164. -static char tf[100];
  1165. -static long oobit;            /* last bit, really        */
  1166. -static int dgest = 0;
  1167. -static FILE *ofp;            /* Current output file to terminal*/
  1168. -static FILE *fp;            /* current article to be printed*/
  1169. -static int holdup;            /* 1 iff should stop before hdr */
  1170. -static int ignorenews;            /* 1 iff readnews -p > /dev/null*/
  1171. -static time_t timelastsaved;        /* time newsrc last written out */
  1172. -static jmp_buf sigjmpbuf;        /* for signal processing */
  1173. -static int canlongjmp;            /* TRUE if setjmp on sigjmp valid */
  1174. -
  1175. -int catchcont();
  1176. -readr()
  1177. -{
  1178. -    register char *m = getenv("MORE");
  1179. -    register char *m2, cc;
  1180. -
  1181. -    /*
  1182. -     * Turn of more's 'l' option, so \f kludge will work.
  1183. -     * This is really revolting!
  1184. -     */
  1185. -    if (m2 = m) {
  1186. -        while (cc = *m++)
  1187. -            if (cc != 'l')
  1188. -                *m2++ = cc;
  1189. -        *m2 = '\0';
  1190. -    }
  1191. -
  1192. -#ifdef DEBUG
  1193. -    fprintf(stderr, "readr()\n");
  1194. -#endif
  1195. -    if (aflag) {
  1196. -        if (*datebuf) {
  1197. -            if ((atime = cgtdate(datebuf)) == -1)
  1198. -                xerror("Cannot parse date string");
  1199. -        } else
  1200. -            atime = 0;
  1201. -    }
  1202. -
  1203. -    if (pflag && ignoring())
  1204. -        ignorenews = TRUE;
  1205. -
  1206. -    if (xflag)
  1207. -        uflag = 0;
  1208. -    if (uflag)
  1209. -        (void) time(&timelastsaved);
  1210. -
  1211. -    ofp = stdout;
  1212. -    if (cflag && coptbuf[0] != '\0') {
  1213. -        (void) umask(022);
  1214. -        (void) mktemp(outfile);    /* get "unique" file name */
  1215. -        (void) close(creat(outfile,0666));
  1216. -        ofp = xfopen(outfile, "w");
  1217. -        (void) umask(N_UMASK);
  1218. -        cflag = FALSE;
  1219. -        pflag = TRUE;
  1220. -    }
  1221. -
  1222. -    /* loop reading articles. */
  1223. -    fp = NULL;
  1224. -    obit = -1;
  1225. -    nextng();
  1226. -    for ( ;; ) {
  1227. -        if (getnextart(FALSE))
  1228. -            break;
  1229. -#ifdef DEBUG
  1230. -        fprintf(stderr,"after getnextart, fp %x, pos %ld, bit %ld, group '%s', filename '%s'\n",
  1231. -            fp, ftell(fp), bit, groupdir, filename);
  1232. -#endif
  1233. -        (void) strcpy(goodone, filename);
  1234. -        if (pflag || lflag || eflag) {
  1235. -            /* This code should be gotten rid of */
  1236. -            if (SigTrap) {
  1237. -                qfflush(ofp);
  1238. -                fprintf(ofp, "\n");
  1239. -                cdump(ofp);
  1240. -                xxit(0); /* kludge! drop when qfflush works */
  1241. -                return;
  1242. -            }
  1243. -            clear(bit);
  1244. -            nextbit();
  1245. -            FCLOSE(fp);
  1246. -            continue;
  1247. -        }
  1248. -        for ( ;; ) {
  1249. -            char *pp;
  1250. -            int nlines;
  1251. -            int (*ointr)();
  1252. -#ifdef    SIGCONT
  1253. -            int (*ocont)();
  1254. -#endif
  1255. -            (void) setjmp(sigjmpbuf);
  1256. -            canlongjmp = TRUE;
  1257. -
  1258. -            SigTrap = FALSE;
  1259. -            if (!cflag) {
  1260. -                if (rfq)
  1261. -                    (void) sprintf(bfr, "Last article.  [qfr] ");
  1262. -                else {
  1263. -                    nlines = NLINES(h, fp);
  1264. -                    if (nlines <= 0) {
  1265. -                        (void) sprintf(bfr, "(0 lines) Next? [nqfr] ");
  1266. -                        FCLOSE(fp);
  1267. -                    } else {
  1268. -                        (void) sprintf(bfr, "(%d lines) More? [ynq] ", nlines);
  1269. -                    }
  1270. -                }
  1271. -            } else
  1272. -                (void) sprintf(bfr, "? ");
  1273. -            fprintf(ofp, "%s", bfr);
  1274. -            (void) fflush(ofp);
  1275. -            bptr = lbuf;
  1276. -            ointr = signal(SIGINT, catchcont);
  1277. -#ifdef SIGCONT
  1278. -            ocont = signal(SIGCONT, catchcont);
  1279. -#endif
  1280. -            pp = fgets(bptr, BUFLEN, stdin);
  1281. -            canlongjmp = FALSE;
  1282. -            (void) signal(SIGINT, ointr);
  1283. -#ifdef SIGCONT
  1284. -            (void) signal(SIGCONT, ocont);
  1285. -#endif
  1286. -            if (pp != NULL)
  1287. -                break;
  1288. -            if (!SigTrap)
  1289. -                return;
  1290. -#ifdef SIGCONT
  1291. -            if (SigTrap != SIGCONT)
  1292. -#endif
  1293. -                fprintf(ofp, "\n");
  1294. -        }
  1295. -        (void) nstrip(bptr);
  1296. -        while (*bptr == ' ' || *bptr == '\t')
  1297. -            bptr++;
  1298. -        if (command())
  1299. -            break;
  1300. -    }
  1301. -
  1302. -    if (!pflag && !news) {
  1303. -        fprintf(stderr, "No news.\n");
  1304. -    }
  1305. -    cout(ofp);
  1306. -}
  1307. -
  1308. -#define EOL() if (*bptr != '\0') { fprintf(ofp, "? for commands.\n"); return FALSE; }
  1309. -/*
  1310. - * Process one command, which has already been typed in.
  1311. - */
  1312. -command()
  1313. -{
  1314. -    char *findhist();
  1315. -    long i;
  1316. -
  1317. -    switch (*bptr++) {
  1318. -
  1319. -    /* No.  Go on to next article. */
  1320. -    case 'n':
  1321. -        EOL();
  1322. -        readmode = NEXT;
  1323. -        if (!cflag)
  1324. -            FCLOSE(fp);
  1325. -        fprintf(ofp, "\n");
  1326. -        clear(bit);
  1327. -        saveart;
  1328. -        nextbit();
  1329. -        break;
  1330. -
  1331. -    /* Undigestify the article. */
  1332. -    case 'd':
  1333. -        dgest = 1;
  1334. -        /* fall through */
  1335. -
  1336. -    /* yes: print this article, go on. */
  1337. -    case 'y':
  1338. -        EOL();
  1339. -        /* fall through. */
  1340. -
  1341. -    /* The user hit return.  Default is 'y' unless rfq, then it's 'q'. */
  1342. -    case '\0':
  1343. -        if (!bptr[-1] && rfq)
  1344. -            return TRUE;
  1345. -        readmode = NEXT;
  1346. -        showtail(fp);
  1347. -        clear(bit);
  1348. -        saveart;
  1349. -        nextbit();
  1350. -        break;
  1351. -
  1352. -    /*
  1353. -     * Unsubscribe to the newsgroup and go on to next group
  1354. -     */
  1355. -    case 'u':
  1356. -        fprintf(ofp, "To unsubscribe, use 'U'\n");
  1357. -        break;
  1358. -
  1359. -    case 'U':
  1360. -        fprintf(ofp, "Unsubscribing to newsgroup: %s\n", groupdir);
  1361. -        obit = -1;
  1362. -        FCLOSE(fp);
  1363. -        if (cflag)
  1364. -            clear(bit);
  1365. -        else
  1366. -            putc('\n', ofp);
  1367. -        rfq = 0;
  1368. -        zapng = TRUE;
  1369. -        saveart;
  1370. -        if (nextng()) {
  1371. -            if (actdirect == BACKWARD)
  1372. -                fprintf(ofp, "Can't back up.\n");
  1373. -            else
  1374. -                return TRUE;
  1375. -        }
  1376. -        break;
  1377. -
  1378. -        /* Print the current version of news */
  1379. -    case 'v':
  1380. -        fprintf(ofp, "News version: %s\n", news_version);
  1381. -        break;
  1382. -
  1383. -        /* reprint the article */
  1384. -    case 'p':
  1385. -        EOL();
  1386. -        if (!cflag)
  1387. -            goto minus;
  1388. -        readmode = NEXT;
  1389. -        if (!cflag) {
  1390. -            FCLOSE(fp);
  1391. -            bit = last;
  1392. -            putc('\n', ofp);
  1393. -        }
  1394. -        obit = -1;
  1395. -        break;
  1396. -
  1397. -        /* decrypt joke */
  1398. -    case 'D':
  1399. -        caesar_command();
  1400. -        readmode = NEXT;
  1401. -        clear(bit);
  1402. -        saveart;
  1403. -        nextbit();
  1404. -        break;
  1405. -
  1406. -        /* write out the article someplace */
  1407. -    case 's':
  1408. -    case 'w':
  1409. -        {
  1410. -        char *grn = groupdir;
  1411. -        tfilename = filename;
  1412. -        if (*bptr == '-') {
  1413. -            bptr++;
  1414. -            grn = ogroupdir;
  1415. -            if (*ofilename1)
  1416. -                tfilename = ofilename1;
  1417. -        }
  1418. -        if (*bptr != '\0' && *bptr != ' ') {
  1419. -            fprintf(ofp, "Bad file name.\n");
  1420. -            break;
  1421. -        }
  1422. -        while (*bptr == ' ')
  1423. -            bptr++;
  1424. -        if (*bptr != '|' && *bptr != '/') {
  1425. -            char    hetyped[BUFLEN];
  1426. -            char    *boxptr;
  1427. -            struct    stat stbf;
  1428. -              (void) strcpy(hetyped, bptr);
  1429. -            if (hetyped[0] == '~' && hetyped[1] == '/') {
  1430. -                  strcpy(hetyped, bptr+2);
  1431. -                  strcpy(bptr, userhome);
  1432. -            } else if (boxptr = getenv("NEWSBOX")) {
  1433. -                 if (index(boxptr, '%')) {
  1434. -                     sprintf(bptr, boxptr, grn);
  1435. -                         if (stat(bptr, &stbf) < 0) {
  1436. -                        if (mkdir(bptr, 0777) < 0) {
  1437. -                            fprintf(ofp, "Cannot create directory %s", bptr);
  1438. -                            break;
  1439. -                        }
  1440. -                    } else if ((stbf.st_mode & S_IFMT) != S_IFDIR) {
  1441. -                        fprintf(ofp, "%s is not a directory", bptr);
  1442. -                        break;
  1443. -                    }
  1444. -                } else
  1445. -                    strcpy(bptr, boxptr);
  1446. -            } else
  1447. -                (void) strcpy(bptr, ".");
  1448. -            (void) strcat(bptr, "/");
  1449. -            if (hetyped[0] != '\0')
  1450. -                (void) strcat(bptr, hetyped);
  1451. -            else
  1452. -                (void) strcat(bptr, "Articles");
  1453. -        }
  1454. -        fwait(fsubr(save, tfilename, bptr));
  1455. -        }
  1456. -        break;
  1457. -
  1458. -        /* back up  */
  1459. -    case '-':
  1460. -minus:
  1461. -        rfq = 0;
  1462. -        abs = TRUE;
  1463. -        if (!*ofilename1) {
  1464. -            fprintf(ofp, "Can't back up.\n");
  1465. -            break;
  1466. -        }
  1467. -        if (cflag)
  1468. -            clear(bit);
  1469. -        else {
  1470. -            FCLOSE(fp);
  1471. -            putc('\n', ofp);
  1472. -        }
  1473. -        hptr = h;
  1474. -        h = hold;
  1475. -        hold = hptr;
  1476. -        (void) strcpy(bfr, filename);
  1477. -        (void) strcpy(filename, ofilename1);
  1478. -        (void) strcpy(ofilename1, bfr);
  1479. -        obit = bit;
  1480. -        if (strcmp(groupdir, ogroupdir)) {
  1481. -            (void) strcpy(bfr, groupdir);
  1482. -            selectng(ogroupdir, TRUE, FALSE);
  1483. -            (void) strcpy(groupdir, ogroupdir);
  1484. -            (void) strcpy(ogroupdir, bfr);
  1485. -            ngrp = 1;
  1486. -            back();
  1487. -        }
  1488. -        bit = oobit;
  1489. -        oobit = obit;
  1490. -        obit = -1;
  1491. -        (void) getnextart(TRUE);
  1492. -        return FALSE;
  1493. -
  1494. -        /* skip forwards */
  1495. -    case '+':
  1496. -caseplus:
  1497. -        if (*bptr == '\0')
  1498. -            (void) strcat(bptr, "1");
  1499. -        rfq = 0;
  1500. -        if (cflag)
  1501. -            clear(bit);
  1502. -        saveart;
  1503. -        last = bit;
  1504. -        for (i = 0; i < atol(bptr); i++) {
  1505. -            nextbit();
  1506. -            if ((bit > pngsize) || (rflag && bit < 1))
  1507. -                break;
  1508. -        }
  1509. -        if (!cflag) {
  1510. -            putc('\n', ofp);
  1511. -            FCLOSE(fp);
  1512. -        }
  1513. -        obit = -1;
  1514. -        break;
  1515. -
  1516. -    /* exit - time updated to that of most recently read article */
  1517. -    case 'q':
  1518. -        EOL();
  1519. -        return TRUE;
  1520. -
  1521. -    /* exit - no time update. */
  1522. -    case 'x':
  1523. -        EOL();
  1524. -        xxit(0);
  1525. -
  1526. -    /* cancel the article. */
  1527. -    case 'c':
  1528. -        (void) cancel_command();
  1529. -        break;
  1530. -
  1531. -    /* escape to shell */
  1532. -    case '!':
  1533. -        fwait(fsubr(ushell, bptr, (char *)NULL));
  1534. -        fprintf(ofp, "\n");
  1535. -        hdr();
  1536. -        break;
  1537. -
  1538. -    /* mail reply */
  1539. -    case 'r':
  1540. -        (void) reply_command();
  1541. -        break;
  1542. -
  1543. -    /* send to some system */
  1544. -    case 'X':
  1545. -        xmit_command();
  1546. -        break;
  1547. -    /* mark the rest of the articles in this group as read */
  1548. -    case 'K':
  1549. -        saveart;
  1550. -        while (bit <= pngsize && bit >= minartno) {
  1551. -            clear(bit);
  1552. -            nextbit();
  1553. -        }
  1554. -        FCLOSE(fp);
  1555. -        break;
  1556. -
  1557. -    /* next newsgroup */
  1558. -    case 'P':
  1559. -        *bptr = '-';
  1560. -    case 'N':
  1561. -        FCLOSE(fp);
  1562. -        if (next_ng_command())
  1563. -            return TRUE;
  1564. -        break;
  1565. -
  1566. -    case 'b':    /* back up 1 article */
  1567. -        i = bit - 1;
  1568. -        goto tryartnum;
  1569. -    case '0':    /* specific no. */
  1570. -    case '1':
  1571. -    case '2':
  1572. -    case '3':
  1573. -    case '4':
  1574. -    case '5':
  1575. -    case '6':
  1576. -    case '7':
  1577. -    case '8':
  1578. -    case '9':
  1579. -        (void) sscanf(--bptr, "%ld", &i);
  1580. -        if (i == 0) {
  1581. -            fprintf(ofp, "Bad article no.\n");
  1582. -            break;
  1583. -        }
  1584. -        if (i > pngsize) {
  1585. -            fprintf(ofp, "Not that many articles.\n");
  1586. -            break;
  1587. -        }
  1588. -tryartnum:
  1589. -        readmode = SPEC;
  1590. -        abs = TRUE;
  1591. -        bit = i;
  1592. -        obit = -1;
  1593. -        if (!cflag) {
  1594. -            putc('\n', ofp);
  1595. -            FCLOSE(fp);
  1596. -        }
  1597. -        rfq = 0;
  1598. -        break;
  1599. -
  1600. -    /* specific message ID. */
  1601. -    case '<':
  1602. -        ptr1 = findhist(--bptr);
  1603. -        if (ptr1 == NULL) {
  1604. -            fprintf(ofp, "No such article: %s.\n", bptr);
  1605. -            break;
  1606. -        }
  1607. -        ptr2 = index(ptr1, '\t');
  1608. -        ptr3 = index(++ptr2, '\t');
  1609. -        ptr2 = index(++ptr3, ' ');
  1610. -        if (ptr2)
  1611. -            *ptr2 = '\0';
  1612. -        ptr2 = index(ptr3, '/');
  1613. -        if (!ptr2) {
  1614. -            *ptr3 = '\0';
  1615. -            if (strcmp(++ptr3, "cancelled") == 0) {
  1616. -                fprintf(ofp, "Article %s has been cancelled.\n",
  1617. -                    bptr);
  1618. -                break;
  1619. -            }
  1620. -            fprintf(ofp, "Article %s (dated %s) has expired.\n",
  1621. -                bptr, index(ptr1, '\t')+1);
  1622. -            break;
  1623. -        }
  1624. -        *ptr2++ = '\0';
  1625. -        abs = TRUE;
  1626. -        if (cflag)
  1627. -            clear(bit);
  1628. -        else {
  1629. -            FCLOSE(fp);
  1630. -            putc('\n', ofp);
  1631. -        }
  1632. -        saveart;
  1633. -        (void) strcpy(ogroupdir, ptr3);
  1634. -        if (strcmp(groupdir, ogroupdir)) {
  1635. -            (void) strcpy(bfr, groupdir);
  1636. -            selectng(ogroupdir, TRUE, PERHAPS);
  1637. -            (void) strcpy(groupdir, ogroupdir);
  1638. -            (void) strcpy(ogroupdir, bfr);
  1639. -            ngrp = 1;
  1640. -            back();
  1641. -        }
  1642. -        (void) sscanf(ptr2, "%ld", &bit);
  1643. -        oobit = obit;
  1644. -        obit = -1;
  1645. -        i = bit;
  1646. -        (void) getnextart(TRUE);
  1647. -        if (bit != i || strcmp(groupdir, ptr3) != 0) {
  1648. -            (void) fprintf(ofp, "Can't read %s/%ld.\n", ptr3, i);
  1649. -            goto minus;
  1650. -        }
  1651. -        rfq = 0;
  1652. -        break;
  1653. -
  1654. -    /* follow-up article */
  1655. -    case 'f':
  1656. -        if (strcmp(h->followto, "poster") == 0) {
  1657. -            (void) reply_command();
  1658. -            break;
  1659. -        }
  1660. -
  1661. -        if (*bptr == '-')
  1662. -            tfilename = ofilename1;
  1663. -        else
  1664. -            tfilename = filename;
  1665. -        (void) sprintf(bfr,"%s/%s %s", BIN, "postnews", tfilename);
  1666. -        (void) system(bfr);
  1667. -        break;
  1668. -
  1669. -    /* erase - pretend we haven't seen this article. */
  1670. -    case 'e':
  1671. -        if (rfq || *bptr == '-') {
  1672. -            if (strcmp(groupdir, ogroupdir)) {
  1673. -                i = bit;
  1674. -                (void) strcpy(bfr, groupdir);
  1675. -                selectng(ogroupdir, FALSE, PERHAPS);
  1676. -                set(oobit);
  1677. -                fprintf(ofp,"Holding article %ld newsgroup %s\n", oobit, ogroupdir),
  1678. -                (void) strcpy(groupdir, ogroupdir);
  1679. -                selectng(bfr, FALSE, FALSE);
  1680. -                bit = i;
  1681. -            } else {
  1682. -                fprintf(ofp,"Holding article %ld\n", oobit);
  1683. -                set(oobit);
  1684. -            }
  1685. -        } else {
  1686. -            fprintf(ofp,"Holding article %ld\n", bit);
  1687. -            set(bit);
  1688. -            goto caseplus;    /* skip this article for now */
  1689. -        }
  1690. -        break;
  1691. -
  1692. -    case 'H':
  1693. -    case 'h':
  1694. -        if (!hflag)
  1695. -            dash(8, ofp);
  1696. -        if (*bptr == '-') {
  1697. -            if (oobit > 0)
  1698. -                fprintf(ofp, "Article %ld:\n", oobit);
  1699. -            hprint(hold, ofp, 1 + (bptr[-1]=='H'));
  1700. -        } else {
  1701. -            fprintf(ofp, "Article %ld of %ld: %s\n",
  1702. -                rfq ? oobit : bit, pngsize, h->ident);
  1703. -            hprint(h, ofp, 1 + (bptr[-1]=='H'));
  1704. -        }
  1705. -        if (!hflag)
  1706. -            dash(8, ofp);
  1707. -        break;
  1708. -
  1709. -    case '#':
  1710. -        fprintf(ofp, "Article %ld of %ld: newsgroup %s\n",
  1711. -            rfq ? oobit : bit, pngsize, rfq ? ogroupdir : groupdir);
  1712. -        break;
  1713. -
  1714. -        /* error */
  1715. -    case '?':
  1716. -        help(ofp);
  1717. -        break;
  1718. -    default:
  1719. -        fprintf(ofp, "? for commands.\n");
  1720. -        break;
  1721. -    }
  1722. -
  1723. -    return FALSE;
  1724. -}
  1725. -
  1726. -cancel_command()
  1727. -{
  1728. -    int notauthor;
  1729. -    tfilename = filename;
  1730. -    hptr = h;
  1731. -    if (*bptr == '-') {
  1732. -        if (*ofilename1) {
  1733. -            tfilename = ofilename1;
  1734. -            hptr = hold;
  1735. -        }
  1736. -        bptr++;
  1737. -    }
  1738. -    EOL();
  1739. -    readmode = SPEC;
  1740. -    (void) strcpy(rcbuf, hptr->path);
  1741. -    ptr1 = index(rcbuf, ' ');
  1742. -    if (ptr1)
  1743. -        *ptr1 = 0;
  1744. -    notauthor = strcmp(username, rcbuf);
  1745. -    if (uid != ROOTID && uid && notauthor) {
  1746. -        fprintf(ofp, "Can't cancel what you didn't write.\n");
  1747. -        return FALSE;
  1748. -    }
  1749. -    if (!cancel(ofp, hptr, notauthor) && hptr == h) {
  1750. -        clear(bit);
  1751. -        saveart;
  1752. -        nextbit();
  1753. -        obit = -1;
  1754. -        if (!cflag)
  1755. -            putc('\n', ofp);
  1756. -        FCLOSE(fp);
  1757. -    }
  1758. -    return TRUE;
  1759. -}
  1760. -
  1761. -reply_command()
  1762. -{
  1763. -    register char    *pathptr;
  1764. -    int edit = 1;
  1765. -    char *ed, *fbp;
  1766. -    int idlen;
  1767. -    FILE *tfp;
  1768. -    char *replyname();
  1769. -    char subj[BUFLEN];
  1770. -    char folbuf[BUFLEN];
  1771. -    struct stat statb;
  1772. -    long creatm;
  1773. -
  1774. -    hptr = h;
  1775. -    while (*bptr && index("d-", *bptr)) {
  1776. -        switch (*bptr) {
  1777. -        /* Followup the previous article. */
  1778. -        case '-':
  1779. -            hptr = hold;
  1780. -            break;
  1781. -
  1782. -        /* Don't edit the headers */
  1783. -        case 'd':
  1784. -            edit = 0;
  1785. -            break;
  1786. -        }
  1787. -        bptr++;
  1788. -    }
  1789. -    EOL();
  1790. -    ptr1 = index(MAILPARSER, ' ');
  1791. -    if (ptr1)
  1792. -        *ptr1 = '\0';
  1793. -    if (edit && access(MAILPARSER, 1)) {
  1794. -#ifdef IHCC
  1795. -        fprintf(stderr, "Can't edit headers, 'recmail' missing.\n");
  1796. -#else
  1797. -        fprintf(stderr, "Can't edit headers without %s\n", MAILPARSER);
  1798. -#endif
  1799. -        edit = 0;
  1800. -    }
  1801. -    if (ptr1)
  1802. -        *ptr1 = ' ';
  1803. -
  1804. -    *rcbuf = '\0';
  1805. -    pathptr = replyname(hptr);;
  1806. -    for (ptr1 = address, ptr2 = pathptr; *ptr2; ptr1++, ptr2++) {
  1807. -        if (index("\"\\$", *ptr2))
  1808. -            *ptr1++ = '\\';
  1809. -        *ptr1 = *ptr2;
  1810. -    }
  1811. -    *ptr1 = '\0';
  1812. -
  1813. -    folbuf[0] = '\0';        /* References */
  1814. -    if (hptr->followid[0]) {
  1815. -        fbp = hptr->followid;
  1816. -        idlen = strlen(hptr->ident);
  1817. -
  1818. -        /*
  1819. -         * If the references line is too long, truncate it.
  1820. -         * The "3" is for the comma, the space, and the '\0' at
  1821. -         * the end of the string.
  1822. -         */
  1823. -        while (fbp && strlen(fbp) + idlen > BUFLEN - 3)
  1824. -            fbp = index(fbp + 1, '<');
  1825. -        if (fbp != NULL) {
  1826. -            (void) strcpy(folbuf, fbp);
  1827. -            (void) strcat(folbuf, ", ");
  1828. -        }
  1829. -    }
  1830. -    (void) strcat(folbuf, hptr->ident);
  1831. -
  1832. -    (void) strcpy(subj, hptr->title);    /* Subject */
  1833. -    while (isspace(*bptr))
  1834. -        bptr++;
  1835. -    if (*bptr != '\0')
  1836. -        (void) strcpy(subj, bptr);
  1837. -    if (!prefix(subj, "Re:")){
  1838. -        (void) strcpy(bfr, subj);
  1839. -        (void) sprintf(subj, "Re: %s", bfr);
  1840. -    }
  1841. -    if (!edit) {
  1842. -        fprintf(ofp, "To: %s\n", pathptr);
  1843. -        ed = index(MAILER, '%');
  1844. -        if (ed && ed[1] == 's')
  1845. -            fprintf(ofp, "Subject: %s\n", subj);
  1846. -        (void) fflush(ofp);
  1847. -    }
  1848. -
  1849. -    /* Put the user in the editor to create the body of the followup. */
  1850. -    if (edit) {
  1851. -        int oumask;
  1852. -
  1853. -        (void) strcpy(tf, tft);
  1854. -        (void) mktemp(tf);
  1855. -
  1856. -        ed = getenv("EDITOR");
  1857. -        if (ed == NULL)
  1858. -            ed = DFTEDITOR;
  1859. -
  1860. -        oumask = umask(077);
  1861. -        if ((tfp = fopen(tf, "w")) == NULL) {
  1862. -            perror(tf);
  1863. -            creatm = 0L;
  1864. -        } else {
  1865. -            fprintf(tfp, "To: %s\n", pathptr);
  1866. -            fprintf(tfp, "Subject: %s\n", subj);
  1867. -#ifdef INTERNET
  1868. -            fprintf(tfp, "News-Path: %s\n", hptr->path);
  1869. -#endif /* INTERNET */
  1870. -            fprintf(tfp, "References: %s\n\n", folbuf);
  1871. -            fstat(fileno(tfp), &statb);
  1872. -            creatm = statb.st_mtime;
  1873. -            (void) fclose(tfp);
  1874. -        }
  1875. -        (void) umask(oumask);
  1876. -
  1877. -        (void) sprintf(edcmdbuf, "%s %s", ed, tf);
  1878. -        (void) system(edcmdbuf);
  1879. -        (void) strcpy(rcbuf, MAILPARSER);
  1880. -        (void) strcat(rcbuf, " -t");
  1881. -        (void) strcat(rcbuf, " < ");
  1882. -        (void) strcat(rcbuf, tf);
  1883. -        if (access(tf, 4) || stat(tf, &statb)) {
  1884. -            fprintf(stderr, "Reply not sent: no input file.\n");
  1885. -            return FALSE;
  1886. -        }
  1887. -        if (statb.st_mtime == creatm) {
  1888. -            fprintf(stderr, "Reply not sent: cancelled.\n");
  1889. -            (void) unlink(tf);
  1890. -            return FALSE;
  1891. -        }
  1892. -        fprintf(ofp,"Sending reply.\n");
  1893. -        (void) fflush(stdout);
  1894. -        if (vfork() == 0) {
  1895. -            (void) system(rcbuf);
  1896. -            (void) unlink(tf);
  1897. -            _exit(0);
  1898. -        }
  1899. -    } else {
  1900. -        (void) sprintf(rcbuf, MAILER, hptr->title);
  1901. -        (void) sprintf(bfr, "%s %s", rcbuf, address);
  1902. -        (void) system(bfr);
  1903. -    }
  1904. -    hdr();
  1905. -    return TRUE;
  1906. -}
  1907. -
  1908. -xmit_command()
  1909. -{
  1910. -    tfilename = filename;
  1911. -    if (*bptr == '-') {
  1912. -        if (*ofilename1)
  1913. -            tfilename = ofilename1;
  1914. -        bptr++;
  1915. -    }
  1916. -    if (*bptr != '\0' && *bptr != ' ') {
  1917. -        fprintf(ofp, "Bad system name.\n");
  1918. -        return;
  1919. -    }
  1920. -    while (*bptr == ' ')
  1921. -        bptr++;
  1922. -    if (*bptr == '\0') {
  1923. -        fprintf(ofp, "Missing system name.\n");
  1924. -        return;
  1925. -    }
  1926. -    if (s_find(&srec, bptr) == NULL) {
  1927. -        fprintf(ofp, "%s not in SYSFILE\n", bptr);
  1928. -        return;
  1929. -    }
  1930. -    (void) transmit(&srec, tfilename);
  1931. -}
  1932. -
  1933. -next_ng_command()
  1934. -{
  1935. -    obit = -1;
  1936. -    if (!*bptr || *bptr == '-') {
  1937. -        if (cflag)
  1938. -            clear(bit);
  1939. -        else
  1940. -            putc('\n', ofp);
  1941. -        if (*bptr)
  1942. -            actdirect = BACKWARD;
  1943. -        rfq = 0;
  1944. -        saveart;
  1945. -        if (nextng()) {
  1946. -            if (actdirect == BACKWARD)
  1947. -                fprintf(ofp, "Can't back up.\n");
  1948. -            else
  1949. -                return TRUE;
  1950. -        }
  1951. -        return FALSE;
  1952. -    }
  1953. -    while (isspace(*bptr))
  1954. -        bptr++;
  1955. -    if (!validng(bptr)) {
  1956. -        fprintf(ofp, "No such group.\n");
  1957. -        return FALSE;
  1958. -    }
  1959. -    if (cflag)
  1960. -        clear(bit);
  1961. -    else
  1962. -        putc('\n', ofp);
  1963. -    readmode = SPEC;
  1964. -    rfq = 0;
  1965. -    saveart;
  1966. -    back();
  1967. -    selectng(bptr, TRUE, TRUE);
  1968. -    return FALSE;
  1969. -}
  1970. -
  1971. -caesar_command()
  1972. -{
  1973. -    char    temp[BUFLEN];
  1974. -    FILE    *pfp, *popen();
  1975. -
  1976. -    fprintf(stderr, "Caesar decoding:\n");
  1977. -    (void) sprintf(temp, "%s/%s", LIB, "caesar");
  1978. -    if (*bptr) {
  1979. -        (void) strcat(temp, " ");
  1980. -        (void) strcat(temp, bptr);
  1981. -    }
  1982. -    if (NLINES(h, fp) > LNCNT && *PAGER) {
  1983. -        (void) strcat(temp, " | ");
  1984. -        (void) strcat(temp, PAGER);
  1985. -    }
  1986. -    pfp = popen(temp, "w");
  1987. -    tprint(fp, pfp, FALSE);
  1988. -    FCLOSE(fp);
  1989. -    (void) pclose(pfp);
  1990. -}
  1991. -
  1992. -/*
  1993. - * Show the user the tail, if any, of the message on file
  1994. - * descriptor fd, and close fd.  The digester is considered,
  1995. - * and the pager is used if appropriate.
  1996. - */
  1997. -showtail(fd)
  1998. -FILE *fd;
  1999. -{
  2000. -    if (fd == NULL)
  2001. -        return;
  2002. -
  2003. -    if (dgest) {
  2004. -        digest(fd, ofp, h);
  2005. -    } else if (!lflag && !pflag && !eflag) {
  2006. -        pprint(fd);
  2007. -    }
  2008. -    (void) fclose(fd);
  2009. -}
  2010. -
  2011. -/*
  2012. - * Print out the rest of the article through the pager.
  2013. - */
  2014. -pprint(fd)
  2015. -FILE *fd;
  2016. -{
  2017. -#ifdef PAGE
  2018. -    /* Filter the tail of long messages through PAGER. */
  2019. -    if (NLINES(h, fd) > LNCNT && *PAGER) {
  2020. -        if (!index(PAGER, FMETA)) {
  2021. -            FILE *pfp, *popen();
  2022. -
  2023. -            pfp = popen(PAGER, "w");
  2024. -            if (pfp == NULL)
  2025. -                pfp = ofp;
  2026. -            /*
  2027. -             * What follows is an attempt to prevent the
  2028. -             * next message from scrolling part of this
  2029. -             * message off the top of the screen before
  2030. -             * the poor luser can read it.
  2031. -             */
  2032. -            tprint(fd, pfp, FALSE);
  2033. -            putc('\f', pfp);
  2034. -            putc('\n', pfp);
  2035. -            putc(' ', pfp);
  2036. -            (void) pclose(pfp);
  2037. -        }
  2038. -        else
  2039. -            pout(ofp);
  2040. -        holdup = TRUE;
  2041. -    }
  2042. -    else
  2043. -#endif
  2044. -        tprint(fd, ofp, FALSE);
  2045. -}
  2046. -
  2047. -/*
  2048. - * Find the next article we want to consider, if we're done with
  2049. - * the last one, and show the header.
  2050. - */
  2051. -getnextart(minus)
  2052. -int minus;
  2053. -{
  2054. -     int noaccess;
  2055. -     register DIR *dirp;
  2056. -     register struct direct *dir;
  2057. -     long nextnum, tnum;
  2058. -
  2059. -     noaccess = 0;
  2060. -
  2061. -    if (minus)
  2062. -        goto nextart2;    /* Kludge for "-" command. */
  2063. -
  2064. -    if (bit == obit)    /* Return if still on same article as last time */
  2065. -        return 0;
  2066. -
  2067. -    SigTrap = FALSE;
  2068. -
  2069. -nextart:
  2070. -#ifdef DEBUG
  2071. -    fprintf(stderr,"nextart:\n");
  2072. -#endif /* DEBUG */
  2073. -    dgest = 0;
  2074. -
  2075. -    if (bit < minartno && !rflag)
  2076. -        bit = minartno;
  2077. -
  2078. -    /* If done with this newsgroup, find the next one. */
  2079. -    while (ngsize <= 0 || (!rflag && ((long) bit > ngsize)) || (rflag && bit < minartno)) {
  2080. -        if (nextng()) {
  2081. -            if (actdirect == BACKWARD) {
  2082. -                fprintf(ofp, "Can't back up.\n");
  2083. -                actdirect = FORWARD;
  2084. -                continue;
  2085. -            } else
  2086. -                if (rfq++ || pflag || cflag)
  2087. -                    return 1;
  2088. -            break;
  2089. -        }
  2090. -        if (rflag)
  2091. -            bit = ngsize + 1;
  2092. -        else
  2093. -            bit = minartno - 1;
  2094. -        if (uflag && !xflag) {
  2095. -            time_t now;
  2096. -            (void) time(&now);
  2097. -            if (now - timelastsaved > 5*60 /* 5 minutes */) {
  2098. -                if (!xflag)
  2099. -                    fprintf(stderr,"[Saving .newsrc]\n");
  2100. -                writeoutrc();
  2101. -                timelastsaved = now;
  2102. -            }
  2103. -        }
  2104. -        noaccess = 0;
  2105. -    }
  2106. -
  2107. -nextart2:
  2108. -#ifdef DEBUG
  2109. -    fprintf(stderr, "article: %s/%ld\n", groupdir, bit);
  2110. -#endif
  2111. -    if (rcreadok)
  2112. -        rcreadok = 2;    /* have seen >= 1 article */
  2113. -    (void) sprintf(filename, "%s/%ld", dirname(groupdir), bit);
  2114. -    if (rfq && goodone[0])
  2115. -        strcpy(filename, goodone);
  2116. -    if (SigTrap) {
  2117. -        if (SigTrap == SIGHUP)
  2118. -            return 1;
  2119. -        if (!rcreadok)
  2120. -            xxit(0);
  2121. -        fprintf(ofp, "Abort (n)?  ");
  2122. -        (void) fflush(ofp);
  2123. -        (void) gets(bfr);
  2124. -        if (*bfr == 'y' || *bfr == 'Y')
  2125. -            xxit(0);
  2126. -        SigTrap = FALSE;
  2127. -    }
  2128. -#ifdef DEBUG
  2129. -    fprintf(stderr, "filename = '%s'\n", filename);
  2130. -#endif
  2131. -    /* Decide if we want to show this article. */
  2132. -     if (bit <= 0 || (fp = art_open(filename, "r")) == NULL) {
  2133. -        /* don't show the header if the article was specifically
  2134. -         * requested and it isn't there
  2135. -         */
  2136. -        if (lbuf[0] == '<') {
  2137. -            lbuf[0] = '\0';
  2138. -            bit = -1;
  2139. -            return 1;
  2140. -        }
  2141. -         /* since there can be holes in legal article numbers, */
  2142. -         /* we wait till we hit 5 consecutive bad articles */
  2143. -         /* before we haul off and scan the directory */
  2144. -         if (++noaccess < 5)
  2145. -             goto badart;
  2146. -        noaccess = 0;
  2147. -         dirp = opendir(dirname(groupdir));
  2148. -         if (dirp == NULL) {
  2149. -            if (errno != EACCES)
  2150. -                fprintf(stderr,"Can't open %s\n", dirname(groupdir));
  2151. -             goto badart;
  2152. -         }
  2153. -         nextnum = rflag ? minartno - 1 : ngsize + 1;
  2154. -         while ((dir = readdir(dirp)) != NULL) {
  2155. -             tnum = atol(dir->d_name);
  2156. -             if (tnum <= 0)
  2157. -                 continue;
  2158. -             if (rflag ? (tnum > nextnum && tnum < bit)
  2159. -                   : (tnum < nextnum && tnum > bit))
  2160. -                 nextnum = tnum;
  2161. -         }
  2162. -         closedir(dirp);
  2163. -         if (rflag ? (nextnum >= bit) : (nextnum <= bit))
  2164. -             goto badart;
  2165. -#ifdef DEBUG
  2166. -        fprintf(stderr,"nextnum = %ld\n",nextnum);
  2167. -#endif /* DEBUG */
  2168. -         do {
  2169. -             clear(bit);
  2170. -             nextbit();
  2171. -         } while (rflag ? (nextnum < bit) : (nextnum > bit));
  2172. -         obit = -1;
  2173. -         abs = FALSE;
  2174. -        if (ignorenews) /* ignored news is still news */
  2175. -            news = TRUE;
  2176. -         goto nextart;
  2177. -     } else
  2178. -         noaccess = 0;
  2179. -
  2180. -     if (ignorenews || hread(h, fp, TRUE) == NULL
  2181. -        || (!rfq && !aselect(h, abs))) {
  2182. -        if (ignorenews)
  2183. -            news = TRUE;
  2184. - badart:
  2185. -#ifdef DEBUG
  2186. -        fprintf(stderr, "Bad article '%s'\n", filename);
  2187. -#endif
  2188. -        FCLOSE(fp);
  2189. -        clear(bit);
  2190. -        obit = -1;
  2191. -        nextbit();
  2192. -        abs = FALSE;
  2193. -        goto nextart;
  2194. -    }
  2195. -    abs = FALSE;
  2196. -    actdirect = FORWARD;
  2197. -    news = TRUE;
  2198. -    hdr();
  2199. -    if (pflag)
  2200. -        tprint(fp, ofp, FALSE);
  2201. -    else if (cflag && !lflag && !eflag) {
  2202. -        (void) fflush(ofp);
  2203. -        pprint(fp);
  2204. -    }
  2205. -    if (cflag || lflag || eflag || pflag) {
  2206. -        SigTrap = FALSE;
  2207. -        FCLOSE(fp);
  2208. -    }
  2209. -    obit = bit;
  2210. -    return 0;
  2211. -}
  2212. -
  2213. -/*
  2214. - * Print out whatever the appropriate header is
  2215. - */
  2216. -hdr()
  2217. -{
  2218. -    char *briefdate();
  2219. -
  2220. -    if (rfq)
  2221. -        return;
  2222. -
  2223. -    if (lflag || eflag) {
  2224. -        hprint(h, ofp, 0);
  2225. -        return;
  2226. -    }
  2227. -
  2228. -    /* Print out a header */
  2229. -    if (ngrp) {
  2230. -        pngsize = ngsize;
  2231. -        ngrp--;
  2232. -        nghprint(groupdir);
  2233. -    }
  2234. -    if (!hflag)
  2235. -        fprintf(ofp, "Article %ld of %ld, %s.\n",
  2236. -            bit, pngsize, briefdate(h->subdate));
  2237. -    hprint(h, ofp, pflag ? 1 : 0);
  2238. -}
  2239. -
  2240. -nghprint(title)
  2241. -char *title;
  2242. -{
  2243. -    char *tstr = "Newsgroup ";
  2244. -    int l = strlen(title) + strlen(tstr);
  2245. -
  2246. -    fprintf(ofp, "\n");
  2247. -    if (!hflag) {
  2248. -        dash(l, ofp);
  2249. -        fprintf(ofp, "%s%s\n", tstr, title);
  2250. -        dash(l, ofp);
  2251. -    } else {
  2252. -        fprintf(ofp, "%s%s, ", tstr, title);
  2253. -        if (bit == pngsize)
  2254. -            fprintf(ofp, "%ld\n", pngsize);
  2255. -        else
  2256. -            fprintf(ofp, "%ld-%ld\n", bit, pngsize);
  2257. -    }
  2258. -    fprintf(ofp, "\n");
  2259. -}
  2260. -
  2261. -/*
  2262. - * Routine to catch a continue signal.
  2263. - */
  2264. -catchcont(sig)
  2265. -int sig;
  2266. -{
  2267. -    (void) signal(sig, catchcont);
  2268. -    SigTrap = sig;
  2269. -    (void) fflush(ofp);
  2270. -#ifdef SIGCONT
  2271. -    if (fp && sig == SIGCONT)
  2272. -        hdr();
  2273. -    if (sig != SIGCONT)
  2274. -#endif /* SIGCONT */
  2275. -        putc('\n', ofp);
  2276. -    if (canlongjmp)
  2277. -        longjmp(sigjmpbuf,1);
  2278. -}
  2279. -
  2280. -xxit(status)
  2281. -int    status;
  2282. -{
  2283. -    (void) unlink(infile);
  2284. -    (void) unlink(outfile);
  2285. -#ifdef SORTACTIVE
  2286. -    if (strncmp(ACTIVE,"/tmp/", 5) == 0)
  2287. -        (void) unlink(ACTIVE);
  2288. -#endif /* SORTACTIVE */
  2289. -    exit(status);
  2290. -}
  2291. *-*-END-of-src/readr.c-*-*
  2292. echo x - src/pathinit.c 1>&2
  2293. sed 's/.//' >src/pathinit.c <<'*-*-END-of-src/pathinit.c-*-*'
  2294. -/*
  2295. - * This software is Copyright (c) 1986 by Rick Adams.
  2296. - *
  2297. - * Permission is hereby granted to copy, reproduce, redistribute or
  2298. - * otherwise use this software as long as: there is no monetary
  2299. - * profit gained specifically from the use or reproduction or this
  2300. - * software, it is not sold, rented, traded or otherwise marketed, and
  2301. - * this copyright notice is included prominently in any copy
  2302. - * made.
  2303. - *
  2304. - * The author make no claims as to the fitness or correctness of
  2305. - * this software for any use whatsoever, and it is provided as is. 
  2306. - * Any use of this software is at the user's own risk.
  2307. - *
  2308. - * This function initializes all the strings used for the various
  2309. - * filenames.  They cannot be compiled into the program, since that
  2310. - * would be non-portable.  With this convention, the netnews sub-system
  2311. - * can be owned by any non-privileged user.  It is also possible
  2312. - * to work when the administration randomly moves users from one
  2313. - * filesystem to another.  The convention is that a particular user
  2314. - * (HOME, see Makefile) is searched for in /etc/passwd and all files
  2315. - * are presumed relative to there.  This method also allows one copy
  2316. - * of the object code to be used on ANY machine.  (this code runs
  2317. - * un-modified on 50+ machines at IH!!)
  2318. - *
  2319. - * The disadvantage to using this method is that all netnews programs
  2320. - * (inews, readnews, rnews, checknews) must first search /etc/passwd
  2321. - * before they can start up.  This can cause significant overhead if
  2322. - * you have a big password file.
  2323. - *
  2324. - * Some games are played with ifdefs to get four .o files out of this
  2325. - * one source file.  INEW is defined for inews, READ for readnews,
  2326. - * CHKN for checknews, and EXP for expire.
  2327. - */
  2328. -
  2329. -#ifdef SCCSID
  2330. -static char    *SccsId = "@(#)pathinit.c    1.18    10/23/86";
  2331. -#endif /* SCCSID */
  2332. -
  2333. -#if defined(INEW) || defined(EXP)
  2334. -#include    "iparams.h"
  2335. -#endif /* INEW || EXP */
  2336. -
  2337. -#ifdef READ
  2338. -#include    "rparams.h"
  2339. -#endif /* READ */
  2340. -
  2341. -#if defined(CHKN)
  2342. -#include "params.h"
  2343. -#endif /* CHKN */
  2344. -
  2345. -
  2346. -char *FULLSYSNAME, *SPOOL, *LIB, *BIN, *ACTIVE, *SUBFILE, *ARTFILE,
  2347. -    *username, *userhome;
  2348. -
  2349. -#ifdef INEW
  2350. -char *LOCKFILE, *SEQFILE, *ARTICLE, *INFILE, *TELLME;
  2351. -
  2352. -int c_cancel(), c_newgroup(), c_ihave(), c_sendme(), c_rmgroup(),
  2353. -    c_sendsys(), c_senduuname(), c_version(), c_checkgroups(), c_unimp();
  2354. -
  2355. -struct msgtype msgtype[] = {
  2356. -    "cancel", NULL, c_cancel,
  2357. -    "newgroup", NULL, c_newgroup,
  2358. -    "ihave", NULL, c_ihave,
  2359. -    "sendme", NULL, c_sendme,
  2360. -    "sendbad", NULL, c_sendme,
  2361. -    "rmgroup", NULL, c_rmgroup,
  2362. -    "sendsys", NULL, c_sendsys,
  2363. -    "senduuname", NULL, c_senduuname,
  2364. -    "version", NULL, c_version,
  2365. -    "checkgroups", NULL, c_checkgroups,
  2366. -    "delsub", NULL, c_unimp,
  2367. -    NULL, NULL, NULL
  2368. -};
  2369. -#endif /* INEW */
  2370. -
  2371. -#if defined(INEW) || defined(READ)
  2372. -char *ALIASES;
  2373. -#endif /* INEW || READ */
  2374. -
  2375. -#ifdef EXP
  2376. -char *OLDNEWS;
  2377. -#endif /* EXP */
  2378. -
  2379. -#ifdef READ
  2380. -char *MAILPARSER;
  2381. -#endif /* READ */
  2382. -
  2383. -#ifdef HIDDENNET
  2384. -char *LOCALSYSNAME;
  2385. -#endif /* HIDDENNET */
  2386. -
  2387. -
  2388. -struct passwd *getpwnam();
  2389. -char *rindex();
  2390. -
  2391. -#define Sprintf(where,fmt,arg)    (void) sprintf(bfr,fmt,arg); where = AllocCpy(bfr)
  2392. -
  2393. -char *
  2394. -AllocCpy(cp)
  2395. -register char *cp;
  2396. -{
  2397. -    register char *mp;
  2398. -    char *malloc();
  2399. -
  2400. -    mp = malloc((unsigned)strlen(cp) + 1);
  2401. -
  2402. -    if (mp == NULL)
  2403. -        xerror("malloc failed on %s", cp);
  2404. -
  2405. -    (void) strcpy(mp, cp);
  2406. -    return mp;
  2407. -}
  2408. -
  2409. -pathinit()
  2410. -{
  2411. -#if defined(INEW) && defined(NOTIFY)
  2412. -    FILE *nfd;        /* notify file descriptor */
  2413. -    char *p;
  2414. -#endif /* INEW && NOTIFY */
  2415. -#ifndef ROOTID
  2416. -    struct passwd    *pw;    /* struct for pw lookup    */
  2417. -#endif /* !ROOTID */
  2418. -#ifdef EXP
  2419. -    char *p;
  2420. -#endif /* EXP */
  2421. -#ifndef CHKN
  2422. -    struct utsname ubuf;
  2423. -
  2424. -    uname(&ubuf);
  2425. -#ifdef HIDDENNET
  2426. -    FULLSYSNAME = AllocCpy(HIDDENNET);
  2427. -    LOCALSYSNAME = AllocCpy(ubuf.nodename);
  2428. -#else /* !HIDDENNET */
  2429. -    FULLSYSNAME = AllocCpy(ubuf.nodename);
  2430. -#endif /* !HIDDENNET */
  2431. -#endif /* !CHKN */
  2432. -
  2433. -#ifdef HOME
  2434. -    /* Relative to the home directory of user HOME */
  2435. -    (void) sprintf(bfr, "%s/%s", logdir(HOME), SPOOLDIR);
  2436. -    SPOOL = AllocCpy(bfr);
  2437. -    (void) sprintf(bfr, "%s/%s", logdir(HOME), LIBDIR);
  2438. -    LIB = AllocCpy(bfr);
  2439. -#else /* !HOME */
  2440. -    /* Fixed paths defined in Makefile */
  2441. -    SPOOL = AllocCpy(SPOOLDIR);
  2442. -    LIB = AllocCpy(LIBDIR);
  2443. -#endif /* !HOME */
  2444. -
  2445. -#ifdef IHCC
  2446. -    (void) sprintf(bfr, "%s/%s", logdir(HOME), BINDIR);
  2447. -    BIN = AllocCpy(bfr);
  2448. -#else /* !IHCC */
  2449. -    Sprintf(BIN, "%s", BINDIR);
  2450. -#endif /* !IHCC */
  2451. -
  2452. -    Sprintf(ACTIVE, "%s/active", LIB);
  2453. -
  2454. -#ifdef EXP
  2455. -    (void) strcpy(bfr, SPOOL);
  2456. -    p = rindex(bfr, '/');
  2457. -    if (p) {
  2458. -        strcpy(++p, "oldnews");
  2459. -        OLDNEWS = AllocCpy(bfr);
  2460. -    } else
  2461. -        OLDNEWS = AllocCpy("oldnews");
  2462. -#endif /* EXP */
  2463. -
  2464. -#ifndef CHKN
  2465. -    Sprintf(SUBFILE, "%s/sys", LIB);
  2466. -    Sprintf(ARTFILE, "%s/history", LIB);
  2467. -# endif /* !CHKN */
  2468. -
  2469. -# ifdef READ
  2470. -#ifdef SENDMAIL
  2471. -    Sprintf(MAILPARSER, "%s -oi -oem", SENDMAIL);
  2472. -#else /* !SENDMAIL */
  2473. -    Sprintf(MAILPARSER, "%s/recmail", LIB);
  2474. -#endif /* !SENDMAIL */
  2475. -# endif /* READ */
  2476. -
  2477. -# if defined(READ) || defined(INEW)
  2478. -    Sprintf(ALIASES, "%s/aliases", LIB);
  2479. -# endif /* READ || INEW */
  2480. -# ifdef INEW
  2481. -    Sprintf(LOCKFILE, "%s/LOCK", LIB);
  2482. -    Sprintf(SEQFILE, "%s/seq", LIB);
  2483. -    Sprintf(ARTICLE, "%s/.arXXXXXX", SPOOL);
  2484. -    Sprintf(INFILE, "%s/.inXXXXXX", SPOOL);
  2485. -/*
  2486. - * The person notified by the netnews sub-system.  Again, no name is
  2487. - * compiled in, but instead the information is taken from a file.
  2488. - * If the file does not exist, a "default" person will get the mail.
  2489. - * If the file exists, but is empty, nobody will get the mail.  This
  2490. - * may seem backwards, but is a better fail-safe.
  2491. - */
  2492. -# ifdef NOTIFY
  2493. -    parse_notify();
  2494. -# endif /* NOTIFY */
  2495. -
  2496. -/*
  2497. - * Since the netnews owner's id number is different on different
  2498. - * systems, we'll extract it from the /etc/passwd file.  If no entry,
  2499. - * default to root.  This id number seems to only be used to control who
  2500. - * can input certain control messages or cancel any message.  Note that
  2501. - * entry is the name from the "notify" file as found above if possible.
  2502. - * Defining ROOTID in defs.h hardwires in a number and avoids
  2503. - * another search of /etc/passwd.
  2504. - */
  2505. -# ifndef ROOTID
  2506. -    if ((pw = getpwnam(TELLME)) != NULL)
  2507. -        ROOTID =  pw->pw_uid;
  2508. -    else if ((pw = getpwnam(HOME)) != NULL)
  2509. -        ROOTID =  pw->pw_uid;
  2510. -    else
  2511. -        ROOTID = 0;        /* nobody left, let only root */
  2512. -# endif /* !ROOTID */
  2513. -#endif /* INEW */
  2514. -}
  2515. -
  2516. -#ifdef INEW
  2517. -#ifdef NOTIFY
  2518. -/*
  2519. - * Attempt to parse the LIB/notify file into the global structure msgtype[].
  2520. - */
  2521. -parse_notify()
  2522. -{
  2523. -    FILE *nfd;
  2524. -    int valid = 0, done = 0;
  2525. -    register struct msgtype *mp;
  2526. -    char mtype[BUFLEN], addr[BUFLEN];
  2527. -
  2528. -    (void) sprintf(bfr, "%s/notify", LIB);
  2529. -#ifndef ROOTID
  2530. -    TELLME = AllocCpy(NOTIFY);    
  2531. -#endif /* !ROOTID */
  2532. -    if ( (nfd = fopen(bfr, "r")) == NULL) {
  2533. -        /* 
  2534. -         * Set defaults to NOTIFY
  2535. -         */
  2536. -#ifdef debug
  2537. -        log("parse_notify: %s/notify not found", LIB);
  2538. -#endif /* debug */
  2539. -        (void)setmsg("all", NOTIFY);
  2540. -        return;
  2541. -    }
  2542. -    do  {
  2543. -        mtype[0] = addr[0] = 0;
  2544. -        switch( get_notify(nfd, mtype, addr) ) {
  2545. -        case 0:
  2546. -            continue;
  2547. -        case 1:
  2548. -            valid += setmsg(mtype, "");
  2549. -            break;
  2550. -        case 2:
  2551. -            valid += setmsg(mtype, addr);
  2552. -            break;
  2553. -        case -1:
  2554. -            if( !valid ) {
  2555. -#ifdef debug
  2556. -                log("parse_notify: no valid entries found.");
  2557. -#endif /* debug */
  2558. -                setmsg("all", ""); /* send mail to no one */
  2559. -            }
  2560. -            done = 1;
  2561. -        }
  2562. -    } while( !done );
  2563. -
  2564. -    /*
  2565. -     * point to zero length string for all entries we haven't touched
  2566. -     */
  2567. -    for(mp=msgtype; mp->m_name; mp++)
  2568. -        if(mp->m_who_to == 0)
  2569. -            mp->m_who_to = "";
  2570. -}
  2571. -
  2572. -setmsg(what, to)
  2573. -char *what, *to;
  2574. -{
  2575. -    register struct msgtype *mp;
  2576. -#ifdef debug
  2577. -    log("setmsg: what='%s', to='%s'", what, to);
  2578. -#endif /* debug */
  2579. -    /*
  2580. -     * Special case for "all"
  2581. -     */
  2582. -    if(strcmp(what, "all") == 0) {
  2583. -        for(mp=msgtype; mp->m_name; mp++) {
  2584. -            mp->m_who_to = AllocCpy(to);
  2585. -#ifdef debug
  2586. -            log("setmsg: '%s'='%s'", mp->m_name, mp->m_who_to);
  2587. -#endif /* debug */
  2588. -        }
  2589. -        return 1;
  2590. -    }
  2591. -
  2592. -    for(mp=msgtype; mp->m_name; mp++)
  2593. -        if(strcmp(mp->m_name, what) == 0) {
  2594. -            mp->m_who_to = AllocCpy(to);
  2595. -#ifdef debug
  2596. -            log("setmsg: '%s'='%s'", mp->m_name, mp->m_who_to);
  2597. -#endif /* debug */
  2598. -            return 1;
  2599. -        }
  2600. -    return 0;
  2601. -}
  2602. -
  2603. -static
  2604. -get_notify(fp, s, t)
  2605. -FILE *fp;
  2606. -register char *s, *t;
  2607. -{
  2608. -    register char *cp;
  2609. -    char buf[BUFSIZ];
  2610. -
  2611. -    if( cp=fgets(buf, sizeof(buf), fp ) ) {
  2612. -        if( *cp == '\n' ) 
  2613. -            return 0;
  2614. -        while(*cp && *cp != ' ' && *cp != '\t' && *cp != '\n')
  2615. -            *s++ = *cp++;
  2616. -        *s = '\0';    /* terminate first string */
  2617. -
  2618. -        while(*cp && (*cp == ' ' || *cp == '\t' || *cp == '\n') )
  2619. -            cp++;    /* look for start of second */
  2620. -        if( !*cp || *cp == '\n' )
  2621. -            return 1;     /* no second string */
  2622. -        
  2623. -        while( *cp && *cp != '\n' )
  2624. -            *t++ = *cp++;
  2625. -        *t = '\0';
  2626. -        return 2;
  2627. -    } else
  2628. -        return -1;
  2629. -}
  2630. -#endif /* NOTIFY */
  2631. -#endif /* INEW */
  2632. *-*-END-of-src/pathinit.c-*-*
  2633. echo x - src/localize.sample 1>&2
  2634. sed 's/.//' >src/localize.sample <<'*-*-END-of-src/localize.sample-*-*'
  2635. -rm -f Makefile
  2636. -cp Makefile.dst Makefile
  2637. -chmod u+w Makefile
  2638. -ed Makefile  <<'EOF'
  2639. -/^UUXFLAGS/s/-r -z/-r -z -n -gd/
  2640. -g/^#V7 /s///
  2641. -g/^#BSD4_3 /s///
  2642. -g/^#BSD4_1 /d
  2643. -g/^#USG /d
  2644. -/^LIBDIR/s;/usr/lib/news;/usr/new/lib/news;
  2645. -/^BINDIR/s;/usr/bin;/usr/new;
  2646. -w
  2647. -q
  2648. -EOF
  2649. -rm -f defs.h
  2650. -cp defs.dist defs.h
  2651. -chmod u+w defs.h
  2652. -ed - defs.h <<'EOF'
  2653. -/ROOTID/s/10/352/
  2654. -/N_UMASK/s/000/002/
  2655. -/DFTXMIT/s/-z/-z -gd/
  2656. -/UXMIT/s/-z/-z -gd/
  2657. -/NONEWGROUPS/s;/\* ;;
  2658. -/INTERNET/s;/\* ;;
  2659. -/MYDOMAIN/s;.UUCP;.CSS.GOV;
  2660. -/GHNAME/s;/\* ;;
  2661. -/DOXREFS/s;/\* ;;
  2662. -/BSD4_2/s;/\* ;;
  2663. -/ALWAYSALIAS/s;/\* ;;
  2664. -/SENDMAIL/s;/\* ;;
  2665. -/HIDDENNET/s;frooz;seismo;
  2666. -s;/\* ;;
  2667. -/MYORG/s/Frobozz Inc., St. Louis/Center for Seismic Studies, Arlington, VA/
  2668. -/ORGDISTRIB/s;/\* ;;
  2669. -/ORGDISTRIB/s;froozum;css;
  2670. -w
  2671. -q
  2672. -EOF
  2673. *-*-END-of-src/localize.sample-*-*
  2674. exit
  2675.  
  2676.