|
|
1.1 root 1: #include <stdio.h>
2: #include <ctype.h>
3: #include "mail.h"
4: #include "header.h"
5: #include "string.h"
6:
7: /*
8: * Convert the rfc822 message on standard input into `UNIX' format
9: * and write it onto the passed FILE.
10: */
11:
12: /* header tags */
13: header hdrs[] = {
14: HEADER("Date:"),
15: HEADER("From:"),
16: HEADER("Sender:"),
17: HEADER("Received:"),
18: HEADER("Message-Id:"),
19: HEADER("Status:"),
20: HEADER("")
21: };
22: #define datehdr hdrs[0]
23: #define fromhdr hdrs[1]
24: #define senderhdr hdrs[2]
25: #define receivedhdr hdrs[3]
26: #define idhdr hdrs[4]
27: #define statushdr hdrs[5]
28: #define hideoushdr hdrs[6]
29:
30: #ifdef SILLY
31: /* silly fields */
32: header silly[] = {
33: #include "silly.name"
34: };
35: #define NSILLY sizeof(silly)/sizeof(header)
36: #endif SILLY
37:
38: /* imported */
39: extern void getheader();
40: extern void printheaders();
41: extern void addheader();
42: extern char *gets();
43: extern void putrfunix();
44:
45: /* predeclared */
46: static int getfrom();
47: static void getdate();
48: extern char *convertaddr();
49:
50: from822(netname, fp)
51: char *netname;
52: FILE *fp;
53: {
54: register int rv;
55: char from[FROMLINESIZE];
56: char date[FROMLINESIZE];
57: char line[2*FROMLINESIZE];
58:
59: getheader();
60: from[0] = date[0] = '\0';
61:
62: /* Get sender's address. If anything else is on the from line,
63: * keep it under another name. If no `From:' lineis found, use
64: * `Sender:' line.
65: */
66: if (fromhdr.line != NULL) {
67: rv = getfrom(fromhdr.line, from);
68: } else if (senderhdr.line != NULL)
69: getfrom(senderhdr.line, from);
70:
71: /* Get date line */
72: if (datehdr.line != NULL)
73: getdate(datehdr.line, date);
74:
75: /* output UNIX header */
76: if (*from != '\0' && *date != '\0')
77: putrfunix(convertaddr(from), date, netname, fp);
78:
79: /* output the rest */
80: if (rv > 0) {
81: #ifdef SILLY
82: srand(time((long *)0));
83: fprintf(fp, "%s%s", silly[nrand(NSILLY)].name, fromhdr.line);
84: #else
85: fprintf(fp, "%s%s", "Original-From: ", fromhdr.line);
86: #endif
87: }
88: if (senderhdr.line != NULL)
89: fprintf(fp, "%s%s", senderhdr.name, senderhdr.line);
90: printheaders(fp);
91: while (gets(line) != NULL)
92: fprintf(fp, "%s\n", line);
93: }
94:
95: /*
96: * The sender is either the next first whitespace delimited token or
97: * the first thing enclosed in "<" ">".
98: *
99: * Returns: 0 if a from line with only the address
100: * >0 if a from line with other cruft in it
101: */
102: static int
103: getfrom(line, sender)
104: char *line, *sender;
105: {
106: register char *lp, *sp;
107: register int comment = 0;
108: register int anticomment = 0;
109: register int inquote = 0;
110: int rv = 0;
111:
112: lp = line;
113: for (sp = sender; *lp; lp++) {
114: if (comment) {
115: if (*lp==')')
116: comment = 0;
117: continue;
118: }
119: if (anticomment) {
120: if (*lp=='>')
121: break;
122: }
123: if (inquote) {
124: if (*lp=='"')
125: inquote = 0;
126: *sp++ = *lp;
127: continue;
128: }
129: switch (*lp) {
130: case '\t':
131: case '\n':
132: break;
133: case ' ':
134: if (strncmp(lp, " at ", sizeof(" at ")-1)==0) {
135: *sp++ = '@';
136: lp += sizeof(" at ")-2;
137: }
138: break;
139: case '<':
140: rv++;
141: anticomment = 1;
142: sp = sender;
143: break;
144: case '(':
145: rv++;
146: comment = 1;
147: break;
148: case ',':
149: sp = sender;
150: break;
151: case '"':
152: inquote = 1;
153: /* fall through */
154: default:
155: *sp++ = *lp;
156: break;
157: }
158: }
159: *sp = '\0';
160: return rv;
161: }
162:
163: /*
164: * Get a date line. Convert to `UNIX' format.
165: *
166: */
167: static void
168: getdate(line, date)
169: char *line, *date;
170: {
171: register char *sp;
172:
173: sp = line + datehdr.size;
174: while (isspace(*sp) || *sp == ',' || *sp == '-')
175: sp++;
176: while (*sp != '\0' && *sp != '\n')
177: *date++ = *sp++;
178: *date = '\0';
179: }
180:
181: /*
182: * Convert from to `bang' format.
183: */
184: extern char *
185: convertaddr(from)
186: char *from;
187: {
188: static char buf[FROMLINESIZE];
189: char *sp;
190:
191: buf[0] = '\0';
192: for (sp = from + strlen(from); sp >= from; sp--) {
193: if (*sp == '.') {
194: strcat(buf, sp+1);
195: strcat(buf, "!");
196: *sp = '\0';
197: } else if (*sp == '@' || *sp == '%') {
198: strcat(buf, sp+1);
199: strcat(buf, "!");
200: *sp = '\0';
201: break;
202: }
203: }
204: if (strchr(from, '!') != NULL)
205: strcat(buf, "uucp!");
206: strcat(buf, from);
207:
208: return buf;
209: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.