Annotation of 43BSDReno/contrib/mh/uip/whatnowsbr.c, revision 1.1.1.1

1.1       root        1: /* whatnowsbr.c - the WhatNow shell */
                      2: 
                      3: #include "../h/mh.h"
                      4: #include <stdio.h>
                      5: #include <sys/types.h>
                      6: #include <sys/stat.h>
                      7: 
                      8: static int editfile(), copyf(), editfile(), copyf(), whomfile();
                      9: static void sendfile(), sendfile(), sendit();
                     10: 
                     11: /*  */
                     12: 
                     13: static struct swit whatnowswitches[] = {
                     14: #define        DFOLDSW 0
                     15:     "draftfolder +folder", 0,
                     16: #define        DMSGSW  1
                     17:     "draftmessage msg", 0,
                     18: #define        NDFLDSW 2
                     19:     "nodraftfolder", 0,
                     20: 
                     21: #define        EDITRSW 3
                     22:     "editor editor", 0,
                     23: #define        NEDITSW 4
                     24:     "noedit", 0,
                     25: 
                     26: #define        PRMPTSW 5
                     27:     "prompt string", 4,
                     28: 
                     29: #define        HELPSW  6
                     30:     "help", 4,
                     31: 
                     32:     NULL, NULL
                     33: };
                     34: 
                     35: /*  */
                     36: 
                     37: static struct swit aleqs[] = {
                     38: #define        DISPSW  0
                     39:     "display [<switches>]", 0,
                     40: #define        EDITSW  1
                     41:     "edit [<editor> <switches>]", 0,
                     42: #define        LISTSW  2
                     43:     "list [<switches>]", 0,
                     44: #define        PUSHSW  3
                     45:     "push [<switches>]", 0,
                     46: #define        QUITSW  4
                     47:     "quit [-delete]", 0,
                     48: #define        REFILEOPT 5
                     49:     "refile [<switches>] +folder", 0,
                     50: #define        SENDSW  6
                     51:     "send [<switches>]", 0,
                     52: #define        WHOMSW  7
                     53:     "whom [<switches>]", 0,
                     54: 
                     55:     NULL, NULL
                     56: };
                     57: 
                     58: /*  */
                     59: 
                     60: static char *myprompt = "\nWhat now? ";
                     61: 
                     62: /*  */
                     63: 
                     64: /* ARGSUSED */
                     65: 
                     66: WhatNow(argc, argv)
                     67:        int argc;
                     68:        char **argv;
                     69: {
                     70:     int     isdf = 0,
                     71:            nedit = 0,
                     72:            use = 0;
                     73:     char   *cp,
                     74:            *dfolder = NULL,
                     75:            *dmsg = NULL,
                     76:            *ed = NULL,
                     77:            *drft = NULL,
                     78:            *msgnam = NULL,
                     79:             buf[100],
                     80:            prompt[BUFSIZ],
                     81:           **ap,
                     82:           **argp,
                     83:            *arguments[MAXARGS];
                     84:     struct stat st;
                     85: 
                     86:     invo_name = r1bindex (argv[0], '/');
                     87:     if ((cp = m_find (invo_name)) != NULL) {
                     88:        ap = brkstring (cp = getcpy (cp), " ", "\n");
                     89:        ap = copyip (ap, arguments);
                     90:     }
                     91:     else
                     92:        ap = arguments;
                     93:     (void) copyip (argv + 1, ap);
                     94:     argp = arguments;
                     95: 
                     96: /*  */
                     97: 
                     98:     while (cp = *argp++) {
                     99:        if (*cp == '-')
                    100:            switch (smatch (++cp, whatnowswitches)) {
                    101:                case AMBIGSW:
                    102:                    ambigsw (cp, whatnowswitches);
                    103:                    done (1);
                    104:                case UNKWNSW:
                    105:                    adios (NULLCP, "-%s unknown", cp);
                    106:                case HELPSW:
                    107:                    (void) sprintf (buf, "%s [switches] [file]", invo_name);
                    108:                    help (buf, whatnowswitches);
                    109:                    done (1);
                    110: 
                    111:                case DFOLDSW:
                    112:                    if (dfolder)
                    113:                        adios (NULLCP, "only one draft folder at a time!");
                    114:                    if (!(cp = *argp++) || *cp == '-')
                    115:                        adios (NULLCP, "missing argument to %s", argp[-2]);
                    116:                    dfolder = path (*cp == '+' || *cp == '@' ? cp + 1 : cp,
                    117:                            *cp != '@' ? TFOLDER : TSUBCWF);
                    118:                    continue;
                    119:                case DMSGSW:
                    120:                    if (dmsg)
                    121:                        adios (NULLCP, "only one draft message at a time!");
                    122:                    if (!(dmsg = *argp++) || *dmsg == '-')
                    123:                        adios (NULLCP, "missing argument to %s", argp[-2]);
                    124:                    continue;
                    125:                case NDFLDSW:
                    126:                    dfolder = NULL;
                    127:                    isdf = NOTOK;
                    128:                    continue;
                    129: 
                    130:                case EDITRSW:
                    131:                    if (!(ed = *argp++) || *ed == '-')
                    132:                        adios (NULLCP, "missing argument to %s", argp[-2]);
                    133:                    nedit = 0;
                    134:                    continue;
                    135:                case NEDITSW:
                    136:                    nedit++;
                    137:                    continue;
                    138: 
                    139:                case PRMPTSW:
                    140:                    if (!(myprompt = *argp++) || *myprompt == '-')
                    141:                        adios (NULLCP, "missing argument to %s", argp[-2]);
                    142:                    continue;
                    143:            }
                    144:        if (drft)
                    145:            adios (NULLCP, "only one draft at a time!");
                    146:        else
                    147:            drft = cp;
                    148:     }
                    149: 
                    150: /*  */
                    151: 
                    152:     if (drft == NULL && (drft = getenv ("mhdraft")) == NULL || *drft == NULL)
                    153:        drft = getcpy (m_draft (dfolder, dmsg, 1, &isdf));
                    154:     msgnam = (cp = getenv ("mhaltmsg")) && *cp ? getcpy (cp) : NULLCP;
                    155:     if (ed == NULL && ((ed = getenv ("mheditor")) == NULL || *ed == NULL))
                    156:        ed = NULL, nedit++;
                    157:     if ((cp = getenv ("mhuse")) && *cp)
                    158:        use = atoi (cp);
                    159:     if (!nedit
                    160:            && editfile (&ed, NULLVP, drft, use, NULLMP, msgnam, NULLCP) < 0)
                    161:        done (1);
                    162: 
                    163: /*  */
                    164: 
                    165:     (void) sprintf (prompt, myprompt, invo_name);
                    166:     for (;;) {
                    167:        if (!(argp = getans (prompt, aleqs))) {
                    168:            (void) unlink (LINK);
                    169:            done (1);
                    170:        }
                    171:        switch (smatch (*argp, aleqs)) {
                    172:            case DISPSW:
                    173:                if (msgnam)
                    174:                    (void) showfile (++argp, msgnam);
                    175:                else
                    176:                    advise (NULLCP, "no alternate message to display");
                    177:                break;
                    178: 
                    179:            case EDITSW:
                    180:                if (*++argp)
                    181:                    ed = *argp++;
                    182:                if (editfile (&ed, argp, drft, NOUSE, NULLMP, msgnam, NULLCP)
                    183:                        == NOTOK)
                    184:                    done (1);
                    185:                break;
                    186: 
                    187:            case LISTSW:
                    188:                (void) showfile (++argp, drft);
                    189:                break;
                    190: 
                    191:            case WHOMSW:
                    192:                (void) whomfile (++argp, drft);
                    193:                break;
                    194: 
                    195:            case QUITSW:
                    196:                if (*++argp && (*argp[0] == 'd' ||
                    197:                            ((*argp)[0] == '-' && (*argp)[1] == 'd'))) {
                    198:                    if (unlink (drft) == NOTOK)
                    199:                        adios (drft, "unable to unlink");
                    200:                }
                    201:                else
                    202:                    if (stat (drft, &st) != NOTOK)
                    203:                        advise (NULLCP, "draft left on %s", drft);
                    204:                done (1);
                    205: 
                    206:            case PUSHSW:
                    207:                sendfile (++argp, drft, 1);
                    208:                done (1);
                    209: 
                    210:            case SENDSW:
                    211:                sendfile (++argp, drft, 0);
                    212:                break;
                    213: 
                    214:            case REFILEOPT:
                    215:                if (refile (++argp, drft) == 0)
                    216:                    done (0);
                    217:                break;
                    218: 
                    219:            default:
                    220:                advise (NULLCP, "say what?");
                    221:                break;
                    222:        }
                    223:     }
                    224: }
                    225: 
                    226: /*    EDIT */
                    227: 
                    228: static int  reedit = 0;
                    229: static char *edsave = NULL;
                    230: 
                    231: 
                    232: /* ARGSUSED */
                    233: 
                    234: static int
                    235: editfile(ed, arg, file, use, mp, altmsg, cwd)
                    236:        register struct msgs *mp;
                    237:        register char **ed, **arg, *file, *altmsg, *cwd;
                    238:        register int use;
                    239: {
                    240:     int     pid,
                    241:             status;
                    242:     register int    vecp;
                    243:     register char  *cp;
                    244:     char    altpath[BUFSIZ],
                    245:             linkpath[BUFSIZ],
                    246:            *vec[MAXARGS];
                    247:     struct stat st;
                    248: #ifdef BSD42
                    249:     int            slinked;
                    250: #endif BSD42
                    251: 
                    252:     if (!reedit) {             /* set initial editor */
                    253:        if (*ed == NULL && (*ed = m_find ("editor")) == NULL)
                    254:            *ed = sysed;
                    255:     }
                    256:     else
                    257:        if (!*ed) {             /* no explicit editor */
                    258:            *ed = edsave;
                    259:            if ((cp = r1bindex (*ed, '/')) == NULL)
                    260:                cp = *ed;
                    261:            cp = concat (cp, "-next", NULLCP);
                    262:            if ((cp = m_find (cp)) != NULL)
                    263:                *ed = cp;
                    264:        }
                    265: 
                    266:     if (altmsg) {
                    267:        if (mp == NULL || *altmsg == '/' || cwd == NULL)
                    268:            (void) strcpy (altpath, altmsg);
                    269:        else
                    270:            (void) sprintf (altpath, "%s/%s", mp -> foldpath, altmsg);
                    271:        if (cwd == NULL)
                    272:            (void) strcpy (linkpath, LINK);
                    273:        else
                    274:            (void) sprintf (linkpath, "%s/%s", cwd, LINK);
                    275:     }
                    276: 
                    277:     if (altmsg) {
                    278:        (void) unlink (linkpath);
                    279: #ifdef BSD42
                    280: #ifndef VAXVMS
                    281:        if (link (altpath, linkpath) == NOTOK) {
                    282: #endif
                    283:            (void) symlink (altpath, linkpath);
                    284:            slinked = 1;
                    285: #ifndef VAXVMS
                    286:        }
                    287:        else
                    288:            slinked = 0;
                    289: #endif
                    290: #else  not BSD42
                    291:        (void) link (altpath, linkpath);
                    292: #endif not BSD42
                    293:     }
                    294: 
                    295:     m_update ();
                    296:     (void) fflush (stdout);
                    297: 
                    298:     switch (pid = vfork ()) {
                    299:        case NOTOK:
                    300:            advise ("fork", "unable to");
                    301:            status = NOTOK;
                    302:            break;
                    303: 
                    304:        case OK:
                    305:            if (cwd)
                    306:                (void) chdir (cwd);
                    307:            if (altmsg) {
                    308:                if (mp)
                    309:                    (void) putenv ("mhfolder", mp -> foldpath);
                    310:                (void) putenv ("editalt", altpath);
                    311:            }
                    312: 
                    313:            vecp = 0;
                    314:            vec[vecp++] = r1bindex (*ed, '/');
                    315:            if (arg)
                    316:                while (*arg)
                    317:                    vec[vecp++] = *arg++;
                    318:            vec[vecp++] = file;
                    319:            vec[vecp] = NULL;
                    320: 
                    321:            execvp (*ed, vec);
                    322:            fprintf (stderr, "unable to exec ");
                    323:            perror (*ed);
                    324:            _exit (-1);
                    325: 
                    326:        default:
                    327:            if (status = pidwait (pid, NOTOK)) {
                    328:                if (((status & 0xff00) != 0xff00)
                    329:                        && (!reedit || (status & 0x00ff)))
                    330:                    if (!use && (status & 0xff00)) {
                    331:                        (void) unlink (file);
                    332:                        advise (NULLCP, "problems with edit--%s deleted", file);
                    333:                    }
                    334:                    else
                    335:                        advise (NULLCP, "problems with edit--%s preserved",
                    336:                                file);
                    337:                status = -2;
                    338:                break;
                    339:            }
                    340: 
                    341:            reedit++;
                    342: #ifdef BSD42
                    343:            if (altmsg
                    344:                    && mp
                    345:                    && (!mp -> msgflags & READONLY)
                    346:                    && (slinked
                    347:                           ? lstat (linkpath, &st) != NOTOK
                    348:                                && (st.st_mode & S_IFMT) == S_IFREG
                    349:                                && copyf (linkpath, altpath) == NOTOK
                    350:                           : stat (linkpath, &st) != NOTOK
                    351:                                && st.st_nlink == 1
                    352:                                && (unlink (altpath) == NOTOK
                    353:                                        || link (linkpath, altpath) == NOTOK)))
                    354:                advise (linkpath, "unable to update %s from", altmsg);
                    355: #else  not BSD42
                    356:            if (altmsg
                    357:                    && mp
                    358:                    && (!mp -> msgflags & READONLY)
                    359:                    && stat (linkpath, &st) != NOTOK
                    360:                    && st.st_nlink == 1
                    361:                    && (unlink (altpath) == NOTOK
                    362:                        || link (linkpath, altpath) == NOTOK))
                    363:                advise (linkpath, "unable to update %s from", altmsg);
                    364: #endif not BSD42
                    365:     }
                    366: 
                    367:     edsave = getcpy (*ed);
                    368:     *ed = NULL;
                    369:     if (altmsg)
                    370:        (void) unlink (linkpath);
                    371: 
                    372:     return status;
                    373: }
                    374: 
                    375: /*  */
                    376: 
                    377: #ifdef BSD42
                    378: static int
                    379: copyf(ifile, ofile)
                    380:        register char *ifile, *ofile;
                    381: {
                    382:     register int    i;
                    383:     int     in,
                    384:             out;
                    385:     char    buffer[BUFSIZ];
                    386: 
                    387:     if ((in = open (ifile, 0)) == NOTOK)
                    388:        return NOTOK;
                    389:     if ((out = open (ofile, 1)) == NOTOK || ftruncate (out, 0) == NOTOK) {
                    390:        if (out != NOTOK) {
                    391:            admonish (ofile, "unable to truncate");
                    392:            (void) close (out);
                    393:        }
                    394:        (void) close (in);
                    395:        return NOTOK;
                    396:     }
                    397: 
                    398:     while ((i = read (in, buffer, sizeof buffer)) > OK)
                    399:        if (write (out, buffer, i) != i) {
                    400:            advise (ofile, "may have damaged");
                    401:            i = NOTOK;
                    402:            break;
                    403:        }
                    404: 
                    405:     (void) close (in);
                    406:     (void) close (out);
                    407: 
                    408:     return i;
                    409: }
                    410: #endif BSD42
                    411: 
                    412: /*    SEND */
                    413: 
                    414: static void
                    415: sendfile(arg, file, pushsw)
                    416:        register char **arg, *file;
                    417:        int pushsw;
                    418: {
                    419:     register int    child_id,
                    420:                     i,
                    421:                     vecp;
                    422:     char *cp,
                    423:         *sp,
                    424:         *vec[MAXARGS];
                    425: 
                    426:     if (strcmp (sp = r1bindex (sendproc, '/'), "send") == 0) {
                    427:        cp = invo_name;
                    428:        sendit (invo_name = sp, arg, file, pushsw);
                    429:        invo_name = cp;
                    430:        return;
                    431:     }
                    432: 
                    433:     m_update ();
                    434:     (void) fflush (stdout);
                    435: 
                    436:     for (i = 0; (child_id = vfork ()) == NOTOK && i < 5; i++)
                    437:        sleep (5);
                    438:     switch (child_id) {
                    439:        case NOTOK:
                    440:            advise (NULLCP, "unable to fork, so sending directly...");
                    441:        case OK:
                    442:            vecp = 0;
                    443:            vec[vecp++] = invo_name;
                    444:            if (pushsw)
                    445:                vec[vecp++] = "-push";
                    446:            if (arg)
                    447:                while (*arg)
                    448:                    vec[vecp++] = *arg++;
                    449:            vec[vecp++] = file;
                    450:            vec[vecp] = NULL;
                    451: 
                    452:            execvp (sendproc, vec);
                    453:            fprintf (stderr, "unable to exec ");
                    454:            perror (sendproc);
                    455:            _exit (-1);
                    456: 
                    457:        default:
                    458:            if (pidwait (child_id, OK) == 0)
                    459:                done (0);
                    460:            return;
                    461:     }
                    462: }
                    463: 
                    464: /*  */
                    465: 
                    466: static struct swit  sendswitches[] = {
                    467: #define        ALIASW  0
                    468:     "alias aliasfile", 0,
                    469: 
                    470: #define        DEBUGSW 1
                    471:     "debug", -5,
                    472: 
                    473: #define        ENCRSW  2
                    474:     "encrypt",
                    475: #ifndef        TMA
                    476:     -7,
                    477: #else  TMA
                    478:     0,
                    479: #endif TMA
                    480: #define        NENCRSW 3
                    481:     "noencrypt",
                    482: #ifndef        TMA
                    483:     -9,
                    484: #else  TMA
                    485:     0,
                    486: #endif TMA
                    487: 
                    488: #define        FILTSW  4
                    489:     "filter filterfile", 0,
                    490: #define        NFILTSW 5
                    491:     "nofilter", 0,
                    492: 
                    493: #define        FRMTSW  6
                    494:     "format", 0,
                    495: #define        NFRMTSW 7
                    496:     "noformat", 0,
                    497: 
                    498: #define        FORWSW  8
                    499:     "forward", 0,
                    500: #define        NFORWSW 9
                    501:     "noforward", 0,
                    502: 
                    503: #define        MSGDSW  10
                    504:     "msgid", 0,
                    505: #define        NMSGDSW 11
                    506:     "nomsgid", 0,
                    507: 
                    508: #define        SPSHSW  12
                    509:     "push", 0,
                    510: #define        NSPSHSW 13
                    511:     "nopush", 0,
                    512: 
                    513: #define        UNIQSW  14
                    514:     "unique", -6,
                    515: #define        NUNIQSW 15
                    516:     "nounique", -8,
                    517: 
                    518: #define        VERBSW  16
                    519:     "verbose", 0,
                    520: #define        NVERBSW 17
                    521:     "noverbose", 0,
                    522: 
                    523: #define        WATCSW  18
                    524:     "watch", 0,
                    525: #define        NWATCSW 19
                    526:     "nowatch", 0,
                    527: 
                    528: #define        WIDTHSW 20
                    529:     "width columns", 0,
                    530: 
                    531: #define        SHELPSW 21
                    532:     "help", 4,
                    533: 
                    534: #define        MAILSW  22
                    535:     "mail", -4,
                    536: #define        SAMLSW  23
                    537:     "saml", -4,
                    538: #define        SSNDSW  24
                    539:     "send", -4,
                    540: #define        SOMLSW  25
                    541:     "soml", -4,
                    542: 
                    543: #define        CLIESW  26
                    544:     "client host", -6,
                    545: #define        SERVSW  27
                    546:     "server host", -6,
                    547: #define        SNOOPSW 28
                    548:     "snoop", -5,
                    549: 
                    550: #define SDRFSW 29
                    551:     "draftfolder +folder", -6,
                    552: #define SDRMSW 30
                    553:     "draftmessage msg", -6,
                    554: #define SNDRFSW 31
                    555:     "nodraftfolder", -3,
                    556: 
                    557:     NULL, NULL
                    558: };
                    559: 
                    560: /*  */
                    561: 
                    562: extern int debugsw;            /* from sendsbr.c */
                    563: extern int forwsw;
                    564: extern int inplace;
                    565: extern int pushsw;
                    566: extern int unique;
                    567: 
                    568: extern char *altmsg;           /*  .. */
                    569: extern char *annotext;
                    570: extern char *distfile;
                    571: 
                    572: /*  */
                    573: 
                    574: static void
                    575: sendit(sp, arg, file, pushed)
                    576:        register char *sp, **arg, *file;
                    577:        int pushed;
                    578: {
                    579:     int     distsw = 0,
                    580:            vecp = 1;
                    581:     char   *cp,
                    582:             buf[100],
                    583:           **ap,
                    584:           **argp,
                    585:            *arguments[MAXARGS],
                    586:            *vec[MAXARGS];
                    587:     struct stat st;
                    588: #ifdef UCI
                    589:     FILE   *fp;
                    590: #endif UCI
                    591: 
                    592:     if (arg)
                    593:        (void) copyip (arg, vec);
                    594:     if ((cp = m_find (sp)) != NULL) {
                    595:        ap = brkstring (cp = getcpy (cp), " ", "\n");
                    596:        ap = copyip (ap, arguments);
                    597:     }
                    598:     else
                    599:        ap = arguments;
                    600:     if (arg)
                    601:        (void) copyip (vec, ap);
                    602:     argp = arguments;
                    603: 
                    604:     debugsw = 0, forwsw = 1, inplace = 0, unique = 0;
                    605:     altmsg = annotext = distfile = NULL;
                    606:     vec[vecp++] = "-library";
                    607:     vec[vecp++] = getcpy (m_maildir (""));
                    608: 
                    609: /*  */
                    610: 
                    611:     while (cp = *argp++) {
                    612:        if (*cp == '-')
                    613:            switch (smatch (++cp, sendswitches)) {
                    614:                case AMBIGSW:
                    615:                    ambigsw (cp, sendswitches);
                    616:                    return;
                    617:                case UNKWNSW:
                    618:                    advise (NULLCP, "-%s unknown\n", cp);
                    619:                    return;
                    620:                case SHELPSW:
                    621:                    (void) sprintf (buf, "%s [switches]", sp);
                    622:                    help (buf, sendswitches);
                    623:                    return;
                    624: 
                    625:                case SPSHSW:
                    626:                    pushed++;
                    627:                    continue;
                    628:                case NSPSHSW:
                    629:                    pushed = 0;
                    630:                    continue;
                    631: 
                    632:                case UNIQSW:
                    633:                    unique++;
                    634:                    continue;
                    635:                case NUNIQSW:
                    636:                    unique = 0;
                    637:                    continue;
                    638:                case FORWSW:
                    639:                    forwsw++;
                    640:                    continue;
                    641:                case NFORWSW:
                    642:                    forwsw = 0;
                    643:                    continue;
                    644: 
                    645:                case DEBUGSW:
                    646:                    debugsw++;  /* fall */
                    647:                case NFILTSW:
                    648:                case FRMTSW:
                    649:                case NFRMTSW:
                    650:                case MSGDSW:
                    651:                case NMSGDSW:
                    652:                case VERBSW:
                    653:                case NVERBSW:
                    654:                case WATCSW:
                    655:                case NWATCSW:
                    656:                case MAILSW:
                    657:                case SAMLSW:
                    658:                case SSNDSW:
                    659:                case SOMLSW:
                    660:                case ENCRSW:
                    661:                case NENCRSW:
                    662:                case SNOOPSW:
                    663:                    vec[vecp++] = --cp;
                    664:                    continue;
                    665: 
                    666:                case ALIASW:
                    667:                case FILTSW:
                    668:                case WIDTHSW:
                    669:                case CLIESW:
                    670:                case SERVSW:
                    671:                    vec[vecp++] = --cp;
                    672:                    if (!(cp = *argp++) || *cp == '-') {
                    673:                        advise (NULLCP, "missing argument to %s", argp[-2]);
                    674:                        return;
                    675:                    }
                    676:                    vec[vecp++] = cp;
                    677:                    continue;
                    678: 
                    679:                case SDRFSW:
                    680:                case SDRMSW:
                    681:                    if (!(cp = *argp++) || *cp == '-') {
                    682:                        advise (NULLCP, "missing argument to %s", argp[-2]);
                    683:                        return;
                    684:                    }
                    685:                case SNDRFSW:
                    686:                    continue;
                    687:            }
                    688:        advise (NULLCP, "usage: %s [switches]", sp);
                    689:        return;
                    690:     }
                    691: 
                    692: /*  */
                    693: 
                    694: #ifdef TMA
                    695:     if ((cp = getenv ("KDS")) == NULL || *cp == NULL)
                    696:        if ((cp = m_find ("kdsproc")) && *cp)
                    697:            (void) putenv ("KDS", cp);
                    698:     if ((cp = getenv ("TMADB")) == NULL || *cp == NULL)
                    699:        if ((cp = m_find ("tmadb")) && *cp)
                    700:            (void) putenv ("TMADB", m_maildir (cp));
                    701: #endif TMA
                    702: 
                    703:     if ((cp = getenv ("SIGNATURE")) == NULL || *cp == NULL)
                    704:        if ((cp = m_find ("signature")) && *cp)
                    705:            (void) putenv ("SIGNATURE", cp);
                    706: #ifdef UCI
                    707:        else {
                    708:            (void) sprintf (buf, "%s/.signature", mypath);
                    709:            if ((fp = fopen (buf, "r")) != NULL
                    710:                && fgets (buf, sizeof buf, fp) != NULL) {
                    711:                    (void) fclose (fp);
                    712:                    if (cp = index (buf, '\n'))
                    713:                        *cp = NULL;
                    714:                    (void) putenv ("SIGNATURE", buf);
                    715:            }
                    716:        }
                    717: #endif UCI
                    718: 
                    719:     if ((annotext = getenv ("mhannotate")) == NULL || *annotext == NULL)
                    720:        annotext = NULL;
                    721:     if ((altmsg = getenv ("mhaltmsg")) == NULL || *altmsg == NULL)
                    722:        altmsg = NULL;
                    723:     if (annotext && ((cp = getenv ("mhinplace")) != NULL && *cp != NULL))
                    724:        inplace = atoi (cp);
                    725: 
                    726:     if ((cp = getenv ("mhdist"))
                    727:            && *cp
                    728:            && (distsw = atoi (cp))
                    729:            && altmsg) {
                    730:        vec[vecp++] = "-dist";
                    731:        distfile = getcpy (m_scratch (altmsg, invo_name));
                    732:        if (link (altmsg, distfile) == NOTOK)
                    733:            adios (distfile, "unable to link %s to", altmsg);
                    734:     }
                    735:     else
                    736:        distfile = NULL;
                    737: 
                    738:     if (altmsg == NULL || stat (altmsg, &st) == NOTOK)
                    739:        st.st_mtime = 0, st.st_dev = 0, st.st_ino = 0;
                    740:     if (pushsw = pushed)
                    741:        push ();
                    742: 
                    743:     vec[0] = r1bindex (postproc, '/');
                    744:     closefds (3);
                    745: 
                    746:     if (sendsbr (vec, vecp, file, &st) == OK)
                    747:        done (0);
                    748: }
                    749: 
                    750: /*    WHOM */
                    751: 
                    752: static int
                    753: whomfile(arg, file)
                    754:        register char **arg, *file;
                    755: {
                    756:     int     pid;
                    757:     register int    vecp;
                    758:     char   *vec[MAXARGS];
                    759: 
                    760:     m_update ();
                    761:     (void) fflush (stdout);
                    762: 
                    763:     switch (pid = vfork ()) {
                    764:        case NOTOK:
                    765:            advise ("fork", "unable to");
                    766:            return 1;
                    767: 
                    768:        case OK:
                    769:            vecp = 0;
                    770:            vec[vecp++] = r1bindex (whomproc, '/');
                    771:            vec[vecp++] = file;
                    772:            if (arg)
                    773:                while (*arg)
                    774:                    vec[vecp++] = *arg++;
                    775:            vec[vecp] = NULL;
                    776: 
                    777:            execvp (whomproc, vec);
                    778:            fprintf (stderr, "unable to exec ");
                    779:            perror (whomproc);
                    780:            _exit (-1);         /* NOTREACHED */
                    781: 
                    782:        default:
                    783:            return (pidwait (pid, NOTOK) & 0377 ? 1 : 0);
                    784:     }
                    785: }

unix.superglobalmegacorp.com

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