9 date 93.08.25.17.32.12; author jromine; state Exp;
14 date 93.08.25.17.31.45; author jromine; state Exp;
25 @off_t fixes for BSD44
28 @#define MFDEBUG /* temporarily */
30 static char Id[] = "@@(#)$Id:$";
33 /* qu2uu_send.c - manager for qu --> uu */
40 extern char *qu_msgfile,
44 extern struct ll_struct *logptr;
47 struct rp_construct rp_aend = { /* end of address list */
49 'u', 'u', 'c', 'p', ' ', 'e', 'n', 'd', ' ', 'o', 'f', ' ',
50 'a', 'd', 'd', 'r', ' ', 'l', 'i', 's', 't', NULL
53 struct rp_construct rp_bhost = {/* no such host */
55 'b', 'a', 'd', ' ', 'h', 'o', 's', 't', ' ', 'n', 'a', 'm', 'e', NULL
58 struct rp_construct rp_err = { /* error, you lose */
60 'u', 'n', 'k', 'n', 'o', 'w', 'n', ' ', 'e', 'r', 'r', 'o', 'r', NULL
64 char *index (), *strdup ();
74 ll_log (logptr, LLOGBTR, "qu2uu_send ()");
77 if (rp_isbad (result = qu_pkinit ()))
79 if (rp_isbad (result = uu_sbinit ()))
82 while (rp_gval ((result = qu_rinit (info, sender))) == RP_OK) {
84 ll_log (logptr, LLOGGEN, "info=%s sender=%s", info, sender);
86 if (rp_isbad (result = qu2uu_each (sender)))
90 if (rp_gval (result) != RP_DONE) {
91 ll_log (logptr, LLOGTMP, "not DONE [%s]", rp_valstr (result));
112 ll_log (logptr, LLOGBTR, "qu2uu_each(sender='%s')", sender);
115 mf_rinit (sender, qu_fileno ());
121 if (rp_isbad (result = qu_radr (host, adr))) {
125 if (rp_gval (result) == RP_DONE) {
126 qu_wrply ((RP_Buf *) & rp_aend, rp_conlen (rp_aend));
131 switch (replyval.rp_val = uu_wtadr (host, adr)) {
134 replyval.rp_val = uu_txtcpy ();
138 ll_log (logptr, LLOGFAT, "host (%s) not in table", host);
139 blt (&rp_bhost, (char *) & replyval, sizeof rp_bhost);
143 ll_log (logptr, LLOGFAT,
144 "unknown return from uu_wtadr() [%s]",
145 rp_valstr (replyval.rp_val));
146 blt (&rp_err, (char *) & replyval, sizeof rp_err);
147 replyval.rp_val = RP_NO;
150 if (replyval.rp_val == RP_MOK)
151 switch (replyval.rp_val = uu_wttend ()) {
154 replyval.rp_line[0] = NULL;
159 ll_log (logptr, LLOGFAT, "host (%s) not in table", host);
160 blt (&rp_bhost, (char *) & replyval, sizeof rp_bhost);
161 replyval.rp_val = RP_USER;
165 ll_log (logptr, LLOGFAT,
166 "unknown return from uu_wttend() [%s]",
167 rp_valstr (replyval.rp_val));
168 blt (&rp_err, (char *) & replyval, sizeof rp_err);
173 (sizeof replyval.rp_val) + strlen (replyval.rp_line));
179 /* ******************** (mf_) MAIL-FILTERING HANDLING ******************** */
186 static char mf_from[BUFSIZ];
190 int mf_rinit (addr, fd)
201 if ((mf_fd = mf_get_msg (fd)) == NOTOK) {
202 adrxp = getadrx (addr);
203 sender = adrxp -> err ? addr
204 : lexequ (adrxp -> host, LocalName ())
205 || lexequ (adrxp -> host, SystemName ()) ? adrxp -> mbox
206 : sprintf (buffer, "%s@@%s", adrxp -> mbox, adrxp -> host);
207 while (getadrx (NULL))
209 sender = strdup (sender);
211 sprintf (mf_from, "From %s %.24s remote from %s\n",
212 sender, ctime (&timenow), SystemName ());
237 lseek (mf_fd, (off_t) pos, 0);
241 int mf_rtxt (buffer, len)
247 strcpy (buffer, mf_from);
248 buffer[*len = strlen (mf_from)] = NULL;
253 return qu_rtxt (buffer, len);
255 switch (*len = read (mf_fd, buffer, BUFSIZE)) {
270 static int mf_get_msg (md)
282 lseek (md, (off_t)0, 0);
283 if ((qd = dup (md)) == NOTOK)
286 strcpy (tmpfil, "/tmp/qu2uuXXXXXX");
287 unlink (mktemp (tmpfil));
288 if ((fd = creat (tmpfil, 0600)) == NOTOK) {
293 if ((fd = open (tmpfil, 2)) == NOTOK) {
299 if ((i = mmdf_to_uucp (qd, fd, TRUE)) != OK) {
302 sprintf (buffer, "ch_uucp(%d) filtering for %s failed (%d)\n",
303 getpid (), qu_msgfile, i);
304 if (ml_1adr (NO, NO, sitesignature, "MF Failure", supportaddr)
309 lseek (md, (off_t)0, 0);
310 if ((fd = dup (md)) == NOTOK)
311 ml_txt ("unable to dup() descriptor for message copy\n");
313 if ((fp = fdopen (fd, "r")) == NULL) {
314 ml_txt ("unable to fdopen() descriptor for message copy\n");
318 ml_txt ("\n --Message Follows--\n");
323 if (ml_end (OK) != OK) {
327 if (cp = index (buffer, '\n'))
329 ll_log (logptr, LLOGFAT, "Unable to post failure notice");
330 ll_log (logptr, LLOGFAT, "info: %s", buffer);
350 lseek (mf_fd, pos, 0);