|
|
1.1 ! root 1: /* ! 2: * uurec - receive articles via /bin/mail. ! 3: */ ! 4: ! 5: #ifdef SCCSID ! 6: static char *SccsId = "@(#)uurec.c 2.11 3/21/87"; ! 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", logdir(HOME), RNEWS); ! 97: #else ! 98: pbfr = RNEWS; ! 99: #endif ! 100: if ((pipe = popen(pbfr, "w")) == NULL) { ! 101: perror("uurec: popen failed"); ! 102: exit(1); ! 103: } ! 104: } ! 105: if (format == A) { ! 106: if (++pathcnt == 3) ! 107: fputs(fbuf, pipe); ! 108: fputs(buf+1, pipe); ! 109: } else { ! 110: if (!pathcnt && (!strncmp(buf+1, "From: ", 6) || !strncmp(buf+1, "From ", 5))) { ! 111: pathcnt++; ! 112: fprintf(pipe, "From: %s", fbuf); ! 113: sscanf(buf, "%s %[^\n]", fbuf, fbuf); ! 114: fprintf(pipe, "%s\n", fbuf); ! 115: } else ! 116: fputs(buf+1, pipe); ! 117: } ! 118: break; ! 119: ! 120: case OTHER | SKIPPING: ! 121: break; ! 122: ! 123: case OTHER | READING: ! 124: pclose(pipe); ! 125: mode = SKIPPING; ! 126: } ! 127: } ! 128: if (pipe && pipe != stdout) ! 129: pclose(pipe); ! 130: exit(0); ! 131: } ! 132: ! 133: type(p) ! 134: register char *p; ! 135: { ! 136: while (*p == ' ' || *p == '?') ! 137: ++p; ! 138: ! 139: if (*p == 'N') ! 140: return (NLIN); ! 141: ! 142: if (strncmp(p, ">From ", 6) == 0) ! 143: return (FROM); ! 144: ! 145: if (strncmp(p, "From ", 5) == 0) ! 146: return (FROM); ! 147: ! 148: return(OTHER); ! 149: } ! 150: ! 151: /* ! 152: * Get the system name out of a from line. ! 153: */ ! 154: char * ! 155: frombreak(buf, fbuf) ! 156: register char *buf, *fbuf; ! 157: { ! 158: register char *p; ! 159: ! 160: /* break the line into tokens. */ ! 161: p = fbuf; ! 162: while (*++p != '\0') ! 163: switch (*p) { ! 164: case '\n': ! 165: case '\t': ! 166: case ' ': ! 167: *p = '\0'; ! 168: break; ! 169: case EOT: ! 170: goto garbled; ! 171: default:; ! 172: } ! 173: *++p = EOT; ! 174: *++p = '\0'; ! 175: ! 176: for (p=fbuf; *p != EOT || p[1] != '\0'; p += strlen(p)+1) { ! 177: if (strcmp(p, "forwarded") == 0) ! 178: return(buf); ! 179: if (strcmp(p, "remote") == 0) { ! 180: p += strlen(p)+1; ! 181: if (strcmp(p, "from") == 0) { ! 182: p += strlen(p)+1; ! 183: strcpy(buf, p); ! 184: strcat(buf, "!"); ! 185: return(buf+strlen(buf)); ! 186: } ! 187: } ! 188: } ! 189: garbled: ! 190: strcat(buf, "???!"); ! 191: return(buf+4); ! 192: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.