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