|
|
1.1 ! root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.