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: }

Defined functions

mf_get_msg defined in line 240; used 1 times
mf_rend defined in line 191; used 2 times
mf_rinit defined in line 160; used 1 times
  • in line 85
qu2uu_each defined in line 73; used 1 times
  • in line 56

Defined variables

mf_fd defined in line 154; used 8 times
mf_from defined in line 156; used 7 times
rp_aend defined in line 17; used 2 times
  • in line 96(2)
rp_bhost defined in line 23; used 4 times
rp_err defined in line 28; used 4 times

Defined macros

MFDEBUG defined in line 1; used 2 times
Last modified: 1986-04-21
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1604
Valid CSS Valid XHTML 1.0 Strict