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: }

Defined functions

frombreak defined in line 155; used 3 times
main defined in line 41; never used
type defined in line 134; used 2 times

Defined variables

SccsId defined in line 6; never used

Defined macros

A defined in line 30; used 2 times
B defined in line 31; used 1 times
  • in line 79
BFSZ defined in line 26; used 4 times
BLANK defined in line 20; never used
EOT defined in line 28; used 2 times
FROM defined in line 18; used 4 times
NLIN defined in line 19; used 3 times
OTHER defined in line 21; used 3 times
READING defined in line 24; used 1 times
  • in line 85
RNEWS defined in line 34; used 1 times
  • in line 99
SKIPPING defined in line 23; used 2 times
Last modified: 1986-01-20
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1541
Valid CSS Valid XHTML 1.0 Strict