|
|
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: /* imports */
8: header hdrs[] = {
9: HEADER("Date:"),
10: HEADER("From:"),
11: HEADER("To:"),
12: HEADER("Received:"),
13: HEADER("Message-Id:"),
14: HEADER("Status:"),
15: HEADER("")
16: };
17: #define datehdr hdrs[0]
18: #define fromhdr hdrs[1]
19: #define tohdr hdrs[2]
20: #define receivedhdr hdrs[3]
21: #define idhdr hdrs[4]
22: #define statushdr hdrs[5]
23:
24: /* imported */
25: extern void getheader();
26: extern void printheaders();
27: extern void addheader();
28: extern char *fgets();
29: extern int getunix();
30: extern void initgetunix();
31:
32: /* predeclared */
33: char *gets();
34: static char *convertdate();
35: extern char *convertaddr();
36:
37: extern void
38: to822(fp, hostname)
39: FILE *fp; /* file to output to */
40: char *hostname; /* name of our host */
41: {
42: char buf[FROMLINESIZE];
43: char from[FROMLINESIZE];
44: char date[DATESIZE];
45:
46: /* get UNIX from line */
47: if (fgets(buf, sizeof buf, stdin) == NULL)
48: exit(1);
49:
50: /* first line had better be a from */
51: if (getunix(buf, from, date) == 0)
52: exit(1);
53:
54: /* get any pre-existing RFC822 header lines */
55: getheader();
56:
57: /* output new message */
58: fprintf(fp, "%s %s.%s\n", fromhdr.name, convertaddr(from), hostname);
59: fprintf(fp, "%s %s\n\n", datehdr.name, convertdate(date));
60: printheaders(fp);
61: while (gets(buf) != NULL)
62: fprintf(fp, "%s\n", buf);
63: }
64:
65: /* juggle date fields */
66: static char *
67: convertdate(date)
68: char *date;
69: {
70: static char ndate[DATESIZE];
71: char *field[6];
72: char *sp;
73: int i;
74:
75: sp = date;
76: /* parse the date into fields */
77: for (i = 0; i < 6; i++) {
78: while (isspace(*sp) || *sp == ',' || *sp == '-')
79: *sp++ = '\0';
80: field[i] = sp;
81: while (!isspace(*sp) && *sp != ',' && *sp != '-' && *sp != '\0')
82: sp++;
83: }
84: *sp = '\0';
85:
86: /* shuffle the fields into internet format */
87: sprintf (ndate, "%s, %s %s %s %s %s", field[0], field[2], field[1],
88: field[4], field[5], field[3]);
89: return ndate;
90: }
91:
92: /*
93: * Convert from `bang' to `rfc822' format.
94: */
95: extern char *
96: convertaddr(addr)
97: char *addr;
98: {
99: static char buf[FROMLINESIZE];
100: register int i=0;
101: register char *sp;
102: char *field[128];
103:
104: sp = field[i] = addr;
105: while (*sp) {
106: if (*sp == '!') {
107: *sp = '\0';
108: if (strcmp(field[i], "uucp") == 0) {
109: /* the token 'uucp' stops the parsing */
110: field[i] = ++sp;
111: break;
112: }
113: field[++i] = ++sp;
114: } else
115: ++sp;
116: }
117: strcpy(buf, field[i--]);
118: if (i >= 0) {
119: strcat(buf, "@");
120: strcat(buf, field[i--]);
121: }
122: while (i >= 0) {
123: strcat(buf, ".");
124: strcat(buf, field[i--]);
125: }
126:
127: return buf;
128: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.