Annotation of 43BSD/contrib/mh/uip/whom.c, revision 1.1.1.1

1.1       root        1: /* whom.c - report who a message would go to */
                      2: 
                      3: #include "../h/mh.h"
                      4: #include <stdio.h>
                      5: #include <signal.h>
                      6: 
                      7: /*  */
                      8: 
                      9: static struct swit switches[] = {
                     10: #define        ALIASW  0
                     11:     "alias aliasfile", 0,
                     12: 
                     13: #define        CHKSW   1
                     14:     "check", 0,
                     15: #define        NOCHKSW 2
                     16:     "nocheck", 0,
                     17: 
                     18: #define        DRAFTSW 3
                     19:     "draft", 0,
                     20: 
                     21: #define        DFOLDSW 4
                     22:     "draftfolder +folder", 6,
                     23: #define        DMSGSW  5
                     24:     "draftmessage msg", 6,
                     25: #define        NDFLDSW 6
                     26:     "nodraftfolder", 0,
                     27: 
                     28: #define        HELPSW  7
                     29:     "help", 4,
                     30: 
                     31: #define        CLIESW  8
                     32:     "client host", -6,
                     33: #define        SERVSW  9
                     34:     "server host", -6,
                     35: #define        SNOOPSW 10
                     36:     "snoop", -5,
                     37: 
                     38:     NULL, NULL
                     39: };
                     40: 
                     41: /*  */
                     42: 
                     43: /* ARGSUSED */
                     44: 
                     45: main (argc, argv)
                     46: int     argc;
                     47: char   *argv[];
                     48: {
                     49:     int     child_id,
                     50:            i,
                     51:            status,
                     52:            isdf = 0,
                     53:            distsw = 0,
                     54:             vecp = 0;
                     55:     char   *cp,
                     56:           *dfolder = NULL,
                     57:           *dmsg = NULL,
                     58:            *msg = NULL,
                     59:           **ap,
                     60:           **argp,
                     61:            backup[BUFSIZ],
                     62:             buf[100],
                     63:            *arguments[MAXARGS],
                     64:            *vec[MAXARGS];
                     65: 
                     66:     invo_name = r1bindex (argv[0], '/');
                     67:     if ((cp = m_find (invo_name)) != NULL) {
                     68:        ap = brkstring (cp = getcpy (cp), " ", "\n");
                     69:        ap = copyip (ap, arguments);
                     70:     }
                     71:     else
                     72:        ap = arguments;
                     73:     (void) copyip (argv + 1, ap);
                     74:     argp = arguments;
                     75: 
                     76:     vec[vecp++] = invo_name;
                     77:     vec[vecp++] = "-whom";
                     78:     vec[vecp++] = "-library";
                     79:     vec[vecp++] = getcpy (m_maildir (""));
                     80: 
                     81: /*  */
                     82: 
                     83:     while (cp = *argp++) {
                     84:        if (*cp == '-')
                     85:            switch (smatch (++cp, switches)) {
                     86:                case AMBIGSW: 
                     87:                    ambigsw (cp, switches);
                     88:                    done (1);
                     89:                case UNKWNSW: 
                     90:                    adios (NULLCP, "-%s unknown", cp);
                     91:                case HELPSW: 
                     92:                    (void) sprintf (buf, "%s [switches] [file]", invo_name);
                     93:                    help (buf, switches);
                     94:                    done (1);
                     95: 
                     96:                case CHKSW: 
                     97:                case NOCHKSW: 
                     98:                case SNOOPSW:
                     99:                    vec[vecp++] = --cp;
                    100:                    continue;
                    101: 
                    102:                case DRAFTSW:
                    103:                    msg = draft;
                    104:                    continue;
                    105: 
                    106:                case DFOLDSW: 
                    107:                    if (dfolder)
                    108:                        adios (NULLCP, "only one draft folder at a time!");
                    109:                    if (!(cp = *argp++) || *cp == '-')
                    110:                        adios (NULLCP, "missing argument to %s", argp[-2]);
                    111:                    dfolder = path (*cp == '+' || *cp == '@' ? cp + 1 : cp,
                    112:                            *cp != '@' ? TFOLDER : TSUBCWF);
                    113:                    continue;
                    114:                case DMSGSW: 
                    115:                    if (dmsg)
                    116:                        adios (NULLCP, "only one draft message at a time!");
                    117:                    if (!(dmsg = *argp++) || *dmsg == '-')
                    118:                        adios (NULLCP, "missing argument to %s", argp[-2]);
                    119:                    continue;
                    120:                case NDFLDSW: 
                    121:                    dfolder = NULL;
                    122:                    isdf = NOTOK;
                    123:                    continue;
                    124: 
                    125:                case ALIASW: 
                    126:                case CLIESW: 
                    127:                case SERVSW: 
                    128:                    vec[vecp++] = --cp;
                    129:                    if (!(cp = *argp++) || *cp == '-')
                    130:                        adios (NULLCP, "missing argument to %s", argp[-2]);
                    131:                    vec[vecp++] = cp;
                    132:                    continue;
                    133:            }
                    134:        if (msg)
                    135:            adios (NULLCP, "only one draft at a time!");
                    136:        else
                    137:            vec[vecp++] = msg = cp;
                    138:     }
                    139: 
                    140: /*  */
                    141: 
                    142:     if (msg == NULL) {
                    143: #ifdef WHATNOW
                    144:        if ((cp = getenv ("mhdraft")) == NULL || *cp == NULL)
                    145: #endif WHATNOW
                    146:            cp  = getcpy (m_draft (dfolder, dmsg, 1, &isdf));
                    147:        msg = vec[vecp++] = cp;
                    148:     }
                    149:     if ((cp = getenv ("mhdist"))
                    150:            && *cp
                    151:            && (distsw = atoi (cp))
                    152:            && (cp = getenv ("mhaltmsg"))
                    153:            && *cp) {
                    154:        if (distout (msg, cp, backup) == NOTOK)
                    155:            done (1);
                    156:        vec[vecp++] = "-dist";
                    157:        distsw++;
                    158:     }
                    159:     vec[vecp] = NULL;
                    160: 
                    161:     closefds (3);
                    162: 
                    163:     if (distsw)
                    164:        for (i = 0; (child_id = fork ()) == NOTOK && i < 5; i++)
                    165:            sleep (5);
                    166:     switch (distsw ? child_id : OK) {
                    167:        case NOTOK:
                    168:            advise (NULLCP, "unable to fork, so checking directly...");
                    169:        case OK:
                    170:            execvp (postproc, vec);
                    171:            fprintf (stderr, "unable to exec ");
                    172:            perror (postproc);
                    173:            _exit (-1);
                    174: 
                    175:        default:
                    176:            (void) signal (SIGHUP, SIG_IGN);
                    177:            (void) signal (SIGINT, SIG_IGN);
                    178:            (void) signal (SIGQUIT, SIG_IGN);
                    179:            (void) signal (SIGTERM, SIG_IGN);
                    180: 
                    181:            status = pidwait (child_id, OK);
                    182: 
                    183:            (void) unlink (msg);
                    184:            if (rename (backup, msg) == NOTOK)
                    185:                adios (msg, "unable to rename %s to", backup);
                    186:            done (status);
                    187:     }
                    188: }

unix.superglobalmegacorp.com

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