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