Annotation of 43BSD/contrib/mh/uip/distsbr.c, revision 1.1.1.1

1.1       root        1: /* distsbr.c - routines to do additional "dist-style" processing */
                      2: 
                      3: #include "../h/mh.h"
                      4: #include <ctype.h>
                      5: #include <stdio.h>
                      6: 
                      7: 
                      8: static int  hdrfd = NOTOK;
                      9: static int  txtfd = NOTOK;
                     10: 
                     11: 
                     12: long   lseek ();
                     13: 
                     14: /*  */
                     15: 
                     16: #define        BADHDR  "please re-edit %s to remove the ``%s'' header!"
                     17: #define        BADTXT  "please re-edit %s to consist of headers only!"
                     18: #define        BADMSG  "please re-edit %s to include a ``Resent-To:''!"
                     19: #define        BADRFT  "please re-edit %s and fix that header!"
                     20: 
                     21: int    distout (drft, msgnam, backup)
                     22: register char   *drft,
                     23:        *msgnam,
                     24:        *backup;
                     25: {
                     26:     int     state;
                     27:     register char  *dp,
                     28:                    *resent;
                     29:     char    name[NAMESZ],
                     30:             buffer[BUFSIZ];
                     31:     register    FILE *ifp,
                     32:                     *ofp;
                     33: 
                     34:     if (rename (drft, strcpy (backup, m_backup (drft))) == NOTOK)
                     35:        adios (backup, "unable to rename %s to",drft);
                     36:     if ((ifp = fopen (backup, "r")) == NULL)
                     37:        adios (backup, "unable to read");
                     38: 
                     39:     if ((ofp = fopen (drft, "w")) == NULL)
                     40:        adios (drft, "unable to create temporary file");
                     41:     (void) chmod (drft, m_gmprot ());
                     42: 
                     43:     ready_msg (msgnam);
                     44:     (void) lseek (hdrfd, 0L, 0);       /* msgnam not accurate */
                     45:     cpydata (hdrfd, fileno (ofp), msgnam, drft);
                     46: 
                     47: /*  */
                     48: 
                     49:     for (state = FLD, resent = NULL;;)
                     50:        switch (state =
                     51:                m_getfld (state, name, buffer, sizeof buffer, ifp)) {
                     52:            case FLD: 
                     53:            case FLDPLUS: 
                     54:            case FLDEOF: 
                     55:                if (uprf (name, "distribute-"))
                     56:                    (void) sprintf (name, "%s%s", "Resent", &name[10]);
                     57:                if (uprf (name, "distribution-"))
                     58:                    (void) sprintf (name, "%s%s", "Resent", &name[12]);
                     59:                if (!uprf (name, "resent")) {
                     60:                    advise (NULLCP, BADHDR, "draft", name);
                     61:                    goto leave_bad;
                     62:                }
                     63:                if (state == FLD)
                     64:                    resent = add (":", add (name, resent));
                     65:                resent = add (buffer, resent);
                     66:                fprintf (ofp, "%s: %s", name, buffer);
                     67:                while (state == FLDPLUS) {
                     68:                    state = m_getfld (state, name,
                     69:                            buffer, sizeof buffer, ifp);
                     70:                    resent = add (buffer, resent);
                     71:                    fputs (buffer, ofp);
                     72:                }
                     73:                if (state == FLDEOF)
                     74:                    goto process;
                     75:                break;
                     76: 
                     77:            case BODY: 
                     78:            case BODYEOF: 
                     79:                for (dp = buffer; *dp; dp++)
                     80:                    if (!isspace (*dp)) {
                     81:                        advise (NULLCP, BADTXT, "draft");
                     82:                        goto leave_bad;
                     83:                    }
                     84: 
                     85:            case FILEEOF: 
                     86:                goto process;
                     87: 
                     88:            case LENERR: 
                     89:            case FMTERR: 
                     90:                advise (NULLCP, BADRFT, "draft");
                     91:        leave_bad: ;
                     92:                (void) fclose (ifp);
                     93:                (void) fclose (ofp);
                     94:                (void) unlink (drft);
                     95:                if (rename (backup, drft) == NOTOK)
                     96:                    adios (drft, "unable to rename %s to", backup);
                     97:                return NOTOK;
                     98: 
                     99:            default: 
                    100:                adios (NULLCP, "getfld() returned %d", state);
                    101:        }
                    102: process: ;
                    103:     (void) fclose (ifp);
                    104:     (void) fflush (ofp);
                    105: 
                    106: /*  */
                    107: 
                    108:     if (!resent) {
                    109:        advise (NULLCP, BADMSG, "draft");
                    110:        (void) fclose (ofp);
                    111:        (void) unlink (drft);
                    112:        if (rename (backup, drft) == NOTOK)
                    113:            adios (drft, "unable to rename %s to", backup);
                    114:        return NOTOK;
                    115:     }
                    116:     free (resent);
                    117: 
                    118:     if (txtfd != NOTOK) {
                    119:        (void) lseek (txtfd, 0L, 0);    /* msgnam not accurate */
                    120:        cpydata (txtfd, fileno (ofp), msgnam, drft);
                    121:     }
                    122: 
                    123:     (void) fclose (ofp);
                    124: 
                    125:     return OK;
                    126: }
                    127: 
                    128: /*  */
                    129: 
                    130: static ready_msg (msgnam)
                    131: register char   *msgnam;
                    132: {
                    133:     int     state,
                    134:             out;
                    135:     char    name[NAMESZ],
                    136:             buffer[BUFSIZ],
                    137:             tmpfil[BUFSIZ];
                    138:     register    FILE *ifp,
                    139:                     *ofp;
                    140: 
                    141:     if (hdrfd != NOTOK)
                    142:        (void) close (hdrfd), hdrfd = NOTOK;
                    143:     if (txtfd != NOTOK)
                    144:        (void) close (txtfd), txtfd = NOTOK;
                    145: 
                    146:     if ((ifp = fopen (msgnam, "r")) == NULL)
                    147:        adios (msgnam, "unable to open message");
                    148: 
                    149:     (void) strcpy (tmpfil, m_tmpfil ("dist"));
                    150:     if ((hdrfd = creat (tmpfil, 0600)) == NOTOK)
                    151:        adios (tmpfil, "unable to create temporary file");
                    152:     (void) close (hdrfd);
                    153:     if ((hdrfd = open (tmpfil, 2)) == NOTOK)
                    154:        adios (tmpfil, "unable to re-open temporary file");
                    155:     if ((out = dup (hdrfd)) == NOTOK
                    156:            || (ofp = fdopen (out, "w")) == NULL)
                    157:        adios (NULLCP, "no file descriptors -- you lose big");
                    158:     (void) unlink (tmpfil);
                    159: 
                    160: /*  */
                    161: 
                    162:     for (state = FLD;;)
                    163:        switch (state =
                    164:                m_getfld (state, name, buffer, sizeof buffer, ifp)) {
                    165:            case FLD: 
                    166:            case FLDPLUS: 
                    167:            case FLDEOF: 
                    168:                if (uprf (name, "resent"))
                    169:                    fprintf (ofp, "Prev-");
                    170:                fprintf (ofp, "%s: %s", name, buffer);
                    171:                while (state == FLDPLUS) {
                    172:                    state = m_getfld (state, name,
                    173:                            buffer, sizeof buffer, ifp);
                    174:                    fputs (buffer, ofp);
                    175:                }
                    176:                if (state == FLDEOF)
                    177:                    goto process;
                    178:                break;
                    179: 
                    180:            case BODY: 
                    181:            case BODYEOF: 
                    182:                (void) fclose (ofp);
                    183: 
                    184:                (void) strcpy (tmpfil, m_tmpfil ("dist"));
                    185:                if ((txtfd = creat (tmpfil, 0600)) == NOTOK)
                    186:                    adios (tmpfil, "unable to create temporary file");
                    187:                (void) close (txtfd);
                    188:                if ((txtfd = open (tmpfil, 2)) == NOTOK)
                    189:                    adios (tmpfil, "unable to re-open temporary file");
                    190:                if ((out = dup (txtfd)) == NOTOK
                    191:                        || (ofp = fdopen (out, "w")) == NULL)
                    192:                    adios (NULLCP, "no file descriptors -- you lose big");
                    193:                (void) unlink (tmpfil);
                    194:                fprintf (ofp, "\n%s", buffer);
                    195:                while (state == BODY) {
                    196:                    state = m_getfld (state, name,
                    197:                            buffer, sizeof buffer, ifp);
                    198:                    fputs (buffer, ofp);
                    199:                }
                    200:            case FILEEOF: 
                    201:                goto process;
                    202: 
                    203:            case LENERR: 
                    204:            case FMTERR: 
                    205:                adios (NULLCP, "format error in message %s", msgnam);
                    206: 
                    207:            default: 
                    208:                adios (NULLCP, "getfld() returned %d", state);
                    209:        }
                    210: process: ;
                    211:     (void) fclose (ifp);
                    212:     (void) fclose (ofp);
                    213: }

unix.superglobalmegacorp.com

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