|
|
1.1 ! root 1: #include "parms.h" ! 2: #include "structs.h" ! 3: #include "newsgate.h" ! 4: ! 5: #ifdef FASTSEQ ! 6: #include <sys/types.h> ! 7: #include <sys/stat.h> ! 8: #endif FASTSEQ ! 9: ! 10: #ifdef RCSIDENT ! 11: static char rcsid[] = "$Header: newsout.c,v 1.7.0.2 85/03/22 10:53:59 notes Rel $"; ! 12: #endif RCSIDENT ! 13: ! 14: /* ! 15: * newsoutput - process a particular notesfile for updates ! 16: * out to the news system. ! 17: * ! 18: * ! 19: * Original Coding: Ray Essick April 1982 ! 20: * Modified to handle gateing for multiple systems better ! 21: * Ray Essick September 1982 ! 22: */ ! 23: ! 24: newsout (nfname, backwards, usetime, verbosity) ! 25: char *nfname; ! 26: { ! 27: struct io_f io; ! 28: struct note_f note; ! 29: struct resp_f rsprec; ! 30: struct when_f whendump; /* when we did this */ ! 31: int notenum, ! 32: respnum, ! 33: rdumped, ! 34: ndumped, /* number dumped */ ! 35: roffset, ! 36: rblock; ! 37: char basengroup[NNLEN]; /* hold newsgroup */ ! 38: char respngroup[NNLEN]; /* hold newsgroup */ ! 39: FILE * log; ! 40: char buf[CMDLEN]; ! 41: char ztime[DATELEN]; ! 42: ! 43: #ifdef FASTSEQ ! 44: { ! 45: struct when_f whenvec; ! 46: char NoteFile[WDLEN]; ! 47: struct stat StatBuf; ! 48: ! 49: if (nfname[0] == '/') /* absolute pathname */ ! 50: { ! 51: getlast (&io.stime, rindex (nfname, '/') + 1, usetime, Seqname); ! 52: sprintf (NoteFile, "%s/%s", nfname, TEXT); ! 53: } ! 54: else /* from Mstdir */ ! 55: { ! 56: getlast (&io.stime, nfname, usetime, Seqname); ! 57: sprintf (NoteFile, "%s/%s/%s", Mstdir, nfname, TEXT); ! 58: } ! 59: if (stat (NoteFile, &StatBuf) >= 0) ! 60: { ! 61: maketime (&whenvec, (long) StatBuf.st_mtime); ! 62: if (inorder (&whenvec, &io.stime)) ! 63: { ! 64: return (0); ! 65: } ! 66: } ! 67: } ! 68: #endif FASTSEQ ! 69: ! 70: if (init (&io, nfname) < 0) /* open the bugger */ ! 71: return (-1); ! 72: ! 73: if ((io.descr.d_stat & NETWRKD) == 0) /* can we gate? */ ! 74: { ! 75: closenf (&io); ! 76: printf ("%s must be networked to go to news!\n", nfname); ! 77: fflush (stdout); ! 78: return (-1); ! 79: } ! 80: ! 81: gettime (&whendump); /* for seq. update */ ! 82: getlast (&io.stime, io.nf, usetime, Seqname); /* grab last time */ ! 83: newsgroup (io.nf, basengroup, NFBASENEWS); /* alias base notes */ ! 84: newsgroup (io.nf, respngroup, NFRESPNEWS); /* and responses */ ! 85: ! 86: if (inorder (&io.descr.d_lastm, &io.stime)) /* no traffic */ ! 87: { ! 88: #ifdef FASTSEQ ! 89: /* ! 90: * Update the timestamp so the next scan will catch the idle ! 91: * notesfile in the FASTSEQ code. ! 92: */ ! 93: fixlast (&whendump, io.nf, NORMSEQ, Seqname); /* update sequencer */ ! 94: #endif FASTSEQ ! 95: closenf (&io); /* cheap no-stats exit */ ! 96: return (0); /* and out of here */ ! 97: } ! 98: ! 99: ndumped = rdumped = 0; ! 100: notenum = 0; /* start at the top */ ! 101: while ((notenum = nxtnote (&io, notenum, &io.stime)) != -1) ! 102: { ! 103: getnrec (&io, notenum, ¬e); /* get descriptor */ ! 104: respnum = 0; /* response chain */ ! 105: if (inorder (&io.stime, ¬e.n_rcvd) == 0) /* been dumped */ ! 106: goto doresps; ! 107: if ((note.n_stat & FRMNEWS) != 0) /* it's been in news */ ! 108: goto doresps; /* dont send back! */ ! 109: if ((note.n_stat & ORPHND) != 0) /* no foster parents */ ! 110: goto doresps; /* go out */ ! 111: if (!cansend (note.n_id.sys, sendclass)) /* can't send it */ ! 112: goto doresps; /* don't dump it */ ! 113: ! 114: if (newsnote (&io, ¬e, notenum, basengroup, backwards) == -1) ! 115: { ! 116: sprintf (buf, "%s/%s/%s", Mstdir, UTILITY, NETLOG); ! 117: sprdate (&whendump, ztime); ! 118: x ((log = fopen (buf, "a")) == NULL, "newsout: no log file"); ! 119: fprintf (log, "%s: Failed dumping note to NEWS for %s at %s\n", ! 120: nfname, note.n_id.sys, ztime); ! 121: fclose (log); ! 122: printf ("%s: Failed dumping note to NEWS for %s at %s\n", ! 123: nfname, note.n_id.sys, ztime); ! 124: fflush (stdout); ! 125: } ! 126: /* dump it */ ! 127: ndumped++; /* count */ ! 128: ! 129: doresps: /* process responses */ ! 130: ! 131: ! 132: while ((respnum = nxtresp (&io, notenum, respnum, &io.stime)) != -1) ! 133: { ! 134: if (lrsp (&io, notenum, respnum, &rsprec, &roffset, &rblock) == -1) ! 135: break; /* bad chain */ ! 136: if (rsprec.r_stat[roffset] & FRMNEWS) /* its from there */ ! 137: continue; /* dont go back */ ! 138: if (!cansend (rsprec.r_id[roffset].sys, sendclass))/* if can't then */ ! 139: continue; /* don't send it */ ! 140: ! 141: if (newsresp (&io, ¬e, notenum, &rsprec, roffset, ! 142: respnum, respngroup, backwards) == -1) ! 143: { ! 144: sprintf (buf, "%s/%s/%s", Mstdir, UTILITY, NETLOG); ! 145: sprdate (&whendump, ztime); ! 146: x ((log = fopen (buf, "a")) == NULL, "newsout: no log file"); ! 147: fprintf (log, "%s: Failed dumping note to NEWS for %s at %s\n", ! 148: nfname, rsprec.r_id[roffset].sys, ztime); ! 149: fclose (log); ! 150: printf ("%s: Failed dumping note to NEWS for %s at %s\n", ! 151: nfname, rsprec.r_id[roffset].sys, ztime); ! 152: fflush (stdout); ! 153: } ! 154: rdumped++; ! 155: ! 156: ! 157: } ! 158: } ! 159: ! 160: /* ! 161: * update the sequencer always. This is fine if we did send ! 162: * something for the system (and what we want to happen). ! 163: * By updating even when we don't send news, we avoid having ! 164: * to rescan those candidates we just looked at the next time. ! 165: * Eg: Running newsoutput for a usually quiet site could get ! 166: * very expensive if we didn't update this timestamp. ! 167: * ! 168: * We catch the "idle notesfile" case earlier and leave ! 169: * without scanning or updating if nothing of potential ! 170: * interest has happened since the last run. ! 171: */ ! 172: fixlast (&whendump, io.nf, NORMSEQ, Seqname); /* update sequencer */ ! 173: ! 174: if (ndumped + rdumped) /* log dump */ ! 175: { ! 176: sprintf (buf, "%s/%s/%s", Mstdir, UTILITY, NETLOG); ! 177: sprdate (&whendump, ztime); ! 178: x ((log = fopen (buf, "a")) == NULL, "newsout: missing log file"); ! 179: fprintf (log, "%s: Send (%d,%d) to NEWS at %s\n", ! 180: nfname, ndumped, rdumped, ztime); ! 181: fclose (log); ! 182: printf ("%s: Send (%d,%d) to NEWS (%s and %s) at %s\n", ! 183: nfname, ndumped, rdumped, ! 184: basengroup, respngroup, ztime); ! 185: fflush (stdout); ! 186: } ! 187: ! 188: finish (&io); /* close shop here */ ! 189: return 0; ! 190: } ! 191: ! 192: /* ! 193: * cansend(system,sendclass) ! 194: * ! 195: * check if we are gatewaying articles for the system named ! 196: * in "whichsys". Use the "sendclass" variable to check ! 197: * against sending anyone (NEWS_ALLSEND bit) ! 198: * If that doesn't qualify us, look through a list of ! 199: * sitenames in the gatesysname[] array. ! 200: */ ! 201: ! 202: cansend (sysname, class) ! 203: char *sysname; ! 204: int class; ! 205: { ! 206: int i, ! 207: j, ! 208: k; ! 209: extern int gatesyscount; /* size of array */ ! 210: extern char *gatesysnames[GATEMAX]; /* actual data */ ! 211: ! 212: if (class & NEWS_ALLSEND) ! 213: return (1); /* sending any articles */ ! 214: ! 215: /* ! 216: * This list should be sorted and we should do a binary search ! 217: * on the bugger.... ! 218: */ ! 219: for (i = 0; i < gatesyscount; i++) /* look through table */ ! 220: if (!strcmp (sysname, gatesysnames[i])) ! 221: return (1); /* find and dandy */ ! 222: ! 223: return (0); /* anything else is nogo */ ! 224: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.