1: #include "util.h" 2: #include "mmdf.h" 3: #ifndef POP 4: 5: /* 6: * C H _ B B O A R D S . C 7: * 8: * the new BBoards channel 9: */ 10: 11: #else POP 12: 13: /* 14: * C H _ P O P . C 15: * 16: * the POP channel 17: */ 18: 19: #endif POP 20: 21: /* */ 22: 23: #ifndef POP 24: 25: /* 26: * This is the channel that is used to handle Internet BBoard 27: * distribution in an intelligent fashion. In order to run it, you 28: * need the UCI BBoards facility installed. This requires the 29: * establishment of a special login called ``bboards'', and the 30: * getbbent() package. 31: * 32: * The idea is simple. Distribution lists get aliased to go through 33: * this channel. Suppose that the relay (or site) using ch_bboards 34: * subscribes to UNIX-WIZARDS. The maintainer of the list is given 35: * the address ``dist-unix-wizards'' to send to for this relay and all 36: * sites that it serves. The site manager then defines the following 37: * alias in the aliases file: 38: * 39: * dist-unix-wizards: unix-wizards@bboards 40: * 41: * This channel (and this channel alone) is then defined to serve the 42: * ``bboards'' host. When it gets invoked, the channel does two 43: * things: First, if the relay itself subscribes to the BBoard (the 44: * bb_file entry in the BBoards file is non-empty), then it delivers 45: * the message to the file. Second, if other sites subscribe to the 46: * BBoard, then ch_bboards will enter the message back into the queue 47: * system using the ``bboards'' login as the sender. 48: * 49: * This achieves two goals: first, the incoming bandwidth of relays 50: * is not degraded by many sites subscribing to the same BBoard; 51: * second, if an address goes bad down the line, the relay's 52: * ``bboards'' login gets the message back (not the originator). Since 53: * the relay's PostMaster is assumed to monitor this mailbox, problems 54: * can be found and corrected. 55: * 56: * Finally, ch_bboards can be run by a site that does not relay for 57: * other sites. In this case, the bb_dist field is empty. 58: */ 59: 60: /* Unlike previous versions of ch_bboards, this version does not change 61: * the contents of the headers of the message being re-distributed. 62: * The following changes are made: 63: * 64: * Envelope: The failure address is changed to bboards@locname 65: * Headers: Another Received: is added 66: * 67: * The local copy going to the BBoard has two entries prepended to the 68: * headers: 69: * 70: * BBoard-ID: n 71: * BB-Posted: RFC822 date/time 72: */ 73: 74: #else POP 75: 76: /* 77: * The POP channel is a subset of the BBoards channel, and just 78: * handles local mail delivery for remote users. As such, it 79: * only needs to know how to store a maildrop locally, and doesn't 80: * have to mess around with .cnt files and remote delivery. 81: */ 82: 83: #endif POP 84: 85: /* */ 86: 87: #include <signal.h> 88: #include "ch.h" 89: #include "phs.h" 90: 91: extern LLog chanlog; 92: LLog *logptr = &chanlog; 93: extern char *logdfldir; 94: 95: /* */ 96: 97: main (argc, argv) 98: int argc; 99: char **argv; 100: { 101: Chan *chanptr; 102: char *dupfpath (); 103: short retval; 104: 105: mmdf_init (argv[0]); 106: 107: #ifdef RUNALON 108: logptr -> ll_fd = 1; 109: ll_init (logptr); 110: #endif 111: 112: siginit (); 113: signal (SIGINT, SIG_IGN); 114: 115: if ((chanptr = ch_nm2struct (argv[0])) == (Chan *) NOTOK) 116: err_abrt (RP_PARM, "unknown channel name '%s'", argv[0]); 117: 118: retval = ch_bboards (argc, argv, chanptr); 119: ll_close (logptr); 120: 121: exit (retval); 122: } 123: 124: /* */ 125: /* **************** (ch_) BBOARD DELIVERY **************** */ 126: 127: ch_bboards (argc, argv, chanptr) 128: int argc; 129: char **argv; 130: Chan *chanptr; 131: { 132: #ifdef DEBUG 133: ll_log (logptr, LLOGBTR, "ch_bboards(argc=%d,*argv='%s')", argc, *argv); 134: #endif 135: 136: if (rp_isbad (qu_init (argc, argv))) 137: return RP_NO; 138: if (rp_isbad (bb_init (chanptr))) 139: return RP_NO; 140: 141: phs_note (chanptr, PHS_WRSTRT); 142: 143: if (rp_isbad (qu2bb_send (chanptr))) 144: return RP_NO; 145: 146: phs_note (chanptr, PHS_WREND); 147: 148: qu_end (OK); 149: bb_end (OK); 150: 151: return RP_OK; 152: } 153: 154: /* */ 155: 156: /* VARARGS2 */ 157: err_abrt (code, fmt, b, c, d) 158: short code; 159: char *fmt, 160: *b, 161: *c, 162: *d; 163: { 164: char linebuf[LINESIZE]; 165: 166: qu_end (NOTOK); 167: bb_end (NOTOK); 168: 169: sprintf (linebuf, "%s%s", "err [ ABEND (%s) ]\t", fmt); 170: ll_log (logptr, LLOGFAT, linebuf, rp_valstr (code), b, c, d); 171: ll_close (logptr); 172: 173: exit (code); 174: }