|
|
1.1 root 1: #include <stdio.h>
2: #include <ctype.h>
3: #include <regexp.h>
4: #include "mail.h"
5: #include "string.h"
6: #include "header.h"
7: #include "aux.h"
8: #include "addrformat.h"
9:
10: /* imports */
11: header hdrs[] = {
12: HEADER("Date:"),
13: HEADER("From:"),
14: HEADER("To:"),
15: HEADER("")
16: };
17: #define datehdr hdrs[0]
18: #define fromhdr hdrs[1]
19: #define tohdr hdrs[2]
20:
21: /* imported */
22: extern int getheader();
23: extern int printheaders();
24: extern void printbodies();
25: extern char *fgets();
26: extern string *getaddr();
27: extern int cistrncmp();
28: extern void exit();
29: extern int debug;
30:
31: /* predeclared */
32: static char *convertdate();
33: extern char *convertaddr();
34: static int indomain();
35:
36: /* exported */
37: int extrafrom = 0;
38:
39: extern int
40: to822(fputsp, in, out, sender, domain, rcvr)
41: int (*fputsp)();
42: FILE *in, *out; /* file to output to */
43: char *sender; /* name of sender (already in 822 format) */
44: char *domain;
45: char *rcvr;
46: {
47: string *buf=s_new();
48: string *from=s_new();
49: string *date=s_new();
50: string *remfrom=s_new();
51: string *faddr;
52: static regexp *pp=NULL;
53: int originalfrom=0;
54: regsubexp subexp[10];
55: char xbuf[4096];
56: int n;
57: char *cp;
58:
59: /* get UNIX from line */
60: if(fgets(xbuf, sizeof xbuf, in)==NULL) {
61: fprintf(stderr, "to822: empty file.\n");
62: return -1;
63: }
64:
65: /* first line had better be a from */
66: if (pp==NULL)
67: pp = regcomp(REMFROMRE);
68: if (regexec(pp, xbuf, subexp, 10)) {
69: append_match(subexp, from, REMSENDERMATCH);
70: append_match(subexp, date, REMDATEMATCH);
71: append_match(subexp, remfrom, REMSYSMATCH);
72: } else {
73: fprintf(stderr, "to822: From_ line missing or malformed.\n");
74: return -1;
75: }
76:
77: /* get any pre-existing RFC822 header lines */
78: if(getheader(fgets, in)<0){
79: fprintf(stderr, "to822: error reading input.\n");
80: return -1;
81: }
82:
83: /*
84: * Output new message. If there is an original From: line with
85: * an address in the requested domain, leave it alone. Otherwise
86: * generate a From: line and turn any existing one into
87: * Original-From:
88: */
89: if (fromhdr.line != NULL) {
90: faddr = getaddr(HCONTENT(fromhdr));
91: if(domain!=NULL && !indomain(s_to_c(faddr), domain)){
92: sprintf(xbuf, "%s %s\n", fromhdr.name, sender);
93: (*fputsp)(xbuf, out);
94: originalfrom = 1;
95: }
96: } else {
97: sprintf(xbuf, "%s %s\n", fromhdr.name, sender);
98: (*fputsp)(xbuf, out);
99: }
100: if (datehdr.line == NULL){
101: sprintf(xbuf, "%s %s\n", datehdr.name, convertdate((s_to_c(date))));
102: (*fputsp)(xbuf, out);
103: }
104: if (tohdr.line == NULL && rcvr != NULL){
105: sprintf(xbuf, "%s %s\n", tohdr.name, rcvr);
106: (*fputsp)(xbuf, out);
107: }
108:
109: printheaders(fputsp, out, originalfrom);
110: (*fputsp)("\n", out);
111: printbodies(fputsp, out);
112: n = 0;
113: while (fgets(xbuf, sizeof(xbuf), in)!=NULL) {
114: (*fputsp)(xbuf, out);
115: n += strlen(xbuf)+1;
116: if (n>1024) {
117: if (debug)
118: fprintf(stderr, ".");
119: n -= 1024;
120: setalarm(5 * 60, "sending mail data");
121: }
122: }
123: s_free(from);
124: s_free(date);
125:
126: if(ferror(in))
127: return -1;
128:
129: return 0;
130: }
131:
132: /* juggle date fields
133: Unix ctime: Mon Oct 19 19:47:25 EDT 1987
134: 822 standard: [Mon, ] 19 Oct 87 19:47:25 EDT
135: (sometimes the , is omitted; sometimes (Mon) at end)
136: */
137: static char *
138: convertdate(date)
139: char *date;
140: {
141: static string *ndate=NULL;
142: char *field[6];
143: char *sp;
144: int i;
145:
146: sp = date;
147: /* parse the date into fields */
148: for (i = 0; i < 6; i++) {
149: while (isspace(*sp) || *sp == ',' || *sp == '-')
150: *sp++ = '\0';
151: field[i] = sp;
152: while (!isspace(*sp) && *sp != ',' && *sp != '-' && *sp != '\0')
153: sp++;
154: }
155: *sp = '\0';
156: if (strlen(field[5])==4)
157: field[5] += 2;
158:
159: /* shuffle the fields into internet format */
160: if (ndate==NULL)
161: ndate = s_new();
162: s_restart(ndate);
163: s_append(ndate, field[0]);
164: s_append(ndate, ", ");
165: s_append(ndate, field[2]);
166: s_append(ndate, " ");
167: s_append(ndate, field[1]);
168: s_append(ndate, " ");
169: s_append(ndate, field[5]);
170: s_append(ndate, " ");
171: s_append(ndate, field[3]);
172: s_append(ndate, " ");
173: s_append(ndate, field[4]);
174: return s_to_c(ndate);
175: }
176:
177: /*
178: * return true if addr belongs to domain
179: */
180: static int
181: indomain(addr, domain)
182: char *addr;
183: char *domain;
184: {
185: int n, m;
186: int punct;
187:
188: n = strlen(domain);
189: m = strlen(addr);
190: if(m<n)
191: return 0;
192: punct = *(addr+m-n);
193: if(punct!='@' && punct!='.')
194: return 0;
195: return(cistrncmp(addr+m-n+1, domain+1, n-1)==0);
196: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.