|
|
1.1 root 1: #define MFDEBUG /* temporarily */
2:
3: /* qu2uu_send.c - manager for qu --> uu */
4:
5: #include "util.h"
6: #include "mmdf.h"
7:
8: /* */
9:
10: extern char *qu_msgfile,
11: sitesignature[],
12: supportaddr[];
13:
14: extern struct ll_struct *logptr;
15:
16:
17: struct rp_construct rp_aend = { /* end of address list */
18: RP_OK,
19: 'u', 'u', 'c', 'p', ' ', 'e', 'n', 'd', ' ', 'o', 'f', ' ',
20: 'a', 'd', 'd', 'r', ' ', 'l', 'i', 's', 't', NULL
21: };
22:
23: struct rp_construct rp_bhost = {/* no such host */
24: RP_USER,
25: 'b', 'a', 'd', ' ', 'h', 'o', 's', 't', ' ', 'n', 'a', 'm', 'e', NULL
26: };
27:
28: struct rp_construct rp_err = { /* error, you lose */
29: RP_NO,
30: 'u', 'n', 'k', 'n', 'o', 'w', 'n', ' ', 'e', 'r', 'r', 'o', 'r', NULL
31: };
32:
33:
34: char *index (), *strdup ();
35:
36: /* */
37:
38: qu2uu_send () {
39: short result;
40: char info[LINESIZE],
41: sender[LINESIZE];
42:
43: #ifdef DEBUG
44: ll_log (logptr, LLOGBTR, "qu2uu_send ()");
45: #endif
46:
47: if (rp_isbad (result = qu_pkinit ()))
48: return result;
49: if (rp_isbad (result = uu_sbinit ()))
50: return result;
51:
52: while (rp_gval ((result = qu_rinit (info, sender))) == RP_OK) {
53: #ifdef DEBUG
54: ll_log (logptr, LLOGGEN, "info=%s sender=%s", info, sender);
55: #endif
56: if (rp_isbad (result = qu2uu_each (sender)))
57: return result;
58: }
59:
60: if (rp_gval (result) != RP_DONE) {
61: ll_log (logptr, LLOGTMP, "not DONE [%s]", rp_valstr (result));
62: return RP_RPLY;
63: }
64:
65: qu_pkend ();
66: uu_sbend ();
67:
68: return result;
69: }
70:
71: /* */
72:
73: qu2uu_each (sender)
74: char *sender;
75: {
76: short result;
77: char adr[LINESIZE],
78: host[LINESIZE];
79: RP_Buf replyval;
80:
81: #ifdef DEBUG
82: ll_log (logptr, LLOGBTR, "qu2uu_each(sender='%s')", sender);
83: #endif
84:
85: mf_rinit (sender, qu_fileno ());
86:
87: /* */
88:
89: FOREVER
90: {
91: if (rp_isbad (result = qu_radr (host, adr))) {
92: mf_rend ();
93: return result;
94: }
95: if (rp_gval (result) == RP_DONE) {
96: qu_wrply ((RP_Buf *) & rp_aend, rp_conlen (rp_aend));
97: mf_rend ();
98: return RP_OK;
99: }
100:
101: switch (replyval.rp_val = uu_wtadr (host, adr)) {
102: case RP_OK:
103: case RP_AOK:
104: replyval.rp_val = uu_txtcpy ();
105: break;
106:
107: case RP_USER:
108: ll_log (logptr, LLOGFAT, "host (%s) not in table", host);
109: blt (&rp_bhost, (char *) & replyval, sizeof rp_bhost);
110: break;
111:
112: default:
113: ll_log (logptr, LLOGFAT,
114: "unknown return from uu_wtadr() [%s]",
115: rp_valstr (replyval.rp_val));
116: blt (&rp_err, (char *) & replyval, sizeof rp_err);
117: replyval.rp_val = RP_NO;
118: break;
119: }
120: if (replyval.rp_val == RP_MOK)
121: switch (replyval.rp_val = uu_wttend ()) {
122: case RP_OK:
123: case RP_MOK:
124: replyval.rp_line[0] = NULL;
125: break;
126:
127: case RP_USER:
128: case RP_LIO:
129: ll_log (logptr, LLOGFAT, "host (%s) not in table", host);
130: blt (&rp_bhost, (char *) & replyval, sizeof rp_bhost);
131: replyval.rp_val = RP_USER;
132: break;
133:
134: default:
135: ll_log (logptr, LLOGFAT,
136: "unknown return from uu_wttend() [%s]",
137: rp_valstr (replyval.rp_val));
138: blt (&rp_err, (char *) & replyval, sizeof rp_err);
139: break;
140: }
141:
142: qu_wrply (&replyval,
143: (sizeof replyval.rp_val) + strlen (replyval.rp_line));
144: }
145: }
146:
147: /* */
148:
149: /* ******************** (mf_) MAIL-FILTERING HANDLING ******************** */
150:
151: #include "mf.h"
152:
153:
154: static int mf_fd;
155:
156: static char mf_from[BUFSIZ];
157:
158: /* */
159:
160: int mf_rinit (addr, fd)
161: char *addr;
162: int fd;
163: {
164: long timenow;
165: char *sender,
166: buffer[BUFSIZ];
167: struct adrx *adrxp;
168:
169: mf_from[0] = NULL;
170:
171: if ((mf_fd = mf_get_msg (fd)) == NOTOK) {
172: adrxp = getadrx (addr);
173: sender = adrxp -> err ? addr
174: : lexequ (adrxp -> host, LocalName ())
175: || lexequ (adrxp -> host, SystemName ()) ? adrxp -> mbox
176: : sprintf (buffer, "%s@%s", adrxp -> mbox, adrxp -> host);
177: while (getadrx (NULL))
178: continue;
179: sender = strdup (sender);
180: lowerfy (sender);
181: sprintf (mf_from, "From %s %.24s remote from %s\n",
182: sender, ctime (&timenow), SystemName ());
183: free (sender);
184: }
185:
186: return RP_OK;
187: }
188:
189: /* */
190:
191: int mf_rend () {
192: if (mf_fd != NOTOK)
193: close (mf_fd);
194: mf_fd = NOTOK;
195: mf_from[0] = NULL;
196:
197: return RP_OK;
198: }
199:
200:
201: mf_rtinit (pos)
202: long pos;
203: {
204: if (mf_fd == NOTOK)
205: qu_rtinit (pos);
206: else
207: lseek (mf_fd, pos, 0);
208: }
209:
210:
211: int mf_rtxt (buffer, len)
212: char *buffer;
213: int *len;
214: {
215: if (mf_fd == NOTOK)
216: if (mf_from[0]) {
217: strcpy (buffer, mf_from);
218: buffer[*len = strlen (mf_from)] = NULL;
219: mf_from[0] = NULL;
220: return RP_OK;
221: }
222: else
223: return qu_rtxt (buffer, len);
224:
225: switch (*len = read (mf_fd, buffer, BUFSIZE)) {
226: case NOTOK:
227: return RP_LIO;
228:
229: case OK:
230: return RP_DONE;
231:
232: default:
233: buffer[*len] = NULL;
234: return RP_OK;
235: }
236: }
237:
238: /* */
239:
240: static int mf_get_msg (md)
241: int md;
242: {
243: int i,
244: fd,
245: qd;
246: char buffer[BUFSIZ],
247: tmpfil[BUFSIZ];
248: #ifdef MFDEBUG
249: FILE * fp;
250: #endif MFDEBUG
251:
252: lseek (md, 0L, 0);
253: if ((qd = dup (md)) == NOTOK)
254: return NOTOK;
255:
256: strcpy (tmpfil, "/tmp/qu2uuXXXXXX");
257: unlink (mktemp (tmpfil));
258: if ((fd = creat (tmpfil, 0600)) == NOTOK) {
259: close (qd);
260: return NOTOK;
261: }
262: close (fd);
263: if ((fd = open (tmpfil, 2)) == NOTOK) {
264: close (qd);
265: return NOTOK;
266: }
267: unlink (tmpfil);
268:
269: if ((i = mmdf_to_uucp (qd, fd, TRUE)) != OK) {
270: close (fd);
271:
272: sprintf (buffer, "ch_uucp(%d) filtering for %s failed (%d)\n",
273: getpid (), qu_msgfile, i);
274: if (ml_1adr (NO, NO, sitesignature, "MF Failure", supportaddr)
275: != OK)
276: goto ml_err;
277: ml_txt (buffer);
278: #ifdef MFDEBUG
279: lseek (md, 0L, 0);
280: if ((fd = dup (md)) == NOTOK)
281: ml_txt ("unable to dup() descriptor for message copy\n");
282: else
283: if ((fp = fdopen (fd, "r")) == NULL) {
284: ml_txt ("unable to fdopen() descriptor for message copy\n");
285: close (fd);
286: }
287: else {
288: ml_txt ("\n --Message Follows--\n");
289: ml_file (fp);
290: fclose (fp);
291: }
292: #endif MFDEBUG
293: if (ml_end (OK) != OK) {
294: char *cp;
295:
296: ml_err: ;
297: if (cp = index (buffer, '\n'))
298: *cp = NULL;
299: ll_log (logptr, LLOGFAT, "Unable to post failure notice");
300: ll_log (logptr, LLOGFAT, "info: %s", buffer);
301: }
302:
303: fd = NOTOK;
304: }
305: close (qd);
306:
307: return fd;
308: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.