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

1.1     ! root        1: /* send.c - send a composed message */
        !             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 switches[] = {
        !            12: #define        ALIASW  0
        !            13:     "alias aliasfile", 0,
        !            14: 
        !            15: #define        DEBUGSW 1
        !            16:     "debug", -5,
        !            17: 
        !            18: #define        DRAFTSW 2
        !            19:     "draft", 0,
        !            20: 
        !            21: #define        DFOLDSW 3
        !            22:     "draftfolder +folder", 6,
        !            23: #define        DMSGSW  4
        !            24:     "draftmessage msg", 6,
        !            25: #define        NDFLDSW 5
        !            26:     "nodraftfolder", 0,
        !            27: 
        !            28: #define        ENCRSW  6
        !            29:     "encrypt",
        !            30: #ifndef        TMA
        !            31:        -7,
        !            32: #else  TMA
        !            33:        0,
        !            34: #endif TMA
        !            35: #define        NENCRSW 7
        !            36:     "noencrypt",
        !            37: #ifndef        TMA
        !            38:        -9,
        !            39: #else  TMA
        !            40:        0,
        !            41: #endif TMA
        !            42: 
        !            43: #define        FILTSW  8
        !            44:     "filter filterfile", 0,
        !            45: #define        NFILTSW 9
        !            46:     "nofilter", 0,
        !            47: 
        !            48: #define        FRMTSW  10
        !            49:     "format", 0,
        !            50: #define        NFRMTSW 11
        !            51:     "noformat", 0,
        !            52: 
        !            53: #define        FORWSW  12
        !            54:     "forward", 0,
        !            55: #define        NFORWSW 13
        !            56:     "noforward", 0,
        !            57: 
        !            58: #define        MSGDSW  14
        !            59:     "msgid", 0,
        !            60: #define        NMSGDSW 15
        !            61:     "nomsgid", 0,
        !            62: 
        !            63: #define        PUSHSW  16
        !            64:     "push", 0,
        !            65: #define        NPUSHSW 17
        !            66:     "nopush", 0,
        !            67: 
        !            68: #define        UNIQSW  18
        !            69:     "unique", -6,
        !            70: #define        NUNIQSW 19
        !            71:     "nounique", -8,
        !            72: 
        !            73: #define        VERBSW  20
        !            74:     "verbose", 0,
        !            75: #define        NVERBSW 21
        !            76:     "noverbose", 0,
        !            77: 
        !            78: #define        WATCSW  22
        !            79:     "watch", 0,
        !            80: #define        NWATCSW 23
        !            81:     "nowatch", 0,
        !            82: 
        !            83: #define        WIDTHSW 24
        !            84:     "width columns", 0,
        !            85: 
        !            86: #define        HELPSW  25
        !            87:     "help", 4,
        !            88: 
        !            89: #define        MAILSW  26
        !            90:     "mail", -4,
        !            91: #define        SAMLSW  27
        !            92:     "saml", -4,
        !            93: #define        SENDSW  28
        !            94:     "send", -4,
        !            95: #define        SOMLSW  29
        !            96:     "soml", -4,
        !            97: 
        !            98: #define        CLIESW  30
        !            99:     "client host", -6,
        !           100: #define        SERVSW  31
        !           101:     "server host", -6,
        !           102: #define        SNOOPSW 32
        !           103:     "snoop", -5,
        !           104: 
        !           105:     NULL, NULL
        !           106: };
        !           107: 
        !           108: static struct swit anyl[] = {
        !           109: #define        NOSW    0
        !           110:     "no", 0,
        !           111: #define        YESW    1
        !           112:     "yes", 0,
        !           113: #define        LISTDSW 2
        !           114:     "list", 0,
        !           115: 
        !           116:     NULL, NULL
        !           117: };
        !           118: 
        !           119: /*  */
        !           120: 
        !           121: extern int debugsw;            /* from sendsbr.c */
        !           122: extern int forwsw;
        !           123: extern int inplace;
        !           124: extern int pushsw;
        !           125: extern int unique;
        !           126: 
        !           127: extern char *altmsg;           /*  .. */
        !           128: extern char *annotext;
        !           129: extern char *distfile;
        !           130: 
        !           131: /*  */
        !           132: 
        !           133: /* ARGSUSED */
        !           134: 
        !           135: main (argc, argv)
        !           136: int     argc;
        !           137: char   *argv[];
        !           138: {
        !           139:     int     msgp = 0,
        !           140:            distsw = 0,
        !           141:             vecp = 1,
        !           142:             isdf = 0,
        !           143:             msgnum,
        !           144:             status;
        !           145:     char   *cp,
        !           146:            *dfolder = NULL,
        !           147:            *maildir,
        !           148:             buf[100],
        !           149:           **ap,
        !           150:           **argp,
        !           151:            *arguments[MAXARGS],
        !           152:            *msgs[MAXARGS],
        !           153:            *vec[MAXARGS];
        !           154:     struct msgs *mp;
        !           155:     struct stat st;
        !           156: #ifdef UCI
        !           157:     FILE   *fp;
        !           158: #endif UCI
        !           159: 
        !           160:     invo_name = r1bindex (argv[0], '/');
        !           161:     if ((cp = m_find (invo_name)) != NULL) {
        !           162:        ap = brkstring (cp = getcpy (cp), " ", "\n");
        !           163:        ap = copyip (ap, arguments);
        !           164:     }
        !           165:     else
        !           166:        ap = arguments;
        !           167:     (void) copyip (argv + 1, ap);
        !           168:     argp = arguments;
        !           169: 
        !           170:     vec[vecp++] = "-library";
        !           171:     vec[vecp++] = getcpy (m_maildir (""));
        !           172: 
        !           173: /*  */
        !           174: 
        !           175:     while (cp = *argp++) {
        !           176:        if (*cp == '-')
        !           177:            switch (smatch (++cp, switches)) {
        !           178:                case AMBIGSW: 
        !           179:                    ambigsw (cp, switches);
        !           180:                    done (1);
        !           181:                case UNKWNSW: 
        !           182:                    adios (NULLCP, "-%s unknown\n", cp);
        !           183:                case HELPSW: 
        !           184:                    (void) sprintf (buf, "%s [file] [switches]", invo_name);
        !           185:                    help (buf, switches);
        !           186:                    done (1);   /* thanks, phyl */
        !           187: 
        !           188:                case DRAFTSW: 
        !           189:                    msgs[msgp++] = draft;
        !           190:                    continue;
        !           191: 
        !           192:                case DFOLDSW: 
        !           193:                    if (dfolder)
        !           194:                        adios (NULLCP, "only one draft folder at a time!");
        !           195:                    if (!(cp = *argp++) || *cp == '-')
        !           196:                        adios (NULLCP, "missing argument to %s", argp[-2]);
        !           197:                    dfolder = path (*cp == '+' || *cp == '@' ? cp + 1 : cp,
        !           198:                            *cp != '@' ? TFOLDER : TSUBCWF);
        !           199:                    continue;
        !           200:                case DMSGSW: 
        !           201:                    if (!(cp = *argp++) || *cp == '-')
        !           202:                        adios (NULLCP, "missing argument to %s", argp[-2]);
        !           203:                    msgs[msgp++] = cp;
        !           204:                    continue;
        !           205:                case NDFLDSW: 
        !           206:                    dfolder = NULL;
        !           207:                    isdf = NOTOK;
        !           208:                    continue;
        !           209: 
        !           210:                case PUSHSW: 
        !           211:                    pushsw++;
        !           212:                    continue;
        !           213:                case NPUSHSW: 
        !           214:                    pushsw = 0;
        !           215:                    continue;
        !           216: 
        !           217:                case UNIQSW: 
        !           218:                    unique++;
        !           219:                    continue;
        !           220:                case NUNIQSW: 
        !           221:                    unique = 0;
        !           222:                    continue;
        !           223: 
        !           224:                case FORWSW:
        !           225:                    forwsw++;
        !           226:                    continue;
        !           227:                case NFORWSW:
        !           228:                    forwsw = 0;
        !           229:                    continue;
        !           230: 
        !           231:                case DEBUGSW: 
        !           232:                    debugsw++;  /* fall */
        !           233:                case NFILTSW: 
        !           234:                case FRMTSW: 
        !           235:                case NFRMTSW: 
        !           236:                case MSGDSW: 
        !           237:                case NMSGDSW: 
        !           238:                case VERBSW: 
        !           239:                case NVERBSW: 
        !           240:                case WATCSW: 
        !           241:                case NWATCSW: 
        !           242:                case MAILSW: 
        !           243:                case SAMLSW: 
        !           244:                case SENDSW: 
        !           245:                case SOMLSW: 
        !           246:                case ENCRSW:
        !           247:                case NENCRSW:
        !           248:                case SNOOPSW: 
        !           249:                    vec[vecp++] = --cp;
        !           250:                    continue;
        !           251: 
        !           252:                case ALIASW: 
        !           253:                case FILTSW: 
        !           254:                case WIDTHSW: 
        !           255:                case CLIESW: 
        !           256:                case SERVSW: 
        !           257:                    vec[vecp++] = --cp;
        !           258:                    if (!(cp = *argp++) || *cp == '-')
        !           259:                        adios (NULLCP, "missing argument to %s", argp[-2]);
        !           260:                    vec[vecp++] = cp;
        !           261:                    continue;
        !           262:            }
        !           263:        else
        !           264:            msgs[msgp++] = cp;
        !           265:     }
        !           266: 
        !           267: /*  */
        !           268: 
        !           269:     if (dfolder == NULL) {
        !           270:        if (msgp == 0) {
        !           271: #ifdef WHATNOW
        !           272:            if ((cp = getenv ("mhdraft")) && *cp) {
        !           273:                msgs[msgp++] = cp;
        !           274:                goto go_to_it;
        !           275:            }
        !           276: #endif WHATNOW
        !           277:            msgs[msgp++] = getcpy (m_draft (NULLCP, NULLCP, 1, &isdf));
        !           278:            if (stat (msgs[0], &st) == NOTOK)
        !           279:                adios (msgs[0], "unable to stat draft file");
        !           280:            cp = concat ("Use \"", msgs[0], "\"? ", NULLCP);
        !           281:            for (status = LISTDSW; status != YESW;) {
        !           282:                if (!(argp = getans (cp, anyl)))
        !           283:                    done (1);
        !           284:                switch (status = smatch (*argp, anyl)) {
        !           285:                    case NOSW: 
        !           286:                        done (0);
        !           287:                    case YESW: 
        !           288:                        break;
        !           289:                    case LISTDSW: 
        !           290:                        (void) showfile (++argp, msgs[0]);
        !           291:                        break;
        !           292:                    default:
        !           293:                        advise (NULLCP, "say what?");
        !           294:                        break;
        !           295:                }
        !           296:            }
        !           297:        }
        !           298:        else
        !           299:            for (msgnum = 0; msgnum < msgp; msgnum++)
        !           300:                msgs[msgnum] = getcpy (m_maildir (msgs[msgnum]));
        !           301:     }
        !           302:     else {
        !           303:        if (!m_find ("path"))
        !           304:            free (path ("./", TFOLDER));
        !           305: 
        !           306:        if (!msgp)
        !           307:            msgs[msgp++] = "cur";
        !           308:        maildir = m_maildir (dfolder);
        !           309: 
        !           310:        if (chdir (maildir) == NOTOK)
        !           311:            adios (maildir, "unable to change directory to");
        !           312:        if (!(mp = m_gmsg (dfolder)))
        !           313:            adios (NULLCP, "unable to read folder %s", dfolder);
        !           314:        if (mp -> hghmsg == 0)
        !           315:            adios (NULLCP, "no messages in %s", dfolder);
        !           316: 
        !           317:        for (msgnum = 0; msgnum < msgp; msgnum++)
        !           318:            if (!m_convert (mp, msgs[msgnum]))
        !           319:                done (1);
        !           320:        m_setseq (mp);
        !           321: 
        !           322:        for (msgp = 0, msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++)
        !           323:            if (mp -> msgstats[msgnum] & SELECTED) {
        !           324:                msgs[msgp++] = getcpy (m_name (msgnum));
        !           325: #ifdef notdef
        !           326:                mp -> msgstats[msgnum] |= DELETED;
        !           327: #endif notdef
        !           328:                mp -> msgstats[msgnum] &= ~EXISTS;
        !           329:            }
        !           330:        mp -> msgflags |= SEQMOD;
        !           331: 
        !           332:        m_sync (mp);
        !           333:     }
        !           334: #ifdef WHATNOW
        !           335: go_to_it: ;
        !           336: #endif WHATNOW
        !           337: 
        !           338: /*  */
        !           339: 
        !           340: #ifdef TMA
        !           341:     if ((cp = getenv ("KDS")) == NULL || *cp == NULL)
        !           342:        if ((cp = m_find ("kdsproc")) && *cp)
        !           343:            (void) putenv ("KDS", cp);
        !           344:     if ((cp = getenv ("TMADB")) == NULL || *cp == NULL)
        !           345:        if ((cp = m_find ("tmadb")) && *cp)
        !           346:            (void) putenv ("TMADB", m_maildir (cp));
        !           347: #endif TMA
        !           348: 
        !           349:     if ((cp = getenv ("SIGNATURE")) == NULL || *cp == NULL)
        !           350:        if ((cp = m_find ("signature")) && *cp)
        !           351:            (void) putenv ("SIGNATURE", cp);
        !           352: #ifdef UCI
        !           353:        else {
        !           354:            (void) sprintf (buf, "%s/.signature", mypath);
        !           355:            if ((fp = fopen (buf, "r")) != NULL
        !           356:                && fgets (buf, sizeof buf, fp) != NULL) {
        !           357:                    (void) fclose (fp);
        !           358:                    if (cp = index (buf, '\n'))
        !           359:                        *cp = NULL;
        !           360:                    (void) putenv ("SIGNATURE", buf);
        !           361:            }
        !           362:        }
        !           363: #endif UCI
        !           364: 
        !           365:     for (msgnum = 0; msgnum < msgp; msgnum++)
        !           366:        if (stat (msgs[msgnum], &st) == NOTOK)
        !           367:            adios (msgs[msgnum], "unable to stat draft file");
        !           368: 
        !           369:     if ((annotext = getenv ("mhannotate")) == NULL || *annotext == NULL)
        !           370:        annotext = NULL;
        !           371:     if (annotext
        !           372:            && ((altmsg = getenv ("mhaltmsg")) == NULL || *altmsg == NULL))
        !           373:        altmsg = NULL;
        !           374:     if (annotext && ((cp = getenv ("mhinplace")) != NULL && *cp != NULL))
        !           375:        inplace = atoi (cp);
        !           376: 
        !           377:     if ((cp = getenv ("mhdist"))
        !           378:            && *cp
        !           379:            && (distsw = atoi (cp))
        !           380:            && altmsg) {
        !           381:        vec[vecp++] = "-dist";
        !           382:        distfile = getcpy (m_scratch (altmsg, invo_name));
        !           383:        if (link (altmsg, distfile) == NOTOK)
        !           384:            adios (distfile, "unable to link %s to", altmsg);
        !           385:     }
        !           386:     else
        !           387:        distfile = NULL;
        !           388: 
        !           389:     if (altmsg == NULL || stat (altmsg, &st) == NOTOK)
        !           390:        st.st_mtime = 0, st.st_dev = 0, st.st_ino = 0;
        !           391:     if (pushsw)
        !           392:        push ();
        !           393: 
        !           394:     status = 0;
        !           395:     vec[0] = r1bindex (postproc, '/');
        !           396:     closefds (3);
        !           397: 
        !           398:     for (msgnum = 0; msgnum < msgp; msgnum++)
        !           399:        switch (sendsbr (vec, vecp, msgs[msgnum], &st)) {
        !           400:            case DONE: 
        !           401:                done (++status);
        !           402: 
        !           403:            case NOTOK: 
        !           404:                status++;       /* fall */
        !           405:            case OK:
        !           406:                break;
        !           407:        }
        !           408: 
        !           409:     m_update ();
        !           410: 
        !           411:     done (status);
        !           412: }

unix.superglobalmegacorp.com

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