|
|
1.1 ! root 1: #define MAINLINE ! 2: ! 3: #ifdef RCSIDENT ! 4: static char rcsid[] = "$Header: nfxmit.c,v 1.7 85/01/18 15:31:53 notes Rel $"; ! 5: #endif RCSIDENT ! 6: ! 7: /* ! 8: * This program (netsend) will parse off the control card a destination ! 9: * site, an optional date for sequencing purposes, and then a list ! 10: * of notefiles. These notefiles are then scanned to send new items ! 11: * to the destination site. The entire arguement list is scanned once ! 12: * to pull in the switches and then again to dump the notefiles. ! 13: * This implies that the switches are indeed global, and that the last ! 14: * specified ones are the ones which are used. ! 15: * ! 16: * Original Coding: Ray Essick December 1981 ! 17: */ ! 18: #include "parms.h" ! 19: #include "structs.h" ! 20: #include "net.h" ! 21: ! 22: static int usetime; /* whether overriding sequencer time */ ! 23: static int sendhim; /* classes to send */ ! 24: static int callback; /* whether to have remote send back */ ! 25: static char tosite[SYSSZ + 20]; /* with some buffer space */ ! 26: static char dmpfile[WDLEN]; /* a scratch file name */ ! 27: ! 28: xmitone (local) ! 29: char *local; ! 30: { ! 31: char cmdline[CMDLEN]; /* build your favorite command */ ! 32: char buf[CMDLEN]; ! 33: char nfname[NNLEN]; /* hold aliased nf name */ ! 34: char *xmit, ! 35: *rply; /* for non-standard */ ! 36: int proto; /* protocol to use */ ! 37: int queuestat; /* Return Value */ ! 38: int sendstat; /* nfsend status */ ! 39: ! 40: getnet (tosite, &xmit, &rply, &proto); /* see if non standard */ ! 41: nfalias (local, nfname, tosite); /* get remote file name */ ! 42: ! 43: if (callback) ! 44: { ! 45: if (rply == NULL) ! 46: sprintf (cmdline, DFLTRPLY, /* see net.h defn */ ! 47: tosite, NFXMIT, nfname, System); ! 48: else ! 49: sprintf (cmdline, rply, nfname, System); /* do his */ ! 50: #ifndef FASTFORK ! 51: dounix (cmdline, 0, 0); /* do it */ ! 52: #else ! 53: dounix (0, 0, hisshell, "-c", cmdline, 0, 0); /* let shell interpret */ ! 54: #endif FASTFORK ! 55: } ! 56: ! 57: /* ! 58: * Now see if we have anything to send him. We don't queue anything ! 59: * unless we do want to send to him. ! 60: */ ! 61: ! 62: if ((sendstat = /* WANT ASSIGN */ ! 63: nfsend (tosite, local, dmpfile, usetime, sendhim, proto)) > 0) ! 64: { ! 65: if (xmit == NULL) ! 66: sprintf (cmdline, DFLTXMIT, /* see net.h defn */ ! 67: tosite, NFRCV, nfname, System, dmpfile); ! 68: else ! 69: { ! 70: sprintf (buf, xmit, nfname, System); ! 71: sprintf (cmdline, "%s < %s", buf, dmpfile); /* feed stdin to it */ ! 72: } ! 73: #ifndef FASTFORK ! 74: queuestat = dounix (cmdline, 0, 0); /* do it */ ! 75: #else ! 76: queuestat = dounix (0, 0, hisshell, "-c", cmdline, 0, 0); ! 77: #endif FASTFORK ! 78: } ! 79: else ! 80: { /* error or no data */ ! 81: queuestat = 0; /* avoid random stack noise */ ! 82: } ! 83: ! 84: /* ! 85: * nfsendone cleans up the sequencer entry for that notesfile. ! 86: * And does logging information also ! 87: * We only clean up the entry if the command was successful. ! 88: */ ! 89: nfsendone (local, tosite, queuestat, sendstat); ! 90: ! 91: return (0); /* all is well */ ! 92: } ! 93: ! 94: main (argc, argv) ! 95: char **argv; ! 96: { ! 97: int i; ! 98: struct nflist_f *nfptr; ! 99: char fmtdate[DATELEN]; /* formatted date */ ! 100: struct when_f ztime; /* hold date */ ! 101: ! 102: startup (argc, argv); /* common init */ ! 103: ! 104: if (argc == 1) ! 105: { ! 106: fprintf (stderr, "Usage: %s -d<site> [-r] [-i] [-a] [-t datespec] [-f file] nf [nf2 ..]\n", argv[0]); ! 107: exit (BAD); ! 108: } ! 109: sendhim = 0; /* default classes */ ! 110: usetime = NORMSEQ; /* sequencer time */ ! 111: callback = 0; /* no return messages */ ! 112: sprintf (tosite, "*None*"); /* null site */ ! 113: ! 114: for (i = 1; i < argc; i++) /* parse options */ ! 115: switch (argv[i][0]) ! 116: { ! 117: case '-': /* some options oh goody */ ! 118: switch (argv[i][1]) ! 119: { ! 120: case 'd': ! 121: if (strmove (argv[i] + 2, tosite) > SYSSZ) ! 122: { ! 123: printf ("System name: %s, too long\n", argv[i] + 2); ! 124: exit (BAD); ! 125: } ! 126: break; /* out of this switch statement */ ! 127: ! 128: case 'r': /* force rmt nfxmit */ ! 129: callback = 1; ! 130: break; ! 131: ! 132: case 'a': /* ok, news articles */ ! 133: sendhim |= SENDNEWS; ! 134: break; ! 135: ! 136: case 'i': /* stuff he's seen */ ! 137: sendhim |= SENDHIS; ! 138: break; ! 139: ! 140: case 't': /* explicit time */ ! 141: case 'o': /* compatibility */ ! 142: if (++i == argc) ! 143: { ! 144: fprintf (stderr, "-t option requires following date\n"); ! 145: exit (BAD); ! 146: } ! 147: switch (parsetime (argv[i], &ztime)) ! 148: { ! 149: case 0: /* ok */ ! 150: usetime = BASESEQ; /* use this time */ ! 151: Basetime = ztime; /* store it */ ! 152: sprdate (&ztime, fmtdate);/* format */ ! 153: printf ("%s: Sending articles since %s\n", ! 154: Invokedas, fmtdate); ! 155: break; ! 156: case -1: /* no good */ ! 157: fprintf (stderr, "%s: unable to parse time `%s'\n", ! 158: Invokedas, argv[i]); ! 159: exit (BAD); ! 160: case -2: /* in future */ ! 161: fprintf (stderr, "%s: parsed date (%s) is in the future\n", ! 162: Invokedas, argv[i]); ! 163: exit (BAD); ! 164: } ! 165: break; ! 166: ! 167: case 'f': /* next list is a file name */ ! 168: if (++i == argc) /* no filename */ ! 169: { ! 170: fprintf (stderr, "-f must be followed by filename\n"); ! 171: exit (BAD); ! 172: } ! 173: readrc (argv[i]); /* load it */ ! 174: break; ! 175: ! 176: default: ! 177: printf ("Bad switch '%c'\n", argv[i][1]); ! 178: exit (BAD); ! 179: } ! 180: break; ! 181: ! 182: default: /* a notefile name */ ! 183: expand (argv[i]); /* add it to the list */ ! 184: break; ! 185: } ! 186: ! 187: sprintf (dmpfile, "/tmp/nfxmit%d", getpid ()); ! 188: if (strcmp ("*None*", tosite) == 0) ! 189: { ! 190: printf ("Null destination - use -d flag\n"); ! 191: exit (BAD); ! 192: } ! 193: ! 194: /* now that we have processed all the parameters, lets dump the ! 195: * notes and send them to the other people. ! 196: * This is a 2 step process. First we make a file and then ! 197: * we 'uucp' it to the other site. ! 198: */ ! 199: ! 200: while ((nfptr = nextgroup ()) != (struct nflist_f *) NULL) ! 201: xmitone (nfptr -> nf_name); /* simple case */ ! 202: ! 203: exit (GOOD); ! 204: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.