Mercurial > hg > Applications > mh
diff zotnet/mf/mmdfI/src/uucp/qu2uu_send.c @ 0:bce86c4163a3
Initial revision
author | kono |
---|---|
date | Mon, 18 Apr 2005 23:46:02 +0900 |
parents | |
children | 441a2190cfae |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zotnet/mf/mmdfI/src/uucp/qu2uu_send.c Mon Apr 18 23:46:02 2005 +0900 @@ -0,0 +1,311 @@ +#define MFDEBUG /* temporarily */ +#ifndef lint +static char Id[] = "@(#)$Id$"; +#endif + +/* qu2uu_send.c - manager for qu --> uu */ + +#include "util.h" +#include "mmdf.h" + +/* */ + +extern char *qu_msgfile, + sitesignature[], + supportaddr[]; + +extern struct ll_struct *logptr; + + +struct rp_construct rp_aend = { /* end of address list */ + RP_OK, + 'u', 'u', 'c', 'p', ' ', 'e', 'n', 'd', ' ', 'o', 'f', ' ', + 'a', 'd', 'd', 'r', ' ', 'l', 'i', 's', 't', NULL +}; + +struct rp_construct rp_bhost = {/* no such host */ + RP_USER, + 'b', 'a', 'd', ' ', 'h', 'o', 's', 't', ' ', 'n', 'a', 'm', 'e', NULL +}; + +struct rp_construct rp_err = { /* error, you lose */ + RP_NO, + 'u', 'n', 'k', 'n', 'o', 'w', 'n', ' ', 'e', 'r', 'r', 'o', 'r', NULL +}; + + +char *index (), *strdup (); + +/* */ + +qu2uu_send () { + short result; + char info[LINESIZE], + sender[LINESIZE]; + +#ifdef DEBUG + ll_log (logptr, LLOGBTR, "qu2uu_send ()"); +#endif + + if (rp_isbad (result = qu_pkinit ())) + return result; + if (rp_isbad (result = uu_sbinit ())) + return result; + + while (rp_gval ((result = qu_rinit (info, sender))) == RP_OK) { +#ifdef DEBUG + ll_log (logptr, LLOGGEN, "info=%s sender=%s", info, sender); +#endif + if (rp_isbad (result = qu2uu_each (sender))) + return result; + } + + if (rp_gval (result) != RP_DONE) { + ll_log (logptr, LLOGTMP, "not DONE [%s]", rp_valstr (result)); + return RP_RPLY; + } + + qu_pkend (); + uu_sbend (); + + return result; +} + +/* */ + +qu2uu_each (sender) +char *sender; +{ + short result; + char adr[LINESIZE], + host[LINESIZE]; + RP_Buf replyval; + +#ifdef DEBUG + ll_log (logptr, LLOGBTR, "qu2uu_each(sender='%s')", sender); +#endif + + mf_rinit (sender, qu_fileno ()); + +/* */ + + FOREVER + { + if (rp_isbad (result = qu_radr (host, adr))) { + mf_rend (); + return result; + } + if (rp_gval (result) == RP_DONE) { + qu_wrply ((RP_Buf *) & rp_aend, rp_conlen (rp_aend)); + mf_rend (); + return RP_OK; + } + + switch (replyval.rp_val = uu_wtadr (host, adr)) { + case RP_OK: + case RP_AOK: + replyval.rp_val = uu_txtcpy (); + break; + + case RP_USER: + ll_log (logptr, LLOGFAT, "host (%s) not in table", host); + blt (&rp_bhost, (char *) & replyval, sizeof rp_bhost); + break; + + default: + ll_log (logptr, LLOGFAT, + "unknown return from uu_wtadr() [%s]", + rp_valstr (replyval.rp_val)); + blt (&rp_err, (char *) & replyval, sizeof rp_err); + replyval.rp_val = RP_NO; + break; + } + if (replyval.rp_val == RP_MOK) + switch (replyval.rp_val = uu_wttend ()) { + case RP_OK: + case RP_MOK: + replyval.rp_line[0] = NULL; + break; + + case RP_USER: + case RP_LIO: + ll_log (logptr, LLOGFAT, "host (%s) not in table", host); + blt (&rp_bhost, (char *) & replyval, sizeof rp_bhost); + replyval.rp_val = RP_USER; + break; + + default: + ll_log (logptr, LLOGFAT, + "unknown return from uu_wttend() [%s]", + rp_valstr (replyval.rp_val)); + blt (&rp_err, (char *) & replyval, sizeof rp_err); + break; + } + + qu_wrply (&replyval, + (sizeof replyval.rp_val) + strlen (replyval.rp_line)); + } +} + +/* */ + +/* ******************** (mf_) MAIL-FILTERING HANDLING ******************** */ + +#include "mf.h" + + +static int mf_fd; + +static char mf_from[BUFSIZ]; + +/* */ + +int mf_rinit (addr, fd) +char *addr; +int fd; +{ + long timenow; + char *sender, + buffer[BUFSIZ]; + struct adrx *adrxp; + + mf_from[0] = NULL; + + if ((mf_fd = mf_get_msg (fd)) == NOTOK) { + adrxp = getadrx (addr); + sender = adrxp -> err ? addr + : lexequ (adrxp -> host, LocalName ()) + || lexequ (adrxp -> host, SystemName ()) ? adrxp -> mbox + : sprintf (buffer, "%s@%s", adrxp -> mbox, adrxp -> host); + while (getadrx (NULL)) + continue; + sender = strdup (sender); + lowerfy (sender); + sprintf (mf_from, "From %s %.24s remote from %s\n", + sender, ctime (&timenow), SystemName ()); + free (sender); + } + + return RP_OK; +} + +/* */ + +int mf_rend () { + if (mf_fd != NOTOK) + close (mf_fd); + mf_fd = NOTOK; + mf_from[0] = NULL; + + return RP_OK; +} + + +mf_rtinit (pos) +long pos; +{ + if (mf_fd == NOTOK) + qu_rtinit (pos); + else + lseek (mf_fd, (off_t) pos, 0); +} + + +int mf_rtxt (buffer, len) +char *buffer; +int *len; +{ + if (mf_fd == NOTOK) + if (mf_from[0]) { + strcpy (buffer, mf_from); + buffer[*len = strlen (mf_from)] = NULL; + mf_from[0] = NULL; + return RP_OK; + } + else + return qu_rtxt (buffer, len); + + switch (*len = read (mf_fd, buffer, BUFSIZE)) { + case NOTOK: + return RP_LIO; + + case OK: + return RP_DONE; + + default: + buffer[*len] = NULL; + return RP_OK; + } +} + +/* */ + +static int mf_get_msg (md) +int md; +{ + int i, + fd, + qd; + char buffer[BUFSIZ], + tmpfil[BUFSIZ]; +#ifdef MFDEBUG + FILE * fp; +#endif MFDEBUG + + lseek (md, (off_t)0, 0); + if ((qd = dup (md)) == NOTOK) + return NOTOK; + + strcpy (tmpfil, "/tmp/qu2uuXXXXXX"); + unlink (mktemp (tmpfil)); + if ((fd = creat (tmpfil, 0600)) == NOTOK) { + close (qd); + return NOTOK; + } + close (fd); + if ((fd = open (tmpfil, 2)) == NOTOK) { + close (qd); + return NOTOK; + } + unlink (tmpfil); + + if ((i = mmdf_to_uucp (qd, fd, TRUE)) != OK) { + close (fd); + + sprintf (buffer, "ch_uucp(%d) filtering for %s failed (%d)\n", + getpid (), qu_msgfile, i); + if (ml_1adr (NO, NO, sitesignature, "MF Failure", supportaddr) + != OK) + goto ml_err; + ml_txt (buffer); +#ifdef MFDEBUG + lseek (md, (off_t)0, 0); + if ((fd = dup (md)) == NOTOK) + ml_txt ("unable to dup() descriptor for message copy\n"); + else + if ((fp = fdopen (fd, "r")) == NULL) { + ml_txt ("unable to fdopen() descriptor for message copy\n"); + close (fd); + } + else { + ml_txt ("\n --Message Follows--\n"); + ml_file (fp); + fclose (fp); + } +#endif MFDEBUG + if (ml_end (OK) != OK) { + char *cp; + + ml_err: ; + if (cp = index (buffer, '\n')) + *cp = NULL; + ll_log (logptr, LLOGFAT, "Unable to post failure notice"); + ll_log (logptr, LLOGFAT, "info: %s", buffer); + } + + fd = NOTOK; + } + close (qd); + + return fd; +}