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

unix.superglobalmegacorp.com

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