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