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

1.1       root        1: /* rcvdist.c - a rcvmail program to distribute messages */
                      2: 
                      3: #include "../h/mh.h"
                      4: #include "../h/formatsbr.h"
                      5: #include "../h/rcvmail.h"
                      6: #include "../zotnet/tws.h"
                      7: #include <stdio.h>
                      8: 
                      9: /*  */
                     10: 
                     11: static struct swit switches[] = {
                     12: #define        FORMSW  0
                     13:     "form formfile",  4,
                     14: 
                     15: #define        HELPSW  1
                     16:     "help", 4,
                     17: 
                     18:     NULL, NULL
                     19: };
                     20: 
                     21: /*  */
                     22: 
                     23: static char backup[BUFSIZ] = "";
                     24: static char drft[BUFSIZ] = "";
                     25: static char tmpfil[BUFSIZ] = "";
                     26: 
                     27: static void rcvdistout(), rcvdistdone();
                     28: 
                     29: /*  */
                     30: 
                     31: /* ARGSUSED */
                     32: 
                     33: main(argc, argv)
                     34:        int argc;
                     35:        char **argv;
                     36: {
                     37:     int     i,
                     38:             child_id,
                     39:             vecp = 1;
                     40:     char   *addrs = NULL,
                     41:            *cp,
                     42:            *form = NULL,
                     43:             buf[100],
                     44:           **ap,
                     45:           **argp,
                     46:            *arguments[MAXARGS],
                     47:            *vec[MAXARGS];
                     48:     register    FILE * fp;
                     49: 
                     50:     invo_name = r1bindex (argv[0], '/');
                     51:     mts_init (invo_name);
                     52:     if ((cp = m_find (invo_name)) != NULL) {
                     53:        ap = brkstring (cp = getcpy (cp), " ", "\n");
                     54:        ap = copyip (ap, arguments);
                     55:     }
                     56:     else
                     57:        ap = arguments;
                     58:     (void) copyip (argv + 1, ap);
                     59:     argp = arguments;
                     60: 
                     61: /*  */
                     62: 
                     63:     while (cp = *argp++) {
                     64:        if (*cp == '-')
                     65:            switch (smatch (++cp, switches)) {
                     66:                case AMBIGSW:
                     67:                    ambigsw (cp, switches);
                     68:                    rcvdistdone (1);
                     69:                case UNKWNSW:
                     70:                    vec[vecp++] = --cp;
                     71:                    continue;
                     72:                case HELPSW:
                     73:                    (void) sprintf (buf,
                     74:                            "%s [switches] [switches for postproc] address ...",
                     75:                            invo_name);
                     76:                    help (buf, switches);
                     77:                    rcvdistdone (1);
                     78: 
                     79:                case FORMSW:
                     80:                    if (!(form = *argp++) || *form == '-')
                     81:                        adios (NULLCP, "missing argument to %s", argp[-2]);
                     82:                    continue;
                     83:            }
                     84:        addrs = addrs ? add (cp, add (", ", addrs)) : getcpy (cp);
                     85:     }
                     86: 
                     87: /*  */
                     88: 
                     89:     if (addrs == NULL)
                     90:        adios (NULLCP, "usage: %s [switches] [switches for postproc] address ...",
                     91:            invo_name);
                     92: 
                     93:     (void) umask (~m_gmprot ());
                     94:     (void) strcpy (tmpfil, m_tmpfil (invo_name));
                     95:     if ((fp = fopen (tmpfil, "w+")) == NULL)
                     96:        adios (tmpfil, "unable to create");
                     97:     (void) cpydata (fileno (stdin), fileno (fp), "message", tmpfil);
                     98:     (void) fseek (fp, 0L, 0);
                     99:     (void) strcpy (drft, m_tmpfil (invo_name));
                    100:     rcvdistout (fp, form, addrs);
                    101:     (void) fclose (fp);
                    102: 
                    103:     if (distout (drft, tmpfil, backup) == NOTOK)
                    104:        rcvdistdone (1);
                    105: 
                    106:     vec[0] = r1bindex (postproc, '/');
                    107:     vec[vecp++] = "-dist";
                    108:     vec[vecp++] = drft;
                    109:     vec[vecp] = NULL;
                    110: 
                    111:     for (i = 0; (child_id = fork ()) == NOTOK && i < 5; i++)
                    112:        sleep (5);
                    113:     switch (child_id) {
                    114:        case NOTOK:
                    115:            admonish (NULLCP, "unable to fork");/* fall */
                    116:        case OK:
                    117:            execvp (postproc, vec);
                    118:            fprintf (stderr, "unable to exec ");
                    119:            perror (postproc);
                    120:            _exit (1);
                    121: 
                    122:        default:
                    123:            rcvdistdone (pidXwait (child_id, postproc));
                    124:     }
                    125: /* NOTREACHED */
                    126: }
                    127: 
                    128: /*  */
                    129: 
                    130: /* very similar to routine in replsbr.c */
                    131: 
                    132: #define        SBUFSIZ 256
                    133: 
                    134: static int outputlinelen = OUTPUTLINELEN;
                    135: 
                    136: static struct format *fmt;
                    137: 
                    138: static int ncomps = 0;
                    139: static char **compbuffers = 0;
                    140: static struct comp **used_buf = 0;
                    141: 
                    142: static int dat[4];
                    143: 
                    144: 
                    145: static void
                    146: rcvdistout(inb, form, addrs)
                    147:        register FILE *inb;
                    148:        char *form, *addrs;
                    149: {
                    150:     register int    char_read = 0,
                    151:                     format_len,
                    152:                     i,
                    153:                     state;
                    154:     register char  *tmpbuf,
                    155:                   **nxtbuf;
                    156:     char   *cp,
                    157:            *scanl,
                    158:             name[NAMESZ];
                    159:     register struct comp   *cptr,
                    160:                           **savecomp;
                    161:     FILE   *out;
                    162: 
                    163:     if ((out = fopen (drft, "w")) == NULL)
                    164:        adios (drft, "unable to create");
                    165: 
                    166:     cp = new_fs (form ? form : rcvdistcomps, NULLCP, NULLCP);
                    167:     format_len = strlen (cp);
                    168:     ncomps = fmt_compile (cp, &fmt) + 1;
                    169:     nxtbuf = compbuffers = (char **) calloc ((unsigned) ncomps,
                    170:            sizeof (char *));
                    171:     if (nxtbuf == NULL)
                    172:        adios (NULLCP, "unable to allocate component buffers");
                    173:     used_buf = (struct comp **) calloc ((unsigned) (ncomps + 1),
                    174:                                sizeof (struct comp *));
                    175:     if (used_buf == NULL)
                    176:        adios (NULLCP, "unable to allocate component buffer stack");
                    177:     used_buf += ncomps + 1;
                    178:     *--used_buf = 0;
                    179:     for (i = ncomps; i--;)
                    180:        if ((*nxtbuf++ = malloc (SBUFSIZ)) == NULL)
                    181:            adios (NULLCP, "unable to allocate component buffer");
                    182: 
                    183:     nxtbuf = compbuffers;
                    184:     savecomp = used_buf;
                    185:     tmpbuf = *nxtbuf++;
                    186: 
                    187:     FINDCOMP (cptr, "addresses");
                    188:     if (cptr)
                    189:        cptr -> c_text = addrs;
                    190: 
                    191:     for (state = FLD;;) {
                    192:        switch (state = m_getfld (state, name, tmpbuf, SBUFSIZ, inb)) {
                    193:            case FLD:
                    194:            case FLDPLUS:
                    195:                if (cptr = wantcomp[CHASH (name)])
                    196:                    do {
                    197:                        if (uleq (name, cptr -> c_name)) {
                    198:                            char_read += msg_count;
                    199:                            if (!cptr -> c_text) {
                    200:                                cptr -> c_text = tmpbuf;
                    201:                                *--savecomp = cptr;
                    202:                                tmpbuf = *nxtbuf++;
                    203:                            }
                    204:                            else {
                    205:                                i = strlen (cp = cptr -> c_text) - 1;
                    206:                                if (cp[i] == '\n')
                    207:                                    if (cptr -> c_flags) {
                    208:                                        cp[i] = NULL;
                    209:                                        cp = add (",\n\t", cp);
                    210:                                    }
                    211:                                    else
                    212:                                        cp = add ("\t", cp);
                    213:                                cptr -> c_text = add (tmpbuf, cp);
                    214:                            }
                    215:                            break;
                    216:                        }
                    217:                    }
                    218:                    while (cptr = cptr -> c_next);
                    219: 
                    220:                while (state == FLDPLUS) {
                    221:                    state = m_getfld (state, name, tmpbuf, SBUFSIZ, inb);
                    222:                    cptr -> c_text = add (tmpbuf, cptr -> c_text);
                    223:                    char_read += msg_count;
                    224:                }
                    225:                break;
                    226: 
                    227:            case LENERR:
                    228:            case FMTERR:
                    229:            case BODY:
                    230:            case FILEEOF:
                    231:                goto finished;
                    232: 
                    233:            default:
                    234:                adios (NULLCP, "m_getfld() returned %d", state);
                    235:        }
                    236:     }
                    237: finished: ;
                    238: 
                    239:     i = format_len + char_read + 256;
                    240:     scanl = malloc ((unsigned) i + 2);
                    241:     dat[0] = dat[1] = dat[2] = 0;
                    242:     dat[3] = outputlinelen;
                    243:     (void) fmtscan (fmt, scanl, i, dat);
                    244:     fputs (scanl, out);
                    245: 
                    246:     if (ferror (out))
                    247:        adios (drft, "error writing");
                    248:     (void) fclose (out);
                    249: 
                    250:     free (scanl);
                    251:     while (cptr = *savecomp++)
                    252:        free (cptr -> c_text);
                    253:     free (tmpbuf);
                    254:     free ((char *) compbuffers);
                    255:     free ((char *) used_buf);
                    256: }
                    257: 
                    258: /*  */
                    259: 
                    260: static void
                    261: rcvdistdone(status)
                    262:        register int status;
                    263: {
                    264:     if (backup[0])
                    265:        (void) unlink (backup);
                    266:     if (drft[0])
                    267:        (void) unlink (drft);
                    268:     if (tmpfil[0])
                    269:        (void) unlink (tmpfil);
                    270: 
                    271:     exit (status ? RCV_MBX : RCV_MOK);
                    272: }

unix.superglobalmegacorp.com

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