1: /* uu_wtmail.c - write mail to UUCP */
   2: 
   3: #include "util.h"
   4: #include "mmdf.h"
   5: #include "ch.h"
   6: #include <signal.h>
   7: 
   8: /*  */
   9: 
  10: extern int  errno;
  11: 
  12: int     broken_pipe;
  13: void    pipeser ();
  14: 
  15: extern struct ll_struct *logptr;
  16: 
  17: FILE * uucpf;
  18: 
  19: Chan * curchan;
  20: 
  21: 
  22: char   *index ();
  23: FILE * popen ();
  24: 
  25: /*  */
  26: 
  27: uu_init (chanptr)
  28: Chan * chanptr;
  29: {
  30: #ifdef DEBUG
  31:     ll_log (logptr, LLOGBTR, "uu_init (chanptr=%s)", chanptr -> ch_spec);
  32: #endif
  33: 
  34:     curchan = chanptr;
  35: 
  36:     return RP_OK;
  37: }
  38: 
  39: 
  40: uu_end (result)
  41: short   result;
  42: {
  43: #ifdef DEBUG
  44:     ll_log (logptr, LLOGBTR, "uu_end (result=0%o)", result);
  45: #endif
  46: 
  47:     return RP_OK;
  48: }
  49: 
  50: /*  */
  51: 
  52: uu_sbinit () {
  53: #ifdef DEBUG
  54:     ll_log (logptr, LLOGBTR, "uu_sbinit ()");
  55: #endif
  56: 
  57:     return RP_OK;
  58: }
  59: 
  60: uu_sbend () {
  61: #ifdef DEBUG
  62:     ll_log (logptr, LLOGBTR, "uu_sbend ()");
  63: #endif
  64: 
  65:     return RP_OK;
  66: }
  67: 
  68: /*  */
  69: 
  70: uu_wtadr (host, adr, sender)
  71: char   *host,
  72:        *adr,
  73:        *sender;
  74: {
  75:     char   *p,
  76:             linebuf[LINESIZE],
  77:             nextnode[LINESIZE],
  78:             who[LINESIZE];
  79: 
  80: #ifdef DEBUG
  81:     ll_log (logptr, LLOGBTR, "uu_wtadr(host='%s',adr='%s')", host, adr);
  82: #endif
  83: 
  84:     if (host == NULL || host[0] == NULL)
  85:     strcpy (who, adr);
  86:     else {
  87:     if (!ch_h2adr (curchan, TRUE, host, nextnode))
  88:         return RP_USER; /* No such host */
  89:     sprintf (who, nextnode, adr);
  90:     }
  91: 
  92:     if ((p = index (who, '!')) != NULL) {
  93:     *p++ = NULL;
  94:     strcpy (nextnode, who);
  95:     strcpy (who, p);
  96:     lowerfy (nextnode);
  97:     }
  98:     else
  99:     strcpy (nextnode, "");
 100: 
 101:     printx ("Queuing UUCP mail for %s via %s...\n", who, nextnode);
 102:     sprintf (linebuf, "uux -p %s!rmail \\(%s\\)", nextnode, who);
 103:     if ((uucpf = popen (linebuf, "w")) == NULL) {
 104:     ll_log (logptr, LLOGFAT, "unable to popen() UUX (errno %d)", errno);
 105:     return RP_AGN;
 106:     }
 107: 
 108:     return RP_OK;
 109: }
 110: 
 111: /*  */
 112: 
 113: uu_txtcpy () {
 114:     short   result;
 115:     int     len;
 116:     int     (*pstat) ();
 117:     char    buffer[BUFSIZ];
 118: 
 119: #ifdef DEBUG
 120:     ll_log (logptr, LLOGBTR, " uu_txtcpy()");
 121: #endif
 122: 
 123:     mf_rtinit (0L);
 124:     broken_pipe = 0;
 125:     pstat = signal (SIGPIPE, pipeser);
 126: 
 127:     while (rp_gval (result = mf_rtxt (buffer, &len)) == RP_OK && !broken_pipe)
 128:     if (fwrite (buffer, sizeof *buffer, len, uucpf) != len) {
 129:         ll_log (logptr, LLOGFAT, "write on pipe lost (errno %d)", errno);
 130:         ll_log (logptr, LLOGFAT, "pclose() returns %d", pclose (uucpf));
 131:         signal (SIGPIPE, pstat);
 132:         return (broken_pipe ? RP_USER : RP_LIO);
 133:     }
 134: 
 135:     fflush (uucpf);
 136:     if (broken_pipe) {
 137:     ll_log (logptr, LLOGFAT, "pipe to UUX broke -- probably bad host");
 138:     ll_log (logptr, LLOGFAT, "pclose() returns %d", pclose (uucpf));
 139:     signal (SIGPIPE, pstat);
 140:     return RP_USER;
 141:     }
 142:     signal (SIGPIPE, pstat);
 143: 
 144:     return (rp_gval (result) == RP_DONE ? RP_MOK : result);
 145: }
 146: 
 147: /*  */
 148: 
 149: uu_wttend () {
 150:     short   result;
 151:     int     (*pstat) ();
 152: 
 153:     pstat = signal (SIGPIPE, pipeser);
 154:     result = pclose (uucpf) ? (broken_pipe ? RP_USER : RP_LIO) : RP_MOK;
 155:     signal (SIGPIPE, pstat);
 156: 
 157:     return result;
 158: }
 159: 
 160: /*  */
 161: 
 162: lowerfy (s)
 163: char   *s;
 164: {
 165:     while (*s = uptolow (*s))
 166:     s++;
 167: }
 168: 
 169: 
 170: void pipeser (i)
 171: int     i;
 172: {
 173:     broken_pipe++;
 174:     signal (SIGPIPE, SIG_IGN);
 175: }

Defined functions

lowerfy defined in line 162; used 2 times
pipeser defined in line 170; used 3 times
uu_end defined in line 40; used 2 times
uu_init defined in line 27; used 1 times

Defined variables

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