BSD 4_3 release
[unix-history] / usr / contrib / news / src / uurec.c
CommitLineData
0f4556f1
C
1/*
2 * uurec - receive articles via /bin/mail.
3 */
4
95f51977
C
5#ifdef SCCSID
6static char *SccsId = "@(#)uurec.c 2.9 4/16/85";
7#endif /* SCCSID */
0f4556f1
C
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
36extern char *strcat(), *strcpy();
37extern char *frombreak();
38extern FILE *popen();
39
40/* ARGSUSED */
41main(argc, argv)
42int argc;
43char **argv;
44{
45 char buf[BFSZ], fbuf[BFSZ];
95f51977
C
46 char bfr[BFSZ], *pbfr = bfr;
47 register char *p = NULL;
0f4556f1
C
48 register FILE *pipe = stdout;
49 register int mode, frmflg, pathcnt, format;
95f51977 50 char *index();
0f4556f1
C
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;
95f51977
C
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) {
0f4556f1
C
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);
95f51977 114 sscanf(buf, "%s %[^\n]", fbuf, fbuf);
0f4556f1
C
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
134type(p)
135register char *p;
136{
137 while (*p == ' ' || *p == '?')
138 ++p;
139
140 if (*p == 'N')
141 return (NLIN);
142
95f51977 143 if (strncmp(p, ">From ", 6) == 0)
0f4556f1
C
144 return (FROM);
145
95f51977 146 if (strncmp(p, "From ", 5) == 0)
0f4556f1
C
147 return (FROM);
148
149 return(OTHER);
150}
151
152/*
153 * Get the system name out of a from line.
154 */
155char *
156frombreak(buf, fbuf)
157register 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}