Annotation of researchv10no/cmd/netnews/misc/mhhooks, revision 1.1.1.1

1.1       root        1: From cbosg!harpo!npois!ucbvax!ARPAVAX:CAD:teklabs!tekmdp!azure!stevenm Thu Apr 15 16:36:59 1982
                      2: Subject: Some MH Mail hooks for news
                      3: Newsgroups: net.sources
                      4: 
                      5: Here are some modifications to readnews (module readr.c) which
                      6: allow use of the MHMAIL 'comp' program for replying to articles,
                      7: and the similar 'submit' program (just like comp) for submitting
                      8: new or followup articles. The 'submit' program itself is included.
                      9: The modifications enclosed are to 'readr.c', 'header.c', 'defs.h',
                     10: and 'Makefile.v7'. The source and manual page for 'submit' are
                     11: also enclosed.
                     12: 
                     13: Note that you will have to have the MH system already for 'submit'
                     14: to compile, because it depends heavily on routines in the MH
                     15: libraries. Also note that we run the Feb 1980 release of MH Mail,
                     16: and if any of the subroutine calls made by 'submit' have changed,
                     17: it may not work.
                     18: 
                     19: I would like to hear from anyone who actually uses this code,
                     20: or is working on integrating MH and News, so that we can share
                     21: our work.
                     22: 
                     23: S. McGeady
                     24: 
                     25: teklabs!stevenm
                     26: 
                     27: 
                     28: 
                     29: #############
                     30: # readr.c   #
                     31: #############
                     32: 
                     33: 32c32
                     34: <      char *ptr1, *ptr2, *ptr3;       /* for reply manipulation       */
                     35: ---
                     36: >      char *ptr1, *ptr2, *ptr3, *ptr4;/* for reply manipulation       */
                     37: 
                     38: [shortly after case 'r':]
                     39: 
                     40: 393a394,396
                     41: >                      ptr2 = h.ident;
                     42: >                      ptr3 = h.title;
                     43: >                      ptr4 = h.subdate;
                     44: 396c399
                     45: <                              if (*hbuf1.path)
                     46: ---
                     47: >                              if (*hbuf1.path) {
                     48: 397a401,404
                     49: >                                      ptr2 = hbuf1.ident;
                     50: >                                      ptr3 = hbuf1.title;
                     51: >                                      ptr4 = hbuf1.subdate;
                     52: >                              }
                     53: 428a436,467
                     54: > #ifdef MHMAIL
                     55: > 
                     56: >                      {
                     57: >                      char *tmpp;
                     58: >                      FILE *tfd;
                     59: >                      extern char *mktemp();
                     60: > 
                     61: >                      tmpp = mktemp("/tmp/newsXXXXXX");
                     62: >                      if ((tfd = fopen(tmpp, "w")) == NULL) {
                     63: >                              fprintf(ofp, "Can't create tmpfile\n");
                     64: >                              break;
                     65: >                      }
                     66: > 
                     67: >                      fprintf(tfd, "To: %s\n", rcbuf);
                     68: >                      fprintf(tfd, "Subject: ");
                     69: > 
                     70: >                      if (*bptr == '\0') {
                     71: >                              if (strncmp(ptr3, "Re: ", 4)) {
                     72: >                                      fprintf(tfd, "Re: ");
                     73: >                              }
                     74: >                              fprintf(tfd, "%s\n", ptr3);
                     75: >                      } else {
                     76: >                              fprintf(tfd, "%s\n", bptr);
                     77: >                      }
                     78: >                      fprintf(tfd, "In-reply-to: Your news article %s of %s\n", ptr2, ptr4);
                     79: >                      fprintf(tfd, "-----------------\n");
                     80: >                      fclose(tfd);
                     81: >                      sprintf(bfr, "%s %s %s", COMP, DFLAG, tmpp);
                     82: >                      system(bfr);
                     83: >                      unlink(tmpp);
                     84: >                      }
                     85: > #else
                     86: 438a478
                     87: > #endif
                     88: 440d479
                     89: < 
                     90: 
                     91: [shortly after "case 'f':"]
                     92: 
                     93: 547a587,592
                     94: > #ifdef MHMAIL
                     95: >                      {
                     96: >                      char *tmpp;
                     97: >                      FILE *tfd;
                     98: >                      extern char *mktemp();
                     99: > 
                    100: 550a596
                    101: > 
                    102: 558a605,645
                    103: >                      while (isspace(*bptr))
                    104: >                              bptr++;
                    105: > 
                    106: >                      launder(ptr2);
                    107: > 
                    108: >                      tmpp = mktemp("/tmp/newsXXXXXX");
                    109: >                      if ((tfd = fopen(tmpp, "w")) == NULL) {
                    110: >                              fprintf(ofp, "Can't create tmpfile\n");
                    111: >                              break;
                    112: >                      }
                    113: >                      fprintf(tfd, "Newsgroups: %s\n", ptr2);
                    114: >                      sprintf(bfr, "%s %s %s", SUBMIT, DFLAG, tmpp);
                    115: >                      fprintf(tfd, "Subject: ");
                    116: > 
                    117: >                      if (*bptr == '\0') {
                    118: >                              if (strncmp(tfilename, "Re: ", 4)) {
                    119: >                                      fprintf(tfd, "Re: ");
                    120: >                              }
                    121: >                              fprintf(tfd, "%s\n", tfilename);
                    122: >                      } else {
                    123: >                              fprintf(tfd, "%s\n", bptr);
                    124: >                      }
                    125: >                      fprintf(tfd, "Followup-to: %s\n", ptr3);
                    126: >                      fprintf(tfd, "-----------------\n");
                    127: >                      fclose(tfd);
                    128: > 
                    129: >                      system(bfr);
                    130: >                      unlink(tmpp);
                    131: >                      }
                    132: > #else
                    133: >                      tfilename = h.title;
                    134: >                      ptr2 = h.nbuf;
                    135: >                      ptr3 = h.ident;
                    136: >                      if (*bptr == '-') {
                    137: >                              if (*hbuf1.title && *hbuf1.nbuf) {
                    138: >                                      tfilename = hbuf1.title;
                    139: >                                      ptr2 = hbuf1.nbuf;
                    140: >                                      ptr3 = hbuf1.ident;
                    141: >                              }
                    142: >                              bptr++;
                    143: >                      }
                    144: 617a705
                    145: > #endif
                    146: 619d706
                    147: < 
                    148: 
                    149: 
                    150: #############
                    151: # header.c  #
                    152: #############
                    153: 
                    154: 64c64
                    155: < #define SUBMIT               4
                    156: ---
                    157: > #define SUBMT                4
                    158: 104c104
                    159: <                      case SUBMIT:
                    160: ---
                    161: >                      case SUBMT:
                    162: 181c181
                    163: <              return SUBMIT;
                    164: ---
                    165: >              return SUBMT;
                    166: 
                    167: 
                    168: #############
                    169: # defs.h    #
                    170: #############
                    171: 
                    172: [Add these lines]
                    173: 
                    174: > #define      MHMAIL  1
                    175: > 
                    176: > #ifdef MHMAIL
                    177: > #define      SUBMIT  "/usr/bin/submit"
                    178: > #define      COMP    "/usr/bin/comp"
                    179: > #define      DFLAG   "-form"
                    180: > #endif
                    181: > 
                    182: 
                    183: #############
                    184: # submit.c  #
                    185: #############
                    186: 
                    187: /*
                    188:  * this program uses the MH Mail system subroutine librarys
                    189:  * found in subs.a and strings.a in /usr1/src/cmd/mh
                    190:  * 'mh.h' is also there
                    191:  */
                    192: 
                    193: #include "mh.h"
                    194: #include <stdio.h>
                    195: #include <strings.h>
                    196: #include <signal.h>
                    197: #include <sys/types.h>
                    198: #include <sys/stat.h>
                    199: 
                    200: /*
                    201:  * submit - submit a note to the Duke NewsNet news service
                    202:  *
                    203:  *******************************************************************
                    204:  *
                    205:  * 27-aug-80 sdg       Written
                    206:  * 02-nov-80 sdg       fixed bug that inserted \n every 512 characters
                    207:  *
                    208:  *     6/24/81 mcg     hacked from the 'post' program
                    209:  *
                    210:  *     7/27/81 mcg     modified to take 'post' entrypoint, and to
                    211:  *                     back the input file up in ',<infile>'
                    212:  *                     changed all error messages to print argv[0]
                    213:  *                     instead of 'submit'
                    214:  *
                    215:  *     12/29/81 mcg    modfied for B news
                    216:  *
                    217:  *     4/15/82  mcg    modified for 2.3 B News
                    218:  */
                    219: 
                    220: #define NONE 0
                    221: #define        DEFAULTGROUP    "general"
                    222: #define        NEWSCOMPS       "newscomps"
                    223: #define        STDNEWSCOMPS    LIBDIR/newscomps"
                    224: #define        NEWSDIR         SPOOLDIR"
                    225: #define        NEWSDRAFT       "ndraft"
                    226: 
                    227: #define MAXSUBJ        128
                    228: 
                    229: char   *newsproc       = "inews";
                    230: char   *myname;
                    231: 
                    232: char *anyul[] = {
                    233:        "no",   0,
                    234:        "yes",  0,
                    235:        "use",  0,
                    236:        "list", 0,
                    237:        0
                    238: };
                    239: 
                    240: char *any[] = {
                    241:        "no",   0,
                    242:        "yes",  0,
                    243:        0
                    244: };
                    245: 
                    246: char *alfeqs[] = {
                    247:        "list",              0,         /* 0 */
                    248:        "format",            0,         /* 1 */
                    249:        "edit [<editor>]",   0,         /* 2 */
                    250:        "quit [delete]",     0,         /* 3 */
                    251:        "submit",            0,         /* 4 */
                    252:        "post",              0,         /* same as submit */
                    253:        0
                    254: };
                    255: 
                    256: 
                    257: struct swit switches[] = {
                    258:        "editor editor",  0,      /* 0 */
                    259:        "form formfile",  0,      /* 1 */
                    260:        "use",            0,      /* 2 */
                    261:        "nouse",          0,      /* 3 */
                    262:        "dfile draftfile",0,      /* 4 */
                    263:        "debug",          0,      /* 5 */
                    264:        "help",           4,      /* 6 */
                    265:        0,                0
                    266: };
                    267: 
                    268: char *rindex();
                    269: 
                    270: int debug = 0;
                    271: 
                    272: main(argc, argv)
                    273: char *argv[];
                    274: {
                    275:        register char   *cp;
                    276:        register int    in;
                    277:        register int    out;
                    278: 
                    279:        int     use;
                    280:        int     cnt;
                    281:        int     status;
                    282:        int     intr;
                    283: 
                    284:        char    buf[BUFSIZ];
                    285:        char    *newsgroup;
                    286:        char    *ed;
                    287:        char    *file;
                    288:        char    *form;
                    289: 
                    290:        static char     path[128];
                    291: 
                    292:        char    **ap;
                    293:        char    *arguments[50];
                    294:        char    **argp;
                    295: 
                    296:        myname = argv[0];
                    297: 
                    298:        form = 0; use = 0; file = 0; ed = 0;
                    299: 
                    300:        cp = r1bindex(argv[0], '/');
                    301: 
                    302:        if((cp = m_find(cp)) != NULL) {
                    303:                ap = brkstring(cp = getcpy(cp), " ", '\n');
                    304:                ap = copyip(ap, arguments);
                    305:        } else
                    306:                ap = arguments;
                    307: 
                    308:        copyip(argv+1, ap);
                    309: 
                    310:        argp = arguments;
                    311: 
                    312:        while(cp = *argp++) {
                    313:                if(*cp == '-') {
                    314:                        switch(smatch(++cp, switches)) {
                    315: 
                    316:                                        case -2:
                    317:                                                ambigsw(cp, switches);  /* ambiguous */
                    318:                                                goto leave; /* unknown */
                    319: 
                    320:                                        case -1:
                    321:                                                fprintf(stderr, "%s: -%s unknown\n", myname, cp);
                    322:                                                goto leave;
                    323: 
                    324: 
                    325:                                        case 0:
                    326:                                                if(!(ed = *argp++)) {   /* -editor */
                    327:          missing:                              fprintf(stderr, "%s: Missing argument ", myname);
                    328:                                                        fprintf(stderr, "for %s switch\n", argp[-2]);
                    329:                                                        goto leave;
                    330:                                                }
                    331: 
                    332:                                                continue;
                    333: 
                    334:                                        case 1:
                    335:                                                if(!(form = *argp++))   /* -form */
                    336:                                                        goto missing;
                    337:                                                continue;
                    338: 
                    339:                                        case 2:
                    340:                                                use = 1;
                    341:                                                continue;     /* -use */
                    342: 
                    343:                                        case 3:
                    344:                                                use = 0;
                    345:                                                continue;     /* -nouse */
                    346: 
                    347:                                        case 4:
                    348:                                                if(!(file = *argp++))   /* -dfile */
                    349:                                                        goto missing;
                    350:                                                continue;
                    351: 
                    352:                                        case 5:
                    353:                                                debug++;
                    354:                                                continue;       /* -debug */
                    355: 
                    356:                                        case 6:
                    357:                                                help("submit/post [switches]", switches);
                    358:                                                goto leave;
                    359:                        }
                    360: 
                    361:                }
                    362: 
                    363:        }
                    364: 
                    365:        if(form) {
                    366:                if((in = open(m_maildir(form), 0)) < 0) {
                    367:                        fprintf(stderr, "%s: Can't open form file: %s\n", myname, form);
                    368:                        goto leave;
                    369:                }
                    370:        } else if((in = open(m_maildir(NEWSCOMPS), 0)) < 0 &&
                    371:                   (in = open(STDNEWSCOMPS, 0)) < 0) {
                    372:                        fprintf(stderr, "%s: Can't open default components file!!\n", myname);
                    373:                        goto leave;
                    374:        }
                    375: 
                    376:        if(!file)
                    377:                file = NEWSDRAFT;
                    378: 
                    379:        copy(m_maildir(file), path);
                    380: 
                    381:        if((out = open(path, 0)) >= 0) {
                    382: 
                    383:                cp = concat("\n\"", path, "\" exists; delete? ", 0);
                    384: 
                    385:                if(use || fdcompare(in, out))
                    386:                        goto editit;
                    387: 
                    388:                while((status = gans(cp, anyul)) == 3)
                    389:                                showfile(path);
                    390: 
                    391:                if(status == 2) {
                    392:                        use++;
                    393:                        goto editit;
                    394:                }
                    395: 
                    396:                if(status == 0)
                    397:                        goto leave;
                    398: 
                    399:                close(out);
                    400: 
                    401:        } else if(use) {
                    402:                fprintf(stderr, "%s: \"%s\" doesn't exist!\n", myname, path);
                    403:                goto leave;
                    404:        }
                    405: 
                    406:        if((out = creat(path, m_gmprot())) < 0) {
                    407:                fprintf(stderr, "%s: Can't create \"%s\"\n", myname, path);
                    408:                goto leave;
                    409:        }
                    410: 
                    411:        do {
                    412:                if(cnt = read(in, buf, sizeof buf))
                    413:                        write(out, buf, cnt);
                    414:        } while(cnt == sizeof buf);
                    415: 
                    416:        close(in);
                    417: 
                    418: 
                    419: editit:
                    420: 
                    421:        close(out);
                    422: 
                    423:        if(m_edit(&ed, path, use, NONE) < 0)
                    424:                goto leave;
                    425: 
                    426:     for(;;) {
                    427:                if(!(argp = getans("\nWhat now? ", alfeqs)))
                    428:                        goto leave;
                    429: 
                    430:                switch(smatch(*argp, alfeqs)) {
                    431: 
                    432:                        case 0:
                    433:                                showfile(path);                         /* list */
                    434:                                break;
                    435: 
                    436:                        case 1:
                    437:                                if (m_format(path, use) == -1)          /* format */
                    438:                                        goto leave;
                    439:                                break;
                    440: 
                    441:                        case 2:
                    442:                                if(*++argp)                             /* edit */
                    443:                                        ed = *argp;
                    444: 
                    445:                                if(m_edit(&ed, path, use, NONE) == -1)
                    446:                                        goto leave;
                    447: 
                    448:                                break;
                    449: 
                    450:                        case 3:
                    451:                                if(*++argp && *argp[0] == 'd')           /* quit */
                    452:                                        if(unlink(path) == -1)  {
                    453:                                                fprintf(stderr, "Can't unlink %s ", path);
                    454:                                                perror("");
                    455:                                        }
                    456:                                goto leave;
                    457: 
                    458: 
                    459:                        case 4: /* submit */
                    460:                        case 5: /* post   */
                    461: 
                    462:                                if (!postit(path))
                    463:                                        goto leave;
                    464: 
                    465:                                break;
                    466: 
                    467:                        default:
                    468:                                fprintf(stderr, "%s: illegal option\n", myname);       /*##*/
                    469:                                break;
                    470:                }
                    471:     }
                    472: 
                    473: leave:
                    474: 
                    475:        m_update();
                    476:        done(0);
                    477: }
                    478: 
                    479: long convtime(tp)
                    480: register char *tp;
                    481: {
                    482: 
                    483:        if (tp == NULL) return(0L);
                    484: 
                    485:        while (*tp == ' ' || *tp == '\t' || *tp == '\n') tp++;
                    486: 
                    487:        if (*tp == '\0') return(0L);
                    488: 
                    489:        return(-1L);            /* error in processing */
                    490: }
                    491: 
                    492: char *mktemp();
                    493: 
                    494: postit(pathname)
                    495: char *pathname;
                    496: {
                    497:        FILE    *pfile;
                    498:        FILE    *tfile;
                    499:        char    *tmpname;
                    500:        extern int errno;
                    501: 
                    502:        int     state;
                    503:        int     compnum;
                    504:        int     firstbody;
                    505:        int     retcode;
                    506: 
                    507:        char    name[NAMESZ];
                    508:        char    buf[BUFSIZ];
                    509:        char    tmp[BUFSIZ];
                    510:        char    yatmp[BUFSIZ];
                    511: 
                    512:        char    *newsgroup;
                    513:        char    *p;
                    514:        char    *expdate;
                    515:        char    *subjp;
                    516:        char    *follow;
                    517: 
                    518:        struct stat statb;
                    519: 
                    520:        int     pid;
                    521:        int     wpid;
                    522:        int     status;
                    523:        int     i;
                    524: 
                    525:        retcode = 0;
                    526:        pfile = 0;
                    527:        tfile = 0;
                    528:        tmpname = 0;
                    529: 
                    530: 
                    531:        if ((pfile = fopen(pathname, "r")) == NULL) {
                    532:                fprintf(stderr, "%s: Can't open %s\n", myname, pathname);
                    533:                retcode = 1;
                    534:                goto leave;
                    535:        }
                    536: 
                    537:        if (!debug) {
                    538:                tmpname = mktemp("/tmp/postXXXXXX");
                    539: 
                    540:                if ((tfile = fopen(tmpname, "w")) == NULL) {
                    541:                        fprintf(stderr, "%s: Can't create %s\n", myname, tmpname);
                    542:                        retcode = 1;
                    543:                        goto leave;
                    544:                }
                    545:                chmod(tmpname, 0644);
                    546:        } else  {
                    547:                tfile = stdout;
                    548:        }
                    549: 
                    550:        state = FLD, compnum = 0, firstbody = 0, expdate = 0, subjp = 0;
                    551:        follow = 0;
                    552: 
                    553:        for(;;) {
                    554: 
                    555:                state = m_getfld(state, name, buf, sizeof buf, pfile);
                    556: 
                    557:                switch(state) {
                    558:                        case FLD:
                    559:                        case FLDEOF:
                    560:                        case FLDPLUS:
                    561:                                if (uleq(name, "subject") || uleq(name, "title")) {
                    562:                                        subjp = add(buf, subjp);
                    563:                                } else {
                    564:                                        if (uleq(name, "to") ||
                    565:                                                uleq(name, "newsgroup") ||
                    566:                                                uleq(name, "newsgroups")) {
                    567:                                                        newsgroup = add(buf, newsgroup);
                    568:                                        } else {
                    569:                                                if (uleq(name, "followup-to")) {
                    570:                                                        follow = add(buf, follow);
                    571:                                                } else {
                    572:                                                        fprintf(stderr, "%s: unrecognized field %s\n",
                    573:                                                                myname, name);
                    574:                                                        retcode = 2;
                    575:                                                        goto leave;
                    576:                                                }
                    577:                                        }
                    578:                                }
                    579:                                break;
                    580: 
                    581:                        case BODY:
                    582:                        case BODYEOF:
                    583: 
                    584:                                if (!firstbody++) {
                    585:                                        if (subjp != 0 && strlen(subjp) > MAXSUBJ) {
                    586:                                                fprintf(stderr, "%s: subject field too long\n", myname);
                    587:                                                retcode = 4;
                    588:                                                goto leave;
                    589:                                        }
                    590:                                }
                    591: 
                    592:                                fputs(buf, tfile);
                    593:                                break;
                    594: 
                    595:                        case FILEEOF:
                    596:                                goto process;
                    597: 
                    598:                        case LENERR:
                    599:                        case FMTERR:
                    600:                                fprintf(stderr, "%s: ??Message Format Error ", myname);
                    601:                                fprintf(stderr, "in component #%d.\n", compnum);
                    602:                                retcode = 6;
                    603:                                goto leave;
                    604:                }
                    605:        }
                    606: 
                    607: process:
                    608: 
                    609:        fclose(tfile);
                    610:        fclose(pfile);
                    611:        m_update();
                    612:        fflush(stdout);
                    613: 
                    614:        if (follow) {
                    615:                for (p = follow; *p; p++) {
                    616:                        if (*p == '\n') *p = ' ';
                    617:                }
                    618:        }
                    619:        for (p=subjp; *p; p++) {
                    620:                if (*p == '\n') *p = ' ';
                    621:        }
                    622:  
                    623:        if (!newsgroup) {
                    624:                newsgroup = DEFAULTGROUP;
                    625:        }
                    626: 
                    627:        for(p=newsgroup; *p; p++) {
                    628:                if (*p == ' ' || *p == '\t' || *p == '\n') {
                    629:                        *p = '\0';
                    630:                }
                    631:        }
                    632:        while (*newsgroup++ == '\0');
                    633:        --newsgroup;
                    634:  
                    635: /************
                    636:  *
                    637:  * This code no longer needed - mortals can't create newsgroups
                    638:  *
                    639:  *     sprintf(tmp, "%s/%s", NEWSDIR, newsgroup);
                    640:  *
                    641:  *     if (stat(tmp, &statb) < 0) {
                    642:  *             sprintf(yatmp, "Create new newsgroup '%s'? ", newsgroup);
                    643:  *             if(gans(yatmp, any) == 0) {
                    644:  *                     goto leave;
                    645:  *             }
                    646:  *     }
                    647:  *     if (strlen(newsgroup) < 2) {
                    648:  *             fprintf(stderr, "%s: newsgroup name '%s' invalid\n",
                    649:  *                     myname, newsgroup);
                    650:  *             goto leave;
                    651:  *     }
                    652:  */
                    653:        
                    654:        if (debug) {
                    655:                sprintf(tmp,"inews -F \"%s\" -t \"%s\" -n %s < %s\n\0",follow,subjp, newsgroup, tmpname);
                    656:                printf("command line: ");/*DBG*/
                    657:                printf("%s", tmp);/*DBG*/
                    658:        }
                    659: 
                    660: 
                    661:        if ((pid = fork()) == 0) {
                    662: 
                    663:                for (i = 3; i < 15; i++) close(i);      /* close spurious fd's */
                    664: 
                    665:                close(0);       /* tmpfile comes in on stdin */
                    666: 
                    667:                if(open(tmpname, 0) < 0) {
                    668:                        fprintf(stderr, "%s: can't open tmp file\n", myname);
                    669:                        done(-1);
                    670:                }
                    671: 
                    672:                if (follow) {
                    673:                        execlp(newsproc, newsproc, "-F", follow, "-t", subjp, "-n", newsgroup, 0);
                    674:                } else {
                    675:                                execlp(newsproc, newsproc, "-t", subjp, "-n", newsgroup, 0);
                    676:                }
                    677:                fprintf(stderr, "%s: can't exec %s\n", myname, newsproc);
                    678:                perror(newsproc);
                    679:                done(-1);
                    680: 
                    681:        } else if (pid == -1) {
                    682:                fprintf(stderr, "%s: Can't fork.\n", myname);
                    683:                retcode = 7;
                    684:                goto leave;
                    685:        } else {
                    686:                int (*istat)(), (*qstat)();
                    687: 
                    688:                istat = signal(SIGINT, SIG_IGN);
                    689:                qstat = signal(SIGQUIT, SIG_IGN);
                    690:                while ((wpid = wait(&status)) != -1 && wpid != pid) ;
                    691:                signal(SIGINT, istat);
                    692:                signal(SIGQUIT, qstat);
                    693:        }
                    694: 
                    695:        if (status == 0) {
                    696:                fprintf(stderr, "[%s to %s]\n",
                    697:                                myname[0] == 's' ? "submitted" : "posted",
                    698:                                newsgroup);
                    699:                retcode = 0;
                    700:        } else {
                    701:                retcode = 8;
                    702:                goto leave;
                    703:        }
                    704: 
                    705: suceess:
                    706:        retcode = 0;
                    707:        backup(pathname);
                    708: leave:
                    709:        if (pfile) fclose(pfile);
                    710:        if (tfile) fclose(tfile);
                    711:        if (tmpname) unlink(tmpname);
                    712: 
                    713:        return(retcode);
                    714: }
                    715: 
                    716: 
                    717: 
                    718: backup(file)
                    719: char *file;
                    720: {
                    721:        char buf[128];
                    722:        register char *cp;
                    723: 
                    724:        buf[0] = 0;
                    725:        if(cp = rindex(file, '/'))
                    726:                sprintf(buf, "%.*s", (++cp)-file, file);
                    727:        else
                    728:                cp = file;
                    729:        strcat(buf, ",");
                    730:        strcat(buf, cp);
                    731:        unlink(buf);
                    732:        if(link(file, buf) < 0 || unlink(file) < 0) {
                    733:                fprintf(stderr, "Send: Backup rename failure ");
                    734:                perror(buf);
                    735:                done(1);
                    736:        }
                    737: }
                    738: 
                    739: 
                    740: #########################
                    741: # additions to makefile #
                    742: #########################
                    743: 
                    744: [You will have to substitute the locations of your MH libraries]
                    745: [Submit also uses 'mh.h' out of the current directory - deal with that]
                    746: 
                    747: submit: submit.o
                    748:        $(CC) $(CFLAGS) -DSPOOLDIR=\"$(SPOOLDIR) -DLIBDIR=\"$(LIBDIR)\
                    749:        submit submit.o /usr1/src/cmd/mh/subs.a /usr1/src/cmd/mh/strings.a -lc \
                    750:        -o submit
                    751: 

unix.superglobalmegacorp.com

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