Annotation of 43BSDReno/contrib/mh/uip/sendsbr.c, revision 1.1.1.1

1.1       root        1: /* sendsbr.c - routines to help WhatNow/Send along */
                      2: 
                      3: #include "../h/mh.h"
                      4: #include <setjmp.h>
                      5: #include <stdio.h>
                      6: #include <signal.h>
                      7: #include <sys/types.h>
                      8: #include <sys/stat.h>
                      9: 
                     10: /*  */
                     11: 
                     12: int     debugsw = 0;           /* global */
                     13: int     forwsw = 1;
                     14: int     inplace = 0;
                     15: int     pushsw = 0;
                     16: int     unique = 0;
                     17: 
                     18: char   *altmsg = NULL;         /*  .. */
                     19: char   *annotext = NULL;
                     20: char   *distfile = NULL;
                     21: 
                     22: 
                     23: static int armed = 0;
                     24: static jmp_buf env;
                     25: 
                     26: 
                     27: char   *getusr();
                     28: long   lseek();
                     29: 
                     30: static void alert(), anno(), annoaux();
                     31: void senddone();
                     32: static int tmp_fd();
                     33: 
                     34: /*  */
                     35: 
                     36: sendsbr(vec, vecp, drft, st)
                     37:        register char **vec, *drft;
                     38:        int vecp;
                     39:        register struct stat *st;
                     40: {
                     41:     int     status;
                     42: 
                     43:     armed++;
                     44:     switch (setjmp (env)) {
                     45:        case OK:
                     46:            status = sendaux (vec, vecp, drft, st) ? NOTOK : OK;
                     47:            break;
                     48: 
                     49:        default:
                     50:            status = DONE;
                     51:            break;
                     52:     }
                     53:     armed = 0;
                     54:     if (distfile)
                     55:        (void) unlink (distfile);
                     56: 
                     57:     return status;
                     58: }
                     59: 
                     60: /*  */
                     61: 
                     62: sendaux(vec, vecp, drft, st)
                     63:        register char **vec, *drft;
                     64:        int vecp;
                     65:        register struct stat *st;
                     66: {
                     67:     int     child_id,
                     68:             i,
                     69:            status,
                     70:             fd,
                     71:             fd2;
                     72:     char    backup[BUFSIZ],
                     73:             buf[BUFSIZ],
                     74:             file[BUFSIZ];
                     75: 
                     76:     fd = pushsw ? tmp_fd () : NOTOK;
                     77:     fd2 = NOTOK;
                     78: 
                     79:     if (pushsw && unique) {
                     80:        if (rename (drft, strcpy (file, m_scratch (drft, invo_name)))
                     81:                == NOTOK)
                     82:            adios (file, "unable to rename %s to", drft);
                     83:        drft = file;
                     84:     }
                     85:     vec[vecp++] = drft;
                     86:     if (annotext)
                     87:        if ((fd2 = tmp_fd ()) != NOTOK) {
                     88:            vec[vecp++] = "-idanno";
                     89:            (void) sprintf (buf, "%d", fd2);
                     90:            vec[vecp++] = buf;
                     91:        }
                     92:        else
                     93:            admonish (NULLCP, "unable to create file for annotation list");
                     94:     if (distfile && distout (drft, distfile, backup) == NOTOK)
                     95:        senddone (1);
                     96:     vec[vecp] = NULL;
                     97: 
                     98:     for (i = 0; (child_id = vfork ()) == NOTOK && i < 5; i++)
                     99:        sleep (5);
                    100:     switch (child_id) {
                    101:        case NOTOK:             /* oops */
                    102:            adios ("fork", "unable to");
                    103: 
                    104:        case OK:                /* send it */
                    105:            if (fd != NOTOK) {
                    106:                (void) dup2 (fd, fileno (stdout));
                    107:                (void) dup2 (fd, fileno (stderr));
                    108:                (void) close (fd);
                    109:            }
                    110:            execvp (postproc, vec);
                    111:            fprintf (stderr, "unable to exec ");
                    112:            perror (postproc);
                    113:            _exit (-1);
                    114: 
                    115:        default:                /* wait for it */
                    116:            if ((status = pidwait (child_id, NOTOK)) == 0) {
                    117:                if (annotext && fd2 != NOTOK)
                    118:                    anno (fd2, st);
                    119:                if (rename (drft, strcpy (buf, m_backup (drft))) == NOTOK)
                    120:                    advise (buf, "unable to rename %s to", drft);
                    121:            }
                    122:            else {
                    123:                if (fd != NOTOK) {
                    124:                    alert (drft, fd);
                    125:                    (void) close (fd);
                    126:                }
                    127:                else
                    128:                    advise (NULLCP, "message not delivered to anyone");
                    129:                if (fd2 != NOTOK)
                    130:                    (void) close (fd2);
                    131:                if (distfile) {
                    132:                    (void) unlink (drft);
                    133:                    if (rename (backup, drft) == NOTOK)
                    134:                        advise (drft, "unable to rename %s to", backup);
                    135:                }
                    136:            }
                    137:            break;
                    138:     }
                    139: 
                    140:     return status;
                    141: }
                    142: 
                    143: /*  */
                    144: 
                    145: static void
                    146: alert(file, out)
                    147:        register char *file;
                    148:        int out;
                    149: {
                    150:     int     child_id,
                    151:             i,
                    152:             in;
                    153:     char    buf[BUFSIZ];
                    154: 
                    155:     for (i = 0; (child_id = fork ()) == NOTOK && i < 5; i++)
                    156:        sleep (5);
                    157:     switch (child_id) {
                    158:        case NOTOK:             /* oops */
                    159:            advise ("fork", "unable to");
                    160: 
                    161:        case OK:                /* send it */
                    162:            (void) signal (SIGHUP, SIG_IGN);
                    163:            (void) signal (SIGINT, SIG_IGN);
                    164:            (void) signal (SIGQUIT, SIG_IGN);
                    165:            (void) signal (SIGTERM, SIG_IGN);
                    166:            if (forwsw)
                    167:                if ((in = open (file, 0)) == NOTOK)
                    168:                    admonish (file, "unable to re-open");
                    169:                else {
                    170:                    (void) lseek (out, 0L, 2);
                    171:                    (void) strcpy (buf, "\nMessage not delivered to anyone.\n");
                    172:                    (void) write (out, buf, strlen (buf));
                    173:                    (void) strcpy (buf, "\n------- Unsent Draft\n\n");
                    174:                    (void) write (out, buf, strlen (buf));
                    175:                    cpydgst (in, out, file, "temporary file");
                    176:                    (void) close (in);
                    177:                    (void) strcpy (buf, "\n------- End of Unsent Draft\n");
                    178:                    (void) write (out, buf, strlen (buf));
                    179:                    if (rename (file, strcpy (buf, m_backup (file))) == NOTOK)
                    180:                        admonish (buf, "unable to rename %s to", file);
                    181:                }
                    182:            (void) lseek (out, 0L, 0);
                    183:            (void) dup2 (out, fileno (stdin));
                    184:            (void) close (out);
                    185:            (void) sprintf (buf, "send failed on %s",
                    186:                        forwsw ? "enclosed draft" : file);
                    187: 
                    188:            execlp (mailproc, r1bindex (mailproc, '/'), getusr (),
                    189:                    "-subject", buf, NULLCP);
                    190:            fprintf (stderr, "unable to exec ");
                    191:            perror (mailproc);
                    192:            _exit (-1);
                    193: 
                    194:        default:                /* no waiting... */
                    195:            break;
                    196:     }
                    197: }
                    198: 
                    199: /*  */
                    200: 
                    201: static int
                    202: tmp_fd()
                    203: {
                    204:     int     fd;
                    205:     char    tmpfil[BUFSIZ];
                    206: 
                    207:     (void) strcpy (tmpfil, m_tmpfil (invo_name));
                    208:     if ((fd = creat (tmpfil, 0600)) == NOTOK)
                    209:        return NOTOK;
                    210:     (void) close (fd);
                    211: 
                    212:     if ((fd = open (tmpfil, 2)) == NOTOK)
                    213:        return NOTOK;
                    214:     if (debugsw)
                    215:        advise (NULLCP, "temporary file %s selected", tmpfil);
                    216:     else
                    217:        if (unlink (tmpfil) == NOTOK)
                    218:            advise (tmpfil, "unable to remove");
                    219: 
                    220:     return fd;
                    221: }
                    222: 
                    223: /*  */
                    224: 
                    225: static void
                    226: anno(fd, st)
                    227:        int fd;
                    228:        register struct stat *st;
                    229: {
                    230:     int     child_id;
                    231:     SIGDECL (*hstat)(), (*istat)(), (*qstat)(), (*tstat)();
                    232:     static char *cwd = NULL;
                    233:     struct stat st2;
                    234: 
                    235:     if (altmsg &&
                    236:            (stat (altmsg, &st2) == NOTOK
                    237:                || st -> st_mtime != st2.st_mtime
                    238:                || st -> st_dev != st2.st_dev
                    239:                || st -> st_ino != st2.st_ino)) {
                    240:        if (debugsw)
                    241:            admonish (NULLCP, "$mhaltmsg mismatch");
                    242:        return;
                    243:     }
                    244: 
                    245:     child_id = debugsw ? NOTOK : fork ();
                    246:     switch (child_id) {
                    247:        case NOTOK:             /* oops */
                    248:            if (!debugsw)
                    249:                advise (NULLCP,
                    250:                            "unable to fork, so doing annotations by hand...");
                    251:            if (cwd == NULL)
                    252:                cwd = getcpy (pwd ());
                    253: 
                    254:        case OK:
                    255:            hstat = signal (SIGHUP, SIG_IGN);
                    256:            istat = signal (SIGINT, SIG_IGN);
                    257:            qstat = signal (SIGQUIT, SIG_IGN);
                    258:            tstat = signal (SIGTERM, SIG_IGN);
                    259: 
                    260:            annoaux (fd);
                    261:            if (child_id == OK)
                    262:                _exit (0);
                    263: 
                    264:            (void) signal (SIGHUP, hstat);
                    265:            (void) signal (SIGINT, istat);
                    266:            (void) signal (SIGQUIT, qstat);
                    267:            (void) signal (SIGTERM, tstat);
                    268: 
                    269:            (void) chdir (cwd);
                    270:            break;
                    271: 
                    272:        default:                /* no waiting... */
                    273:            (void) close (fd);
                    274:            break;
                    275:     }
                    276: }
                    277: 
                    278: /*  */
                    279: 
                    280: static void
                    281: annoaux(fd)
                    282:        int fd;
                    283: {
                    284:     int            fd2,
                    285:            fd3,
                    286:            msgnum;
                    287:     char   *cp,
                    288:           *folder,
                    289:           *maildir,
                    290:             buffer[BUFSIZ],
                    291:           **ap;
                    292:     FILE   *fp;
                    293:     struct msgs *mp;
                    294: 
                    295:     if ((folder = getenv ("mhfolder")) == NULL || *folder == NULL) {
                    296:        if (debugsw)
                    297:            admonish (NULLCP, "$mhfolder not set");
                    298:        return;
                    299:     }
                    300:     maildir = m_maildir (folder);
                    301:     if (chdir (maildir) == NOTOK) {
                    302:        if (debugsw)
                    303:            admonish (maildir, "unable to change directory to");
                    304:        return;
                    305:     }
                    306:     if (!(mp = m_gmsg (folder))) {
                    307:        if (debugsw)
                    308:            admonish (NULLCP, "unable to read folder %s");
                    309:        return;
                    310:     }
                    311:     if (mp -> hghmsg == 0) {
                    312:        if (debugsw)
                    313:            admonish (NULLCP, "no messages in %s", folder);
                    314:        goto oops;
                    315:     }
                    316: 
                    317:     if ((cp = getenv ("mhmessages")) == NULL || *cp == NULL) {
                    318:        if (debugsw)
                    319:            admonish (NULLCP, "$mhmessages not set");
                    320:        goto oops;
                    321:     }
                    322:     if (!debugsw                       /* MOBY HACK... */
                    323:            && pushsw
                    324:            && (fd3 = open ("/dev/null", 2)) != NOTOK
                    325:            && (fd2 = dup (fileno (stderr))) != NOTOK) {
                    326:        (void) dup2 (fd3, fileno (stderr));
                    327:        (void) close (fd3);
                    328:     }
                    329:     else
                    330:        fd2 = NOTOK;
                    331:     for (ap = brkstring (cp = getcpy (cp), " ", NULLCP); *ap; ap++)
                    332:        (void) m_convert (mp, *ap);
                    333:     free (cp);
                    334:     if (fd2 != NOTOK)
                    335:        (void) dup2 (fd2, fileno (stderr));
                    336:     if (mp -> numsel == 0) {
                    337:        if (debugsw)
                    338:            admonish (NULLCP, "no messages to annotate");
                    339:        goto oops;
                    340:     }
                    341: 
                    342:     (void) lseek (fd, 0L, 0);
                    343:     if ((fp = fdopen (fd, "r")) == NULL) {
                    344:        if (debugsw)
                    345:            admonish (NULLCP, "unable to fdopen annotation list");
                    346:        goto oops;
                    347:     }
                    348:     cp = NULL;
                    349:     while (fgets (buffer, sizeof buffer, fp) != NULL)
                    350:        cp = add (buffer, cp);
                    351:     (void) fclose (fp);
                    352: 
                    353:     if (debugsw)
                    354:        advise (NULLCP, "annotate%s with %s: \"%s\"",
                    355:                inplace ? " inplace" : "", annotext, cp);
                    356:     for (msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++)
                    357:        if (mp -> msgstats[msgnum] & SELECTED) {
                    358:            if (debugsw)
                    359:                advise (NULLCP, "annotate message %d", msgnum);
                    360:            (void) annotate (m_name (msgnum), annotext, cp, inplace);
                    361:        }
                    362: 
                    363:     free (cp);
                    364: 
                    365: oops: ;
                    366:     m_fmsg (mp);
                    367: }
                    368: 
                    369: /*  */
                    370: 
                    371: void
                    372: senddone(status)
                    373:        int status;
                    374: {
                    375:     if (armed)
                    376:        longjmp (env, status ? status : NOTOK);
                    377: 
                    378:     exit (status);
                    379: }

unix.superglobalmegacorp.com

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