Annotation of 43BSD/contrib/mh/uip/whom.c, revision 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.