Annotation of 43BSD/contrib/news/src/uurec.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * uurec - receive articles via /bin/mail.
                      3:  */
                      4: 
                      5: #ifdef SCCSID
                      6: static char    *SccsId = "@(#)uurec.c  2.9     4/16/85";
                      7: #endif /* SCCSID */
                      8: 
                      9: #include "defs.h"
                     10: 
                     11: #include <stdio.h>
                     12: #include <ctype.h>
                     13: 
                     14: /*
                     15:  * Process a news article which has been shipped via /bin/mail.
                     16:  */
                     17: 
                     18: #define FROM   01
                     19: #define NLIN   02
                     20: #define BLANK  03
                     21: #define OTHER  04
                     22: 
                     23: #define SKIPPING       010
                     24: #define READING                020
                     25: 
                     26: #define BFSZ 250
                     27: 
                     28: #define EOT    '\004'
                     29: 
                     30: #define A      01
                     31: #define B      02
                     32: 
                     33: #ifdef debug
                     34: # define RNEWS "cat"
                     35: #endif
                     36: extern char    *strcat(), *strcpy();
                     37: extern char    *frombreak();
                     38: extern FILE    *popen();
                     39: 
                     40: /* ARGSUSED */
                     41: main(argc, argv)
                     42: int argc;
                     43: char **argv;
                     44: {
                     45:        char buf[BFSZ], fbuf[BFSZ];
                     46:        char bfr[BFSZ], *pbfr = bfr;
                     47:        register char *p = NULL;
                     48:        register FILE *pipe = stdout;
                     49:        register int mode, frmflg, pathcnt, format;
                     50:        char *index();
                     51: 
                     52:        mode = SKIPPING;
                     53:        frmflg = FALSE;
                     54:        while (fgets(buf, BFSZ, stdin) != NULL) {
                     55: #ifdef debug
                     56:                printf("%o\t%s", mode|type(buf), buf);
                     57: #endif
                     58:                switch (mode | type(buf)) {
                     59: 
                     60:                case FROM | SKIPPING:
                     61:                        if (frmflg)
                     62:                                p = frombreak(p, buf);
                     63:                        else
                     64:                                p = fbuf;
                     65:                        frmflg = TRUE;
                     66:                        break;
                     67: 
                     68:                case FROM | READING:
                     69:                        if (!frmflg) {
                     70:                                frmflg = TRUE;
                     71:                                p = fbuf;
                     72:                                pclose(pipe);
                     73:                        }
                     74:                        p = frombreak(p, buf);
                     75:                        break;
                     76: 
                     77:                case NLIN | SKIPPING:
                     78:                        if ((isupper(buf[1]) && index(buf, ':')) || !strncmp(buf, "From ", 5))
                     79:                                format = B;
                     80:                        else
                     81:                                format = A;
                     82: #ifdef debug
                     83:                        printf("format = %d\n", format);
                     84: #endif
                     85:                        mode = READING;
                     86: 
                     87:                case NLIN | READING:
                     88:                        if (frmflg) {
                     89:                                frmflg = FALSE;
                     90:                                --p;
                     91:                                while (p >= fbuf && *--p != '!')
                     92:                                        ;
                     93:                                *++p = '\0';
                     94:                                pathcnt = 0;
                     95: #ifdef IHCC
                     96:                                sprintf(pbfr, "%s/%s/%s", logdir(HOME),
                     97:                                                LIBDIR, "rnews");
                     98: #else
                     99:                                pbfr = RNEWS;
                    100: #endif
                    101:                                if ((pipe = popen(pbfr, "w")) == NULL) {
                    102:                                        perror("uurec: popen failed");
                    103:                                        exit(1);
                    104:                                }
                    105:                        }
                    106:                        if (format == A) {
                    107:                                if (++pathcnt == 3)
                    108:                                        fputs(fbuf, pipe);
                    109:                                fputs(buf+1, pipe);
                    110:                        } else {
                    111:                                if (!pathcnt && (!strncmp(buf+1, "From: ", 6) || !strncmp(buf+1, "From ", 5))) {
                    112:                                        pathcnt++;
                    113:                                        fprintf(pipe, "From: %s", fbuf);
                    114:                                        sscanf(buf, "%s %[^\n]", fbuf, fbuf);
                    115:                                        fprintf(pipe, "%s\n", fbuf);
                    116:                                } else
                    117:                                        fputs(buf+1, pipe);
                    118:                        }
                    119:                        break;
                    120: 
                    121:                case OTHER | SKIPPING:
                    122:                        break;
                    123: 
                    124:                case OTHER | READING:
                    125:                        pclose(pipe);
                    126:                        mode = SKIPPING;
                    127:                }
                    128:        }
                    129:        if (pipe)
                    130:                pclose(pipe);
                    131:        exit(0);
                    132: }
                    133: 
                    134: type(p)
                    135: register char *p;
                    136: {
                    137:        while (*p == ' ' || *p == '?')
                    138:                ++p;
                    139: 
                    140:        if (*p == 'N')
                    141:                return (NLIN);
                    142: 
                    143:        if (strncmp(p, ">From ", 6) == 0)
                    144:                return (FROM);
                    145: 
                    146:        if (strncmp(p, "From ", 5) == 0)
                    147:                return (FROM);
                    148: 
                    149:        return(OTHER);
                    150: }
                    151: 
                    152: /*
                    153:  * Get the system name out of a from line.
                    154:  */
                    155: char *
                    156: frombreak(buf, fbuf)
                    157: register char *buf, *fbuf;
                    158: {
                    159:        register char *p;
                    160: 
                    161:        /* break the line into tokens. */
                    162:        p = fbuf;
                    163:        while (*++p != '\0')
                    164:                switch (*p) {
                    165:                case '\n':
                    166:                case '\t':
                    167:                case ' ':
                    168:                        *p = '\0';
                    169:                        break;
                    170:                case EOT:
                    171:                        goto garbled;
                    172:                default:;
                    173:                }
                    174:        *++p = EOT;
                    175:        *++p = '\0';
                    176: 
                    177:        for (p=fbuf; *p != EOT  || p[1] != '\0'; p += strlen(p)+1) {
                    178:                if (strcmp(p, "forwarded") == 0)
                    179:                        return(buf);
                    180:                if (strcmp(p, "remote") == 0) {
                    181:                        p += strlen(p)+1;
                    182:                        if (strcmp(p, "from") == 0) {
                    183:                                p += strlen(p)+1;
                    184:                                strcpy(buf, p);
                    185:                                strcat(buf, "!");
                    186:                                return(buf+strlen(buf));
                    187:                        }
                    188:                }
                    189:        }
                    190:     garbled:
                    191:        strcat(buf, "???!");
                    192:        return(buf+4);
                    193: }

unix.superglobalmegacorp.com

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