Annotation of researchv10no/cmd/netnews/src/readr.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * readr - /bin/mail and msgs interface and associated functions.
                      3:  */
                      4: 
                      5: static char    *SccsId = "@(#)readr.c  2.26    5/3/83";
                      6: 
                      7: #include "rparams.h"
                      8: 
                      9: static char    lbuf[BUFLEN*2];
                     10: 
                     11: #define        saveart oobit = bit;strcpy(ofilename1, filename);strcpy(ogroupdir, groupdir);hbufcp(&hbuf1, &h);ongsize = pngsize
                     12: #define NLINES(h, fp) (h.numlines[0] ? h.intnumlines : (h.intnumlines=linecnt(fp),sprintf(h.numlines, "%d", h.intnumlines), h.intnumlines))
                     13: 
                     14: char *tft = "/tmp/folXXXXXX";
                     15: 
                     16: static int     hascaught = 0;
                     17: static catchintr()
                     18: {
                     19:        hascaught = 1;
                     20:        printf("\n");
                     21:        fflush(stdout);
                     22: }
                     23: 
                     24: /*
                     25:  * These were made static for u370 with its buggy cc.
                     26:  * I judged it better to have one copy with no ifdefs than
                     27:  * to conditionally compile them as automatic variables
                     28:  * in readr (which they originally were).  Performance
                     29:  * considerations might warrent moving some of the simple
                     30:  * things into register variables, but I don't know what
                     31:  * breaks the u370 cc.
                     32:  */
                     33: static char goodone[BUFLEN];           /* last decent article          */
                     34: static char ogroupdir[BUFLEN];         /* last groupdir                */
                     35: static char address[PATHLEN];          /* for reply copy               */
                     36: static char edcmdbuf[128];
                     37: static char folbuf[160];
                     38: static int rfq = 0;                    /* for last article             */
                     39: static long ongsize;                   /* Previous ngsize              */
                     40: static long pngsize;                   /* Printing ngsize              */
                     41: static char *bptr;                     /* temp pointer.                */
                     42: static struct srec srec;               /* srec for sys file entries    */
                     43: static char *tfilename;                        /* temporary file name          */
                     44: static char ofilename1[BUFLEN];                /* previous file name           */
                     45: static struct hbuf hbuf1, hbuf2, *hptr;        /* for minusing                 */
                     46: static char *ptr1, *ptr2, *ptr3;       /* for reply manipulation       */
                     47: static int  news = 0;
                     48: static int  abs = FALSE;               /* TRUE if we asked absolutely  */
                     49: static char *ed, tf[100];
                     50: static struct hbuf h;                  /* ditto.                       */
                     51: static int i;
                     52: static int oobit;                      /* last bit, really             */
                     53: static char *oldsig;
                     54: static int dgest = 0;
                     55: static FILE *ofp;                      /* Current output file to terminal*/
                     56: static FILE *fp;                       /* current article to be printed*/
                     57: static int holdup;                     /* 1 iff should stop before hdr */
                     58: static int ignorenews;                 /* 1 iff readnews -p > /dev/null*/
                     59: static long timelastsaved;             /* time newsrc last written out */
                     60: 
                     61: int catchcont();
                     62: 
                     63: readr()
                     64: {
                     65: 
                     66: #ifdef DEBUG
                     67:        fprintf(stderr, "readr()\n");
                     68: #endif
                     69:        if (aflag) {
                     70:                if (*datebuf) {
                     71:                        if ((atime = cgtdate(datebuf)) == -1)
                     72:                                xerror("Cannot parse date string");
                     73:                } else 
                     74:                        atime = 0L;
                     75:        }
                     76: 
                     77:        if (pflag && ignoring())
                     78:                ignorenews = TRUE;
                     79: 
                     80:        if (xflag)
                     81:                uflag = 0;
                     82:        if (uflag)
                     83:                time(&timelastsaved);
                     84: 
                     85:        ofp = stdout;
                     86:        if (cflag && coptbuf[0] != '\0') {
                     87:                umask(022);
                     88:                mktemp(outfile);        /* get "unique" file name */
                     89:                ofp = xfopen(outfile, "w");
                     90:                umask(N_UMASK);
                     91:                cflag = FALSE;
                     92:                pflag = TRUE;
                     93:        }
                     94: 
                     95:        /* loop reading articles. */
                     96:        fp = NULL;
                     97:        obit = -1;
                     98:        nextng();
                     99:        for ( ;; ) {
                    100:                if (getnextart(FALSE))
                    101:                        break;
                    102: #ifdef DEBUG
                    103:                printf("after getnextart, fp %x, pos %d, bit %d, group '%s', filename '%s'\n",
                    104:                        fp, ftell(fp), bit, groupdir, filename);
                    105: #endif
                    106:                strcpy(goodone, filename);
                    107:                if (pflag || lflag || eflag) {
                    108:                        /* This code should be gotten rid of */
                    109:                        if (sigtrap) {
                    110:                                qfflush(ofp);
                    111:                                fprintf(ofp, "\n");
                    112:                                cdump(ofp);
                    113:                                _exit(0); /* kludge! drop when qfflush works */
                    114:                                return;
                    115:                        }
                    116:                        clear(bit);
                    117:                        nextbit();
                    118:                        if (fp) {
                    119:                                fclose(fp);
                    120:                                fp = NULL;
                    121:                        }
                    122:                        continue;
                    123:                }
                    124:                for ( ;; ) {
                    125:                        char *pp;
                    126: #ifdef SIGCONT
                    127:                        int (*ocont)();
                    128: #endif
                    129:                        sigtrap = FALSE;
                    130:                        if (!cflag) {
                    131:                                if (rfq)
                    132:                                        fprintf(ofp, "Last article.  [qfr] ");
                    133:                                else
                    134:                                        fprintf(ofp, "(%d lines) More? [ynq] ", NLINES(h, fp));
                    135:                        } else
                    136:                                fprintf(ofp, "? ");
                    137:                        fflush(ofp);
                    138:                        bptr = lbuf;
                    139: #ifdef SIGCONT
                    140:                        ocont = signal(SIGCONT, catchcont);
                    141: #endif
                    142:                        pp = fgets(bptr, BUFLEN, stdin);
                    143: #ifdef SIGCONT
                    144:                        signal(SIGCONT, ocont);
                    145: #endif
                    146:                        if (pp != NULL)
                    147:                                break;
                    148:                        if (!sigtrap)
                    149:                                return;
                    150: #ifdef SIGCONT
                    151:                        if (sigtrap != SIGCONT)
                    152: #endif
                    153:                                fprintf(ofp, "\n");
                    154:                }
                    155:                nstrip(bptr);
                    156:                while (*bptr == ' ' || *bptr == '\t')
                    157:                        bptr++;
                    158:                i = command();
                    159:                if (i)
                    160:                        break;
                    161:        }
                    162: 
                    163:        if (!news)
                    164:                fprintf(stderr, "No news.\n");
                    165:        cout(ofp);
                    166: }
                    167: 
                    168: 
                    169: #define EOL() if (*bptr != '\0') { fprintf(ofp, "? for commands.\n"); return FALSE; }
                    170: /*
                    171:  * Process one command, which has already been typed in.
                    172:  */
                    173: command()
                    174: {
                    175:        char *findhist();
                    176: 
                    177:        switch (i = *bptr++) {
                    178: 
                    179:        /* No.  Go on to next article. */
                    180:        case 'n':
                    181:                EOL();
                    182:                itsbeenseen(h.ident);
                    183:                readmode = NEXT;
                    184:                if (!cflag) {
                    185:                        fclose(fp);
                    186:                        fp = NULL;
                    187:                }
                    188:                fprintf(ofp, "\n");
                    189:                clear(bit);
                    190:                saveart;
                    191:                nextbit();
                    192:                break;
                    193: 
                    194:        /* Undigestify the article. */
                    195:        case 'd':
                    196:                dgest = 1;
                    197:                /* fall through */
                    198: 
                    199:        /* yes: print this article, go on. */
                    200:        case 'y':
                    201:                EOL();
                    202:                /* fall through. */
                    203: 
                    204:        /* The user hit return.  Default is 'y' unless rfq, then it's 'q'. */
                    205:        case '\0':
                    206:                if (!bptr[-1] && rfq)
                    207:                        return;
                    208:                readmode = NEXT;
                    209:                showtail(fp);
                    210:                clear(bit);
                    211:                saveart;
                    212:                nextbit();
                    213:                break;
                    214: 
                    215:        /*
                    216:         * Unsubscribe to the newsgroup and go on to next group
                    217:         */
                    218:        case 'u':
                    219:                fprintf(ofp, "To unsubscribe, use 'U'\n");
                    220:                break;
                    221: 
                    222:        case 'U':
                    223:                fprintf(ofp, "Unsubscribing to newsgroup: %s\n", groupdir);
                    224:                obit = -1;
                    225:                if (fp != NULL) {
                    226:                        fclose(fp);
                    227:                        fp = NULL;
                    228:                }
                    229:                if (cflag)
                    230:                        clear(bit);
                    231:                else
                    232:                        putc('\n', ofp);
                    233:                rfq = 0;
                    234:                zapng = TRUE;
                    235:                saveart;
                    236:                if (nextng()) {
                    237:                        if (actdirect == BACKWARD)
                    238:                                fprintf(ofp, "Can't back up.\n");
                    239:                        else
                    240:                                return TRUE;
                    241:                }
                    242:                break;
                    243: 
                    244:                /* Print the current version of news */
                    245:        case 'v':
                    246:                fprintf(ofp, "News version: %s\n", news_version);
                    247:                break;
                    248: 
                    249:                /* reprint the article */
                    250:        case 'p':
                    251:                EOL();
                    252:                if (!cflag)
                    253:                        goto minus;
                    254:                readmode = NEXT;
                    255:                if (!cflag) {
                    256:                        fclose(fp);
                    257:                        fp = NULL;
                    258:                        bit = last;
                    259:                        putc('\n', ofp);
                    260:                }
                    261:                obit = -1;
                    262:                break;
                    263: 
                    264:                /* decrypt joke */
                    265:        case 'D': 
                    266:                caesar_command();
                    267:                readmode = NEXT;
                    268:                clear(bit);
                    269:                saveart;
                    270:                nextbit();
                    271:                break;
                    272: 
                    273:                /* write out the article someplace */
                    274:        case 's':
                    275:        case 'w':
                    276:                {
                    277:                char *grn = groupdir;
                    278:                tfilename = filename;
                    279:                if (*bptr == '-') {
                    280:                        bptr++;
                    281:                        grn = ogroupdir;
                    282:                        if (*ofilename1)
                    283:                                tfilename = ofilename1;
                    284:                }
                    285:                if (*bptr != '\0' && *bptr != ' ') {
                    286:                        fprintf(ofp, "Bad file name.\n");
                    287:                        break;
                    288:                }
                    289:                while (*bptr == ' ')
                    290:                        bptr++;
                    291:                if (*bptr != '|' && *bptr != '/') {
                    292:                        char    hetyped[BUFLEN];
                    293:                        char    *boxptr;
                    294:                        strcpy(hetyped, bptr);
                    295:                        if (boxptr = getenv("NEWSBOX"))
                    296:                                if (index(boxptr, '%'))
                    297:                                        sprintf(bptr, boxptr, grn);
                    298:                                else
                    299:                                        strcpy(bptr, boxptr);
                    300:                        else if (hetyped[0] == '~' && hetyped[1] == '/') {
                    301:                                strcpy(hetyped, bptr+2);
                    302:                                strcpy(bptr, userhome);
                    303:                        } else
                    304:                                strcpy(bptr, ".");
                    305:                        strcat(bptr, "/");
                    306:                        if (hetyped[0] != '\0')
                    307:                                strcat(bptr, hetyped);
                    308:                        else
                    309:                                strcat(bptr, "Articles");
                    310:                }
                    311:                fwait(fsubr(save, tfilename, bptr));
                    312:                }
                    313:                break;
                    314: 
                    315:                /* back up  */
                    316:        case '-':
                    317: minus:
                    318:                rfq = 0;
                    319:                abs = TRUE;
                    320:                if (!*ofilename1) {
                    321:                        fprintf(ofp, "Can't back up.\n");
                    322:                        break;
                    323:                }
                    324:                if (cflag)
                    325:                        clear(bit);
                    326:                else {
                    327:                        fclose(fp);
                    328:                        fp = NULL;
                    329:                        putc('\n', ofp);
                    330:                }
                    331:                hbufcp(&hbuf2, &h);
                    332:                hbufcp(&h, &hbuf1);
                    333:                hbufcp(&hbuf1, &hbuf2);
                    334:                strcpy(bfr, filename);
                    335:                strcpy(filename, ofilename1);
                    336:                strcpy(ofilename1, bfr);
                    337:                obit = bit;
                    338:                if (strcmp(groupdir, ogroupdir)) {
                    339:                        strcpy(bfr, groupdir);
                    340:                        selectng(ogroupdir);
                    341:                        strcpy(groupdir, ogroupdir);
                    342:                        strcpy(ogroupdir, bfr);
                    343:                        ngrp = 1;
                    344:                        back();
                    345:                }
                    346:                bit = oobit;
                    347:                oobit = obit;
                    348:                obit = -1;
                    349:                getnextart(TRUE);
                    350:                return FALSE;
                    351: 
                    352:                /* skip forwards */
                    353:        case '+':
                    354: caseplus:
                    355:                if (*bptr == '\0')
                    356:                        strcat(bptr, "1");
                    357:                rfq = 0;
                    358:                if (cflag)
                    359:                        clear(bit);
                    360:                saveart;
                    361:                last = bit;
                    362:                for (i = 0; i < atoi(bptr); i++) {
                    363:                        nextbit();
                    364:                        if ((bit > pngsize) || (rflag && bit < 1))
                    365:                                break;
                    366:                }
                    367:                if (!cflag) {
                    368:                        putc('\n', ofp);
                    369:                        fclose(fp);
                    370:                        fp = NULL;
                    371:                }
                    372:                obit = -1;
                    373:                break;
                    374: 
                    375:        /* exit - time updated to that of most recently read article */
                    376:        case 'q':
                    377:                EOL();
                    378:                return TRUE;
                    379: 
                    380:        /* exit - no time update. */
                    381:        case 'x':
                    382:                EOL();
                    383:                xxit(0);
                    384: 
                    385:        /* cancel the article. */
                    386:        case 'c':
                    387:                cancel_command();
                    388:                break;
                    389: 
                    390:        /* escape to shell */
                    391:        case '!':
                    392:                fwait(fsubr(ushell, bptr, (char *)NULL));
                    393:                fprintf(ofp, "\n");
                    394:                hdr();
                    395:                break;
                    396: 
                    397:        /* mail reply */
                    398:        case 'r':
                    399:                reply_command();
                    400:                break;
                    401: 
                    402:        /* send to some system */
                    403:        case 'X':
                    404:                xmit_command();
                    405:                break;
                    406: 
                    407:        /* next newsgroup */
                    408:        case 'P':
                    409:                *bptr = '-';
                    410:        case 'N':
                    411:                if (fp != NULL) {
                    412:                        fclose(fp);
                    413:                        fp = NULL;
                    414:                }
                    415:                if (next_ng_command())
                    416:                        return TRUE;
                    417:                break;
                    418: 
                    419:        /* specific no. */
                    420:        case '0':
                    421:        case '1':
                    422:        case '2':
                    423:        case '3':
                    424:        case '4':
                    425:        case '5':
                    426:        case '6':
                    427:        case '7':
                    428:        case '8':
                    429:        case '9':
                    430:                sscanf(--bptr, "%d", &i);
                    431:                if (i == 0) {
                    432:                        fprintf(ofp, "Bad article no.\n");
                    433:                        break;
                    434:                }
                    435:                if (i > pngsize) {
                    436:                        fprintf(ofp, "Not that many articles.\n");
                    437:                        break;
                    438:                }
                    439:                readmode = SPEC;
                    440:                abs = TRUE;
                    441:                bit = i;
                    442:                obit = -1;
                    443:                if (!cflag) {
                    444:                        putc('\n', ofp);
                    445:                        fclose(fp);
                    446:                        fp = NULL;
                    447:                }
                    448:                rfq = 0;
                    449:                break;
                    450: 
                    451:        /* specific message ID. */
                    452:        case '<':
                    453:                ptr1 = findhist(--bptr);
                    454:                if (ptr1 == NULL) {
                    455:                        fprintf(ofp, "No such article: %s.\n", bptr);
                    456:                        break;
                    457:                }
                    458:                ptr2 = index(ptr1, '\t');
                    459:                ptr3 = index(++ptr2, '\t');
                    460:                ptr2 = index(++ptr3, ' ');
                    461:                if (ptr2)
                    462:                        *ptr2 = '\0';
                    463:                ptr2 = index(ptr3, '/');
                    464:                *ptr2++ = '\0';
                    465:                abs = TRUE;
                    466:                if (cflag)
                    467:                        clear(bit);
                    468:                else {
                    469:                        fclose(fp);
                    470:                        fp = NULL;
                    471:                        putc('\n', ofp);
                    472:                }
                    473:                hbufcp(&hbuf1, &h);
                    474:                saveart;
                    475:                strcpy(ogroupdir, ptr3);
                    476:                if (strcmp(groupdir, ogroupdir)) {
                    477:                        strcpy(bfr, groupdir);
                    478:                        selectng(ogroupdir);
                    479:                        strcpy(groupdir, ogroupdir);
                    480:                        strcpy(ogroupdir, bfr);
                    481:                        back();
                    482:                }
                    483:                sscanf(ptr2, "%d", &bit);
                    484:                oobit = obit;
                    485:                obit = -1;
                    486:                getnextart(TRUE);
                    487:                rfq = 0;
                    488:                break;
                    489: 
                    490:        /* follow-up article */
                    491:        case 'f':
                    492:                followup_command();
                    493:                break;
                    494: 
                    495:        /* erase - pretend we haven't seen this article. */
                    496:        case 'e':
                    497:                if (rfq || *bptr == '-') {
                    498:                        if (strcmp(groupdir, ogroupdir)) {
                    499:                                i = bit;
                    500:                                strcpy(bfr, groupdir);
                    501:                                selectng(ogroupdir);
                    502:                                set(oobit);
                    503:                                printf("Holding article %d newsgroup %s\n", oobit, ogroupdir),
                    504:                                strcpy(groupdir, ogroupdir);
                    505:                                selectng(bfr);
                    506:                                bit = i;
                    507:                        } else {
                    508:                                printf("Holding article %d\n", oobit),
                    509:                                set(oobit);
                    510:                        }
                    511:                } else {
                    512:                        printf("Holding article %d\n", bit),
                    513:                        set(bit);
                    514:                        goto caseplus;  /* skip this article for now */
                    515:                }
                    516:                break;
                    517: 
                    518:        case 'H':
                    519:        case 'h':
                    520:                if (!hflag)
                    521:                        dash(8, ofp);
                    522:                if (*bptr == '-') {
                    523:                        if (oobit > 0)
                    524:                                fprintf(ofp, "Article %d:\n", oobit);
                    525:                        hprint(&hbuf1, ofp, 1 + (i=='H'));
                    526:                } else {
                    527:                        fprintf(ofp, "Article %d of %ld: %s\n",
                    528:                                rfq ? oobit : bit, pngsize, h.ident);
                    529:                        hprint(&h, ofp, 1 + (i=='H'));
                    530:                }
                    531:                if (!hflag)
                    532:                        dash(8, ofp);
                    533:                break;
                    534: 
                    535:        case '#':
                    536:                fprintf(ofp, "Article %d of %ld: newsgroup %s\n",
                    537:                        rfq ? oobit : bit, pngsize, rfq ? ogroupdir : groupdir);
                    538:                break;
                    539: 
                    540:                /* error */
                    541:        case '?':
                    542:                help(ofp);
                    543:                break;
                    544:        default:
                    545:                fprintf(ofp, "? for commands.\n");
                    546:                break;
                    547:        }
                    548: 
                    549:        return FALSE;
                    550: }
                    551: 
                    552: cancel_command()
                    553: {
                    554:        tfilename = filename;
                    555:        hptr = &h;
                    556:        if (*bptr == '-') {
                    557:                if (*ofilename1) {
                    558:                        tfilename = ofilename1;
                    559:                        hptr = &hbuf1;
                    560:                }
                    561:                bptr++;
                    562:        }
                    563:        EOL();
                    564:        readmode = SPEC;
                    565:        strcpy(rcbuf, hptr->path);
                    566:        ptr1 = index(rcbuf, ' ');
                    567:        if (ptr1)
                    568:                *ptr1 = 0;
                    569:        if (uid == ROOTID)
                    570:                i = 0;          /* root gets to cancel */
                    571:        else
                    572:                i = strcmp(username, rcbuf);
                    573:        if (i != 0) {
                    574:                fprintf(ofp, "Can't cancel what you didn't write.\n");
                    575:                return;
                    576:        }
                    577:        if (!cancel(ofp, hptr, i) && hptr == &h) {
                    578:                clear(bit);
                    579:                saveart;
                    580:                nextbit();
                    581:                obit = -1;
                    582:                fp = NULL;
                    583:                if (!cflag)
                    584:                        putc('\n', ofp);
                    585:        }
                    586:        if (fp != NULL)
                    587:                fclose(fp);
                    588:        fp = NULL;
                    589: }
                    590: 
                    591: reply_command()
                    592: {
                    593:        register char   *pathptr, *ptr;
                    594:        int edit = 1;
                    595:        char *ed;
                    596:        FILE *tfp;
                    597:        char    curberk[BUFLEN];
                    598:        char *replyname();
                    599:        char subj[100];
                    600:        char folbuf[100];
                    601:        extern char MAILPARSER[];
                    602: 
                    603:        hptr = &h;
                    604:        while (*bptr && index("d-", *bptr)) {
                    605:                switch (*bptr) {
                    606:                /* Followup the previous article. */
                    607:                case '-':
                    608:                        hptr = &hbuf1;
                    609:                        break;
                    610: 
                    611:                /* Don't edit the headers */
                    612:                case 'd':
                    613:                        edit = 0;
                    614:                        break;
                    615:                }
                    616:                bptr++;
                    617:        }
                    618:        EOL();
                    619:        if (edit && access(MAILPARSER, 1)) {
                    620: #ifdef IHCC
                    621:                fprintf(stderr, "Can't edit headers, 'recmail' missing.\n");
                    622: #else
                    623:                fprintf(stderr, "Can't edit headers without %s\n", MAILPARSER);
                    624: #endif
                    625:                edit = 0;
                    626:        }
                    627: 
                    628:        *rcbuf = '\0';
                    629:        *curberk = '\0';
                    630:        pathptr = replyname(hptr);;
                    631:        ptr = pathptr - 1;
                    632:        i = 0;
                    633:        for (ptr1 = address, ptr2 = pathptr; *ptr2; ptr1++, ptr2++) {
                    634:                if (index("\"\\$", *ptr2))
                    635:                        *ptr1++ = '\\';
                    636:                *ptr1 = *ptr2;
                    637:        }
                    638:        *ptr1 = '\0';
                    639: 
                    640:        folbuf[0] = 0;                          /* References */
                    641:        if (hptr->followid[0]) {
                    642:                strcpy(folbuf, hptr->followid);
                    643:                strcat(folbuf, ", ");
                    644:        }
                    645:        strcat(folbuf, hptr->ident);
                    646: 
                    647:        strcpy(subj, hptr->title);      /* Subject */
                    648:        while (isspace(*bptr))
                    649:                bptr++;
                    650:        if (*bptr != '\0')
                    651:                strcpy(subj, bptr);
                    652:        if (!prefix(subj, "Re:") && !prefix(subj, "re:")) {
                    653:                strcpy(bfr, subj);
                    654:                sprintf(subj, "Re: %s", bfr);
                    655:        }
                    656:        if (!edit) {
                    657:                fprintf(ofp, "To: %s\n", pathptr);
                    658:                ed = index(MAILER, '%');
                    659:                if (ed && ed[1] == 's')
                    660:                        fprintf(ofp, "Subject: %s\n", subj);
                    661:                fflush(ofp);
                    662:        }
                    663: 
                    664:        /* Put the user in the editor to create the body of the followup. */
                    665:        if (edit) {
                    666:                strcpy(tf, tft);
                    667:                mktemp(tf);
                    668: 
                    669:                ed = getenv("EDITOR");
                    670:                if (ed == NULL)
                    671:                        ed = DFTEDITOR;
                    672: 
                    673:                tfp = fopen(tf, "w");
                    674:                fprintf(tfp, "To: %s\n", pathptr);
                    675:                fprintf(tfp, "Subject: %s\n", subj);
                    676:                fprintf(tfp, "References: %s\n\n", folbuf);
                    677:                fclose(tfp);
                    678: 
                    679:                sprintf(edcmdbuf, "%s %s", ed, tf);
                    680:                system(edcmdbuf);
                    681:                strcpy(rcbuf, MAILPARSER);
                    682:                strcat(rcbuf, " -t");
                    683:                strcat(rcbuf, " < ");
                    684:                strcat(rcbuf, tf);
                    685:                if (access(tf, 4)) {
                    686:                        fprintf(stderr, "Reply not sent: no input file.\n");
                    687:                        return;
                    688:                }
                    689:                printf("Sending reply.\n");
                    690:                fflush(stdout);
                    691:                if (fork() == 0) {
                    692:                        system(rcbuf);
                    693:                        unlink(tf);
                    694:                        _exit(0);
                    695:                }
                    696:        } else {
                    697:                sprintf(rcbuf, MAILER, hptr->title);
                    698:                sprintf(bfr, "%s %s", rcbuf, address);
                    699:                system(bfr);
                    700:        }
                    701:        hdr();
                    702: }
                    703: 
                    704: xmit_command()
                    705: {
                    706:        tfilename = filename;
                    707:        if (*bptr == '-') {
                    708:                if (*ofilename1)
                    709:                        tfilename = ofilename1;
                    710:                bptr++;
                    711:        }
                    712:        if (*bptr != '\0' && *bptr != ' ') {
                    713:                fprintf(ofp, "Bad system name.\n");
                    714:                return;
                    715:        }
                    716:        while (*bptr == ' ')
                    717:                bptr++;
                    718:        if (*bptr == '\0') {
                    719:                fprintf(ofp, "Missing system name.\n");
                    720:                return;
                    721:        }
                    722:        if (s_find(&srec, bptr) == NULL) {
                    723:                fprintf(ofp, "%s not in SYSFILE\n", bptr);
                    724:                return;
                    725:        }
                    726:        transmit(&srec, tfilename);
                    727: }
                    728: 
                    729: next_ng_command()
                    730: {
                    731:        if (!*bptr || *bptr == '-') {
                    732:                obit = -1;
                    733:                if (cflag)
                    734:                        clear(bit);
                    735:                else
                    736:                        putc('\n', ofp);
                    737:                if (*bptr)
                    738:                        actdirect = BACKWARD;
                    739:                rfq = 0;
                    740:                saveart;
                    741:                if (nextng()) {
                    742:                        if (actdirect == BACKWARD)
                    743:                                fprintf(ofp, "Can't back up.\n");
                    744:                        else
                    745:                                return TRUE;
                    746:                }
                    747:                return FALSE;
                    748:        }
                    749:        while (isspace(*bptr))
                    750:                bptr++;
                    751:        if (!validng(bptr)) {
                    752:                fprintf(ofp, "No such group.\n");
                    753:                return FALSE;
                    754:        }
                    755:        obit = -1;
                    756:        if (cflag)
                    757:                clear(bit);
                    758:        else
                    759:                putc('\n', ofp);
                    760:        readmode = SPEC;
                    761:        rfq = 0;
                    762:        saveart;
                    763:        back();
                    764:        selectng(bptr);
                    765:        return FALSE;
                    766: }
                    767: 
                    768: followup_command()
                    769: {
                    770:        int edit = 1;
                    771:        char subj[100];
                    772:        char folbuf[100];
                    773:        char *ng;
                    774:        FILE *tfp;
                    775: 
                    776:        hptr = &h;
                    777: 
                    778:        while (*bptr && index("d-", *bptr)) {
                    779:                switch (*bptr) {
                    780:                /* Followup the previous article. */
                    781:                case '-':
                    782:                        hptr = &hbuf1;
                    783:                        break;
                    784: 
                    785:                /* Don't edit the headers */
                    786:                case 'd':
                    787:                        edit = 0;
                    788:                        break;
                    789:                }
                    790:                bptr++;
                    791:        }
                    792: 
                    793:        /* Figure out the subject, newsgroups, and references for the followup. */
                    794:        ng = hptr->nbuf;                        /* Newsgroups */
                    795:        if (hptr->followto[0])
                    796:                ng = hptr->followto;
                    797:        launder(ng);
                    798: 
                    799:        folbuf[0] = 0;                          /* References */
                    800:        if (hptr->followid[0]) {
                    801:                strcpy(folbuf, hptr->followid);
                    802:                strcat(folbuf, ", ");
                    803:        }
                    804:        strcat(folbuf, hptr->ident);
                    805: 
                    806:        strcpy(subj, hptr->title);      /* Subject */
                    807:        while (isspace(*bptr))
                    808:                bptr++;
                    809:        if (*bptr != '\0')
                    810:                strcpy(subj, bptr);
                    811:        if (!prefix(subj, "Re:") && !prefix(subj, "re:")) {
                    812:                strcpy(bfr, subj);
                    813:                sprintf(subj, "Re: %s", bfr);
                    814:        }
                    815: 
                    816:        /* Determine the command line for the shell. */
                    817:        if (edit) {
                    818:                sprintf(bfr, "%s -h -D", FOLLOWUP);
                    819:        } else {
                    820:                sprintf(bfr, "%s -D -F '%s' -n %s -t \'", FOLLOWUP, folbuf, ng);
                    821:                strqcat(bfr, subj);
                    822:                strcat(bfr, "\'");
                    823:        }
                    824: 
                    825:        /* backslash special characters */
                    826:        for (ptr1 = rcbuf, ptr2 = bfr; *ptr2; ptr1++, ptr2++) {
                    827:                if (index("\\", *ptr2))
                    828:                        *ptr1++ = '\\';
                    829:                *ptr1 = *ptr2;
                    830:        }
                    831:        *ptr1 = '\0';
                    832: 
                    833:        /* Let the user know what's going on. */
                    834:        fprintf(ofp, "Posting followup article to network.  Please use\n");
                    835:        fprintf(ofp, "reply ('r') instead unless your article is of general\n");
                    836:        fprintf(ofp, "interest.  (To abort press BREAK.)\n");
                    837:        fprintf(ofp, "Subject: %s\n", subj);
                    838:        fprintf(ofp, "Newsgroups: %s\n", ng);
                    839:        fprintf(ofp, "Hit <return> to continue, BREAK to abort: ");
                    840:        fflush(ofp);
                    841: 
                    842:        /* Give the user a chance to hit BREAK and back out. */
                    843:        hascaught = 0;
                    844:        oldsig = (char *) signal(SIGINT, catchintr);
                    845:        gets(edcmdbuf);
                    846:        signal(SIGINT, oldsig);
                    847:        if (hascaught)
                    848:                return;
                    849: 
                    850:        /* Play obnoxious warnings, if necessary. */
                    851:        if (recording(hptr->nbuf, 0))
                    852:                return;
                    853: 
                    854:        /* Put the user in the editor to create the body of the followup. */
                    855:        ed = getenv("EDITOR");
                    856:        if (ed == NULL || *ed == '\0')
                    857:                ed = DFTEDITOR;
                    858:        if (ed) {
                    859:                strcpy(tf, tft);
                    860:                mktemp(tf);
                    861: 
                    862:                tfp = fopen(tf, "w");
                    863:                if (edit) {
                    864:                        fprintf(tfp, "Newsgroups: %s\n", ng);
                    865:                        fprintf(tfp, "Subject: %s\n", subj);
                    866:                        fprintf(tfp, "References: %s\n", folbuf);
                    867:                        if (hptr->keywords[0])
                    868:                                fprintf(tfp, "Keywords: %s\n", hptr->keywords);
                    869:                        fprintf(tfp, "\n");
                    870:                }
                    871:                fclose(tfp);
                    872: 
                    873:                sprintf(edcmdbuf, "%s %s", ed, tf);
                    874:                system(edcmdbuf);
                    875:                strcat(rcbuf, "< ");
                    876:                strcat(rcbuf, tf);
                    877:                if (access(tf, 4)) {
                    878:                        fprintf(stderr, "Article not posted: no input file.\n");
                    879:                        return;
                    880:                }
                    881:                printf("Posting article.\n");
                    882:                fflush(stdout);
                    883:                if (fork() == 0) {
                    884:                        system(rcbuf);
                    885:                        unlink(tf);
                    886:                        _exit(0);
                    887:                }
                    888:        } else {
                    889:                printf("%s\n", rcbuf);
                    890:                system(rcbuf);
                    891:        }
                    892:        hdr();
                    893: }
                    894: 
                    895: caesar_command()
                    896: {
                    897:        char    temp[100];
                    898:        char    *pp = bptr;
                    899:        FILE    *pfp, *popen();
                    900: 
                    901:        fprintf(stderr, "Caesar decoding:\n");
                    902:        strcpy(temp, CAESAR);
                    903:        if (*bptr) {
                    904:                strcat(temp, " ");
                    905:                strcat(temp, bptr);
                    906:        }
                    907:        if (NLINES(h, fp) > LNCNT && *PAGER) {
                    908:                strcat(temp, " | ");
                    909:                strcat(temp, PAGER);
                    910:        }
                    911:        pfp = popen(temp, "w");
                    912:        tprint(fp, pfp, FALSE);
                    913:        itsbeenseen(h.ident);
                    914:        fclose(fp);
                    915:        fp = NULL;
                    916:        pclose(pfp);
                    917: }
                    918: 
                    919: /*
                    920:  * Show the user the tail, if any, of the message on file
                    921:  * descriptor fd, and close fd.  The digester is considered,
                    922:  * and the pager is used if appropriate.
                    923:  */
                    924: showtail(fd)
                    925: FILE *fd;
                    926: {
                    927:        if (fd == NULL)
                    928:                return;
                    929: 
                    930:        if (dgest) {
                    931:                digest(fd, ofp, &h);
                    932:        } else if (!lflag && !pflag && !eflag) {
                    933: #ifdef PAGE
                    934:                /* Filter the tail of long messages through PAGER. */
                    935:                if (NLINES(h, fd) > LNCNT && *PAGER) {
                    936:                        if (!index(PAGER, FMETA)) {
                    937:                                FILE *pfp, *popen();
                    938:                                int     cnt;
                    939: 
                    940:                                pfp = popen(PAGER, "w");
                    941:                                if (pfp == NULL)
                    942:                                        pfp = ofp;
                    943:                                /*
                    944:                                 * What follows is an attempt to prevent the
                    945:                                 * next message from scrolling part of this
                    946:                                 * message off the top of the screen before
                    947:                                 * the poor luser can read it.
                    948:                                 */
                    949:                                tprint(fd, pfp, FALSE);
                    950:                                itsbeenseen(h.ident);
                    951:                                pclose(pfp);
                    952:                        } 
                    953:                        else
                    954:                                pout(ofp);
                    955: # ifndef NOCOLON
                    956:                        holdup = TRUE;
                    957: # endif NOCOLON
                    958:                }
                    959:                else
                    960: #endif
                    961:                        tprint(fd, ofp, FALSE), itsbeenseen(h.ident);
                    962:        }
                    963:        fclose(fd);
                    964: }
                    965: 
                    966: /*
                    967:  * Find the next article we want to consider, if we're done with
                    968:  * the last one, and show the header.
                    969:  */
                    970: getnextart(minus)
                    971: int minus;
                    972: {
                    973:        if (minus)
                    974:                goto nextart2;  /* Kludge for "-" command. */
                    975: 
                    976:        if (bit == obit)        /* Return if still on same article as last time */
                    977:                return 0;
                    978: 
                    979:        sigtrap = FALSE;
                    980: 
                    981: nextart:
                    982:        dgest = 0;
                    983:        if (bit < 1 && !rflag)
                    984:                bit = 1;
                    985: 
                    986:        /* If done with this newsgroup, find the next one. */
                    987:        while (((long) bit > ngsize) || (rflag && bit < 1)) {
                    988:                int i;
                    989:                if (i=nextng()) {
                    990:                        if (actdirect == BACKWARD) {
                    991:                                fprintf(ofp, "Can't back up.\n");
                    992:                                actdirect = FORWARD;
                    993:                                continue;
                    994:                        } 
                    995:                        else if (rfq++ || pflag || cflag)
                    996:                                return 1;
                    997:                }
                    998:                if (rflag)
                    999:                        bit = ngsize + 1L;
                   1000:                else
                   1001:                        bit = -1;
                   1002:                if (uflag) {
                   1003:                        long now;
                   1004:                        time(&now);
                   1005:                        if (now - timelastsaved > 5*60 /* 5 minutes */) {
                   1006:                                printf("[Saving .newsrc]\n");
                   1007:                                fflush(stdout);
                   1008:                                writeoutrc();
                   1009:                                timelastsaved = now;
                   1010:                        }
                   1011:                }
                   1012:        }
                   1013: 
                   1014: nextart2:
                   1015: #ifdef DEBUG
                   1016:        fprintf(stderr, "article: %s/%d\n", groupdir, bit);
                   1017: #endif
                   1018:        if (rcreadok)
                   1019:                rcreadok = 2;   /* have seen >= 1 article */
                   1020:        sprintf(filename, "%s/%d", dirname(groupdir), bit);
                   1021:        if (rfq && goodone[0])
                   1022:                strcpy(filename, goodone);
                   1023:        if (sigtrap) {
                   1024:                if (sigtrap == SIGHUP)
                   1025:                        return 1;
                   1026:                if (!rcreadok)
                   1027:                        xxit(0);
                   1028:                fprintf(ofp, "Abort (n)?  ");
                   1029:                fflush(ofp);
                   1030:                gets(bfr);
                   1031:                if (*bfr == 'y' || *bfr == 'Y')
                   1032:                        xxit(0);
                   1033:                sigtrap = FALSE;
                   1034:        }
                   1035: #ifdef DEBUG
                   1036:        fprintf(stderr, "filename = '%s'\n", filename);
                   1037: #endif
                   1038:        /* Decide if we want to show this article. */
                   1039:        if (ignorenews
                   1040:        || access(filename, 4)
                   1041:        || ((fp = fopen(filename, "r")) == NULL)
                   1042:        || (hread(&h, fp, TRUE) == NULL)
                   1043:        || (!rfq && !select(&h, abs))) {
                   1044: #ifdef DEBUG
                   1045:                fprintf(stderr, "Bad article '%s'\n", filename);
                   1046: #endif
                   1047:                if (fp != NULL) {
                   1048:                        fclose(fp);
                   1049:                        fp = NULL;
                   1050:                }
                   1051:                clear(bit);
                   1052:                obit = -1;
                   1053:                nextbit();
                   1054:                abs = FALSE;
                   1055:                goto nextart;
                   1056:        }
                   1057:        abs = FALSE;
                   1058:        actdirect = FORWARD;
                   1059:        news = TRUE;
                   1060:        hdr();
                   1061:        if ((cflag && !lflag && !eflag) || pflag)
                   1062:                tprint(fp, ofp, FALSE);
                   1063:        if (cflag && lflag && eflag || pflag) {
                   1064:                itsbeenseen(h.ident);
                   1065:                sigtrap = FALSE;
                   1066:                fclose(fp);
                   1067:                fp = NULL;
                   1068:        }
                   1069:        obit = bit;
                   1070:        return 0;
                   1071: }
                   1072: 
                   1073: /*
                   1074:  * Print out whatever the appropriate header is
                   1075:  */
                   1076: hdr()
                   1077: {
                   1078:        if (rfq)
                   1079:                return;
                   1080: 
                   1081: #ifndef NOCOLON
                   1082:        /* Wait for user to read previous article. */
                   1083:        if (holdup) {
                   1084:                fprintf(ofp, ":");
                   1085:                fflush(ofp);
                   1086:                holdup = FALSE;
                   1087:                bfr[0] = '\0';
                   1088:                gets(bfr);
                   1089:                if (bfr[0])
                   1090:                        explaincolon();
                   1091:        }
                   1092: #endif NOCOLON
                   1093: 
                   1094:        if (lflag || eflag) {
                   1095:                hprint(&h, ofp, 0);
                   1096:                return;
                   1097:        }
                   1098: 
                   1099:        /* Print out a header */
                   1100:        if (ngrp) {
                   1101:                pngsize = ngsize;
                   1102:                ngrp--;
                   1103:                nghprint(groupdir);
                   1104:        }
                   1105:        if (!hflag)
                   1106:                fprintf(ofp, "Article %d of %ld, %s.\n",
                   1107:                        bit, pngsize, briefdate(h.subdate));
                   1108:        hprint(&h, ofp, pflag ? 1 : 0);
                   1109: }
                   1110: 
                   1111: explaincolon()
                   1112: {
                   1113:        static int calledbefore = 0;
                   1114: 
                   1115:        fprintf(ofp, "\n'%s' ignored.\n", bfr);
                   1116:        if (calledbefore++ == 0) {
                   1117:                fprintf(ofp, "The colon is to give you a chance to finish reading the\n");
                   1118:                fprintf(ofp, "previous article before the next header scrolls it off\n");
                   1119:                fprintf(ofp, "the top of the screen.  You should hit `return' or `newline'\n");
                   1120:                fprintf(ofp, "when you are ready to go on to the next article.\n\n");
                   1121:        }
                   1122:        fflush(ofp);
                   1123: }
                   1124: 
                   1125: nghprint(title)
                   1126: char *title;
                   1127: {
                   1128:        char *tstr = "Newsgroup ";
                   1129:        int l = strlen(title) + strlen(tstr);
                   1130: 
                   1131:        fprintf(ofp, "\n");
                   1132:        if (!hflag) {
                   1133:                dash(l, ofp);
                   1134:                fprintf(ofp, "%s%s\n", tstr, title);
                   1135:                dash(l, ofp);
                   1136:        } else {
                   1137:                fprintf(ofp, "%s%s, ", tstr, title);
                   1138:                if (bit == pngsize)
                   1139:                        fprintf(ofp, "%ld\n", pngsize);
                   1140:                else
                   1141:                        fprintf(ofp, "%d-%ld\n", bit, pngsize);
                   1142:        }
                   1143:        fprintf(ofp, "\n");
                   1144: }
                   1145: 
                   1146: /*
                   1147:  * Routine to catch a continue signal.
                   1148:  */
                   1149: catchcont()
                   1150: {
                   1151: #ifdef SIGCONT
                   1152:        signal(SIGCONT, catchcont);
                   1153:        sigtrap = SIGCONT;
                   1154: #endif
                   1155:        hdr();
                   1156: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.