Annotation of 43BSD/contrib/mh/uip/mhmail.c, revision 1.1

1.1     ! root        1: /* mhmail.c - simple mail program */
        !             2: 
        !             3: #include "../h/mh.h"
        !             4: #include <stdio.h>
        !             5: #include <signal.h>
        !             6: 
        !             7: /*  */
        !             8: 
        !             9: static struct swit switches[] = {
        !            10: #define        BODYSW  0
        !            11:     "body text", 0,
        !            12: 
        !            13: #define        CCSW    1
        !            14:     "cc addrs ...", 0,
        !            15: 
        !            16: #define        FROMSW  2
        !            17:     "from addr", 0,
        !            18: 
        !            19: #define        SUBJSW  3
        !            20:     "subject", 0,
        !            21: 
        !            22: #define        HELPSW  4
        !            23:     "help", 4,
        !            24: 
        !            25:     NULL, NULL
        !            26: };
        !            27: 
        !            28: /*  */
        !            29: 
        !            30: int    intrser ();
        !            31: 
        !            32: 
        !            33: static char tmpfil[BUFSIZ];
        !            34: 
        !            35: /*  */
        !            36: 
        !            37: /* ARGSUSED */
        !            38: 
        !            39: main (argc, argv)
        !            40: int     argc;
        !            41: char   *argv[];
        !            42: {
        !            43:     int     child_id,
        !            44:            status,
        !            45:             i,
        !            46:             iscc = 0,
        !            47:             somebody;
        !            48:     char   *cp,
        !            49:            *tolist = NULL,
        !            50:            *cclist = NULL,
        !            51:            *subject = NULL,
        !            52:           *from = NULL,
        !            53:            *body = NULL,
        !            54:           **argp = argv + 1,
        !            55:             buf[100];
        !            56:     FILE * out;
        !            57: 
        !            58:     invo_name = r1bindex (argv[0], '/');
        !            59:     m_foil (NULLCP);
        !            60: 
        !            61:     if (argc == 1) {
        !            62:        execlp (incproc, r1bindex (incproc, '/'), NULLCP);
        !            63:        adios (incproc, "unable to exec");
        !            64:     }
        !            65: 
        !            66: /*  */
        !            67: 
        !            68:     while (cp = *argp++) {
        !            69:        if (*cp == '-')
        !            70:            switch (smatch (++cp, switches)) {
        !            71:                case AMBIGSW: 
        !            72:                    ambigsw (cp, switches);
        !            73:                    done (1);
        !            74: 
        !            75:                case UNKWNSW: 
        !            76:                    adios (NULLCP, "-%s unknown", cp);
        !            77: 
        !            78:                case HELPSW: 
        !            79:                    (void) sprintf (buf, "%s [addrs ... [switches]]",
        !            80:                            invo_name);
        !            81:                    help (buf, switches);
        !            82:                    done (1);
        !            83: 
        !            84:                case FROMSW: 
        !            85:                    if (!(from = *argp++) || *from == '-')
        !            86:                        adios (NULLCP, "missing argument to %s", argp[-2]);
        !            87:                    continue;
        !            88: 
        !            89:                case BODYSW: 
        !            90:                    if (!(body = *argp++) || *body == '-')
        !            91:                        adios (NULLCP, "missing argument to %s", argp[-2]);
        !            92:                    continue;
        !            93: 
        !            94:                case CCSW: 
        !            95:                    iscc++;
        !            96:                    continue;
        !            97: 
        !            98:                case SUBJSW: 
        !            99:                    if (!(subject = *argp++) || *subject == '-')
        !           100:                        adios (NULLCP, "missing argument to %s", argp[-2]);
        !           101:                    continue;
        !           102:            }
        !           103:        if (iscc)
        !           104:            cclist = cclist ? add (cp, add (", ", cclist)) : getcpy (cp);
        !           105:        else
        !           106:            tolist = tolist ? add (cp, add (", ", tolist)) : getcpy (cp);
        !           107:     }
        !           108: 
        !           109: /*  */
        !           110: 
        !           111:     (void) strcpy (tmpfil, m_tmpfil (invo_name));
        !           112:     if ((out = fopen (tmpfil, "w")) == NULL)
        !           113:        adios (tmpfil, "unable to write");
        !           114:     (void) chmod (tmpfil, 0600);
        !           115: 
        !           116:     setsig (SIGINT, intrser);
        !           117: 
        !           118:     fprintf (out, "To: %s\n", tolist);
        !           119:     if (cclist)
        !           120:        fprintf (out, "cc: %s\n", cclist);
        !           121:     if (subject)
        !           122:        fprintf (out, "Subject: %s\n", subject);
        !           123:     if (from)
        !           124:        fprintf (out, "From: %s\n", from);
        !           125:     fprintf (out, "\n");
        !           126: 
        !           127:     if (body)
        !           128:        fprintf (out, "%s\n", body);
        !           129:     else {
        !           130:        for (somebody = 0;
        !           131:                (i = read (fileno (stdin), buf, sizeof buf)) > 0;
        !           132:                somebody++)
        !           133:            if (fwrite (buf, sizeof *buf, i, out) != i)
        !           134:                adios (tmpfil, "error writing");
        !           135:        if (!somebody) {
        !           136:            (void) unlink (tmpfil);
        !           137:            done (1);
        !           138:        }
        !           139:     }
        !           140:     (void) fclose (out);
        !           141: 
        !           142: /*  */
        !           143: 
        !           144:     for (i = 0; (child_id = fork ()) == NOTOK && i < 5; i++)
        !           145:        sleep (5);
        !           146:     switch (child_id) {
        !           147:        case NOTOK:             /* report failure and then send it */
        !           148:            admonish (NULLCP, "unable to fork");
        !           149: 
        !           150:        case OK: 
        !           151:            execlp (postproc, r1bindex (postproc, '/'), tmpfil, NULLCP);
        !           152:            fprintf (stderr, "unable to exec ");
        !           153:            perror (postproc);
        !           154:            _exit (-1);
        !           155: 
        !           156:        default: 
        !           157:            if (status = pidXwait (child_id, postproc)) {
        !           158:                fprintf (stderr, "Letter saved in dead.letter\n");
        !           159:                execl ("/bin/mv", "mv", tmpfil, "dead.letter", NULLCP);
        !           160:                execl ("/usr/bin/mv", "mv", tmpfil, "dead.letter", NULLCP);
        !           161:                perror ("mv");
        !           162:                _exit (-1);
        !           163:            }
        !           164: 
        !           165:            (void) unlink (tmpfil);
        !           166:            done (status ? 1 : 0);
        !           167:     }
        !           168: }
        !           169: 
        !           170: /*  */
        !           171: 
        !           172: /* ARGSUSED */
        !           173: 
        !           174: static int  intrser (i)
        !           175: int     i;
        !           176: {
        !           177: #ifndef        BSD42
        !           178:     if (i)
        !           179:        (void) signal (i, SIG_IGN);
        !           180: #endif BSD42
        !           181: 
        !           182:     (void) unlink (tmpfil);
        !           183:     done (i != 0 ? 1 : 0);
        !           184: }

unix.superglobalmegacorp.com

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