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