1: #define MAINLINE 2: #include "parms.h" 3: #include "structs.h" 4: #include "newsgate.h" 5: 6: #ifdef RCSIDENT 7: static char rcsid[] = "$Header: newsoutput.c,v 1.7.0.1 85/03/22 10:54:22 notes Rel $"; 8: #endif RCSIDENT 9: 10: 11: /* 12: * newsoutput - place the specified notesfiles out to the 13: * news susbsystem. 14: * 15: * Original Coding: Ray Essick April 1982 16: * Modified to better handle multiple system gateing 17: * Ray Essick September 1982 18: */ 19: 20: static char *whichsys; /* who dumping for */ 21: static int verbosity = 0; /* quiet */ 22: static int backward = 0; /* do old format */ 23: char rnewscmd[CMDLEN] = DFLTRNEWS; /* how to rnews */ 24: int sendclass = 0; /* classes to send */ 25: int usetime = NORMSEQ; /* user supplied */ 26: int gatesyscount = 0; /* actives slots in */ 27: char *gatesysnames[GATEMAX]; /* list of names */ 28: 29: newsone (nfname) 30: char *nfname; 31: { 32: if (verbosity) 33: { 34: printf ("\t%s\n", nfname); 35: fflush (stdout); 36: } 37: return newsout (nfname, backward, usetime, verbosity); 38: } 39: 40: 41: main (argc, argv) 42: char **argv; 43: { 44: int i; 45: struct nflist_f *nfptr; 46: char *outgoing; 47: struct when_f ztime; 48: char fmtdate[DATELEN]; /* formatted date */ 49: int aflag, 50: cflag, 51: sflag; 52: 53: startup (argc, argv); /* common init */ 54: 55: if (argc == 1) 56: { 57: printf ("Usage: %s [-ssitename | -a] [-v] [-b] [-f file] topic1 [topic2 ...]\n", argv[0]); 58: exit (BAD); 59: } 60: 61: if (globuid != Notesuid) 62: { 63: printf ("Sorry, only notes 'owner' can send notes to news\n"); 64: exit (BAD); 65: } 66: 67: whichsys = System; /* defaults to local */ 68: aflag = cflag = sflag = 0; /* none done */ 69: gatesyscount = 0; /* none there */ 70: verbosity = 0; /* no messages */ 71: backward = 0; /* just new format */ 72: usetime = NORMSEQ; /* non-seq time */ 73: strcpy (rnewscmd, DFLTRNEWS); /* default rnews */ 74: getnet (RNEWSNAME, &outgoing, NULL, NULL); /* how to get there */ 75: if (outgoing != (char *) NULL) /* specified? */ 76: strcpy (rnewscmd, outgoing); /* load it */ 77: 78: for (i = 1; i < argc; i++) 79: { 80: if (argv[i][0] == '-') 81: switch (argv[i][1]) 82: { 83: 84: case 's': /* gateway for */ 85: sflag = 1; 86: if (argv[i][2] != '\0') /* -ssite */ 87: { 88: whichsys = &argv[i][2]; 89: } 90: else 91: { /* -s sitename */ 92: if (++i == argc) /* no sitename */ 93: { 94: fprintf (stderr, "-s must be followed by a sitename\n"); 95: exit (BAD); 96: } 97: whichsys = argv[i]; /* mark site */ 98: } 99: gatesyscount = 1; /* fill in table */ 100: gatesysnames[0] = whichsys; 101: break; 102: 103: case 'a': /* all non-local */ 104: sendclass |= NEWS_ALLSEND; 105: aflag = 1; 106: whichsys = NEWSSYS; /* it's sequencer */ 107: break; 108: 109: case 'c': /* file of systems */ 110: cflag = 1; 111: whichsys = NEWSSYS; /* use the global seq */ 112: if (++i == argc) 113: { 114: printf ("%s: -c option must be followed by filename\n", Invokedas); 115: exit (BAD); 116: } 117: loadgate (argv[i]); /* load the table */ 118: break; 119: 120: case 'v': /* messages per group */ 121: verbosity++; 122: break; 123: 124: case 'f': /* process a file */ 125: if (++i == argc) /* no filename */ 126: { 127: fprintf (stderr, "-f must be followed by a filename\n"); 128: exit (BAD); 129: } 130: readrc (argv[i]); /* read the file */ 131: break; 132: 133: case 'b': /* include old headers */ 134: backward++; 135: break; 136: 137: case 't': /* explicit time */ 138: case 'o': /* compatibility */ 139: if (++i == argc) 140: { 141: fprintf (stderr, "-t option requires following date\n"); 142: exit (BAD); 143: } 144: switch (parsetime (argv[i], &ztime)) 145: { 146: case 0: /* ok */ 147: usetime = BASESEQ; /* use this time */ 148: Basetime = ztime; /* store it */ 149: sprdate (&ztime, fmtdate); /* format */ 150: printf ("%s: Sending articles since %s\n", 151: Invokedas, fmtdate); 152: break; 153: case -1: /* no good */ 154: fprintf (stderr, "%s: unable to parse time `%s'\n", 155: Invokedas, argv[i]); 156: exit (BAD); 157: case -2: /* in future */ 158: fprintf (stderr, "%s: parsed date (%s) is in the future\n", 159: Invokedas, argv[i]); 160: exit (BAD); 161: } 162: break; 163: 164: 165: default: 166: printf ("Bad switch: %c\n", argv[i][1]); 167: exit (BAD); 168: } 169: else 170: expand (argv[i]); /* put it in the list */ 171: } 172: 173: /* 174: * now, run down the list and send each notesfile. 175: * check to make sure some things are used consistently first. 176: */ 177: 178: if (aflag + cflag + sflag > 1) 179: { /* -a and -s */ 180: fprintf (stderr, "%s: -a, -c and -s mutually exclusive\n", Invokedas); 181: exit (BAD); 182: } 183: if (gatesyscount == 0 && !cflag) /* default to local */ 184: { 185: /* 186: * check against cflag allows empty -c files to "work" 187: */ 188: gatesysnames[0] = whichsys; 189: gatesyscount = 1; /* just us */ 190: } 191: if (1) /* was verbosity */ 192: { /* now always... */ 193: printf ("%s: Sending news articles through command: %s\n", 194: Invokedas, rnewscmd); 195: if (sendclass & NEWS_ALLSEND) 196: { 197: printf ("Sending to News for any system\n"); 198: } 199: else 200: { 201: int col; /* count columns */ 202: 203: /* 204: * WE WANT TO SORT THE LIST AT THIS POINT 205: * so that the cansend() routine in newsout.c can do a binary 206: * search to make things faster. 207: */ 208: printf ("Gateway for the following %d system(s):\n", gatesyscount); 209: for (i = 0, col = 0; i < gatesyscount; i++) 210: { 211: printf (" %16s", gatesysnames[i]); 212: if (++col % 4 == 0) 213: putc ('\n', stdout); /* multi-column */ 214: } 215: } 216: printf ("\n================\n"); 217: } 218: fflush (stdout); /* make sure in order */ 219: sprintf (Seqname, "%s:%s", NEWSSEQ, whichsys); 220: while ((nfptr = nextgroup ()) != (struct nflist_f *) NULL) 221: newsone (nfptr -> nf_name); 222: 223: exit (GOOD); /* all done */ 224: } 225: 226: /* 227: * loadgate(filename) 228: * 229: * fill in the system table. 230: */ 231: 232: loadgate (filename) 233: char *filename; 234: { 235: FILE * fptr; 236: char onesystem[256]; /* system name */ 237: 238: if ((fptr = fopen (filename, "r")) == (FILE *) NULL) 239: return (-1); /* bah humbug */ 240: 241: while (fscanf (fptr, "%s", onesystem) == 1) 242: { 243: gatesysnames[gatesyscount++] = strsave (onesystem); 244: } 245: 246: fclose (onesystem); 247: return (0); 248: }