|
|
1.1 root 1: #include "parms.h"
2: #include "structs.h"
3: #include "net.h"
4: #ifdef FASTSEQ
5: #include <sys/types.h>
6: #include <sys/stat.h>
7: #endif FASTSEQ
8:
9: #ifdef RCSIDENT
10: static char rcsid[] = "$Header: nfsend.c,v 1.7.0.1 85/08/04 12:16:32 notes Rel $";
11: #endif RCSIDENT
12:
13: /*
14: * nfsend will send the notes/responses to a new site that
15: * that site has not seen (at least as far as we are concerned)
16: * This means that we send them the ones that we recieved later
17: * then the last time we sent them, and also that were not
18: * written there nor were routed through there.
19: *
20: * Also, a logfile is maintained of the network transmissions made.
21: *
22: * Returns: -1 if the notefile is not a networked notefile
23: * else count of articles sent
24: *
25: * Original Coding: Ray Essick December 1981
26: */
27:
28: static struct io_f io;
29: static struct note_f note;
30: static struct resp_f rsprec;
31: static int ncount,
32: rcount, /* how many of each sent */
33: num,
34: rrecnum,
35: roffset,
36: respnum;
37: static FILE * log,
38: *zfile; /* logfile stuff */
39: static struct when_f entered;
40: static char line[DATELEN]; /* formatted date */
41: static char fn[WDLEN]; /* network log */
42: static char scrfile[WDLEN]; /* scratch file */
43: static char sendtime[DATELEN]; /* current time */
44: static struct when_f xsendtime; /* raw current time */
45: static int traffic; /* if new traffic */
46: static int opened; /* for FASTSEQ */
47:
48: nfsend (tosite, nfname, dmpfile, usetime, sendhim, proto)
49: char *tosite, /* destination site */
50: *nfname, /* notefile sending */
51: *dmpfile; /* temp file */
52: {
53:
54: traffic = 0; /* idle */
55: opened = 0; /* FASTSEQ idle */
56: strcpy (scrfile, ""); /* mark as unused */
57: rcount = ncount = 0; /* count sent */
58: gettime (&xsendtime);
59: sprdate (&xsendtime, sendtime); /* format xmit time */
60: sprintf (Seqname, "Sy:%s", tosite); /* sequencer name */
61:
62:
63: #ifdef FASTSEQ
64: {
65: struct when_f whenvec;
66: char NoteFile[WDLEN];
67: struct stat StatBuf;
68:
69: if (nfname[0] == '/') /* absolute pathname */
70: {
71: getlast (&io.stime, rindex (nfname, '/') + 1, usetime, Seqname);
72: sprintf (NoteFile, "%s/%s", nfname, TEXT);
73: }
74: else /* relative to Mstdir */
75: {
76: getlast (&io.stime, nfname, usetime, Seqname);
77: sprintf (NoteFile, "%s/%s/%s", Mstdir, nfname, TEXT);
78: }
79: if (stat (NoteFile, &StatBuf) >= 0)
80: {
81: maketime (&whenvec, (long) StatBuf.st_mtime);
82: if (inorder (&whenvec, &io.stime))
83: {
84: return (0); /* nothing new */
85: }
86: }
87: }
88: #endif FASTSEQ
89:
90: if (init (&io, nfname) < 0)
91: {
92: printf ("Couldn't open %s, try again later\n", nfname);
93: fflush (stdout);
94: return (-1);
95: }
96:
97: opened++; /* nfsenddone will close */
98:
99: getperms (&io, 1, tosite); /* grab system name */
100: if (!allow (&io, READOK)) /* read permission? */
101: {
102: printf ("Site %s has no read permission for %s\n",
103: tosite, nfname);
104: fflush (stdout);
105: return (-1); /* and go back */
106: }
107:
108: if ((io.descr.d_stat & NETWRKD) == 0)
109: {
110: printf ("Notefile %s is not networked\n", nfname);
111: fflush (stdout);
112: return (-1);
113: }
114:
115:
116: gettime (&entered); /* for seq. update */
117: getlast (&io.stime, io.nf, usetime, Seqname); /* grab the time */
118:
119: if (!inorder (&io.stime, &io.descr.d_lastm)) /* something new */
120: { /* idle notesfile */
121: #ifdef FASTSEQ
122: /*
123: * update the sequencer so the next pass through will be
124: * caught by the FASTSEQ test which just stats the file.
125: */
126: fixlast (&entered, io.nf, NORMSEQ, Seqname); /* update sequencer */
127: #endif FASTSEQ
128: return (0);
129: }
130: /*
131: * reach here only if we have potential traffic
132: * and permission to send it.
133: */
134: traffic++; /* forces seq update */
135:
136: x ((zfile = fopen (dmpfile, "w")) == NULL, "nfsend: scratch");
137: strcpy (scrfile, dmpfile); /* save scratch name */
138: num = 0; /* start at the beginning */
139: while ((num = nxtnote (&io, num, &io.stime)) != -1)
140: {
141: getnrec (&io, num, ¬e); /* grab the header */
142: if (!strcmp (note.n_from, tosite) && !(sendhim & SENDHIS))
143: goto doresps; /* they sent it to us */
144: if (!strcmp (note.n_id.sys, tosite) && !(sendhim & SENDHIS))
145: goto doresps; /* written there */
146: if (inorder (&io.stime, ¬e.n_rcvd) == 0)
147: goto doresps; /* only modified */
148: if ((note.n_stat & FRMNEWS) && !(sendhim & SENDNEWS))/* DO NOT send news */
149: goto doresps; /* causes uniqid probs */
150: #ifdef notdef
151: /*
152: * we want to send foster parents so they will have a title on
153: * the remote end.
154: */
155: if (note.n_stat & ORPHND) /* no foster parents */
156: goto doresps; /* should have copy */
157: #endif notdef
158: dmpnote (&io, ¬e, num, zfile, NODETAIL, proto);/* dump to output */
159: ncount++; /* bump count of sent articles */
160: io.nnotxmit++; /* and global stats */
161:
162: doresps: /* process the responses */
163: respnum = 0;
164: while ((respnum = nxtresp (&io, num, respnum, &io.stime)) != -1)
165: {
166: if (lrsp (&io, num, respnum, &rsprec, &roffset, &rrecnum) == -1)
167: break; /* no response */
168: if (!strcmp (rsprec.r_id[roffset].sys, tosite) && !(sendhim & SENDHIS))
169: continue; /* written there */
170: if (!strcmp (rsprec.r_from[roffset], tosite) && !(sendhim & SENDHIS))
171: continue; /* came through there */
172: if ((rsprec.r_stat[roffset] & FRMNEWS) && !(sendhim & SENDNEWS))
173: continue; /* never forward NEWS(I) stuff */
174: dmprsp (&io, ¬e, num, zfile, respnum, NODETAIL, proto);
175: rcount++;
176: io.nrspxmit++; /* and global stats */
177: }
178: }
179: fclose (zfile); /* and the dumping file */
180: return (ncount + rcount);
181: }
182:
183: /*
184: * nfsendone fixes up the sequencer entry for the system/notesfile
185: * pair. The sequencer is only updated if the transmission
186: * was successful (as determined by the retval parameter.
187: *
188: * Thanks to Malcolm Slaney for this one.
189: */
190:
191: nfsendone (nfname, tosite, queuestat, sendstat)
192: char *tosite; /* Name of site */
193: char *nfname; /* Name of notesfile */
194: int queuestat; /* Unix return value */
195: {
196:
197: /*
198: * Traffic is non-zero if something happened in that notesfile
199: * If nothing at all happened, we save the bother of updating
200: * since it doesn't save us any scanning time later.
201: * (and not updating does save us a little time now)
202: *
203: * We check queuestat because we don't want to update the
204: * sequencer file if we know that the transmission failed.
205: */
206: if (traffic && (!queuestat)) /* only if non-idle */
207: {
208: fixlast (&entered, io.nf, NORMSEQ, Seqname); /* update sequencer */
209: }
210:
211: /*
212: * Update statistics only on successful non-empty transmissions.
213: * We don't do any statistics for empty transmissions
214: */
215: #ifdef STATS
216: if ((!queuestat) && (sendstat > 0)) /* if it worked */
217: { /* and sent */
218: locknf (&io, DSCRLOCK);
219: getdscr (&io, &io.descr);
220: gettime (&io.descr.d_lstxmit); /* mark as sent now */
221: if (ncount + rcount > 0) /* only if sent stuff */
222: io.descr.netwrkouts++; /* increment xmits */
223: putdscr (&io, &io.descr);
224: unlocknf (&io, DSCRLOCK);
225: }
226: #endif STATS
227:
228: if (opened) /* did init(&io,nf) */
229: finish (&io); /* so close it */
230: /*
231: * Now log everything that happened
232: */
233:
234: sprdate (&io.stime, line);
235: sprintf (fn, "%s/%s/%s", Mstdir, UTILITY, NETLOG); /* logging */
236: if (sendstat >= 0) /* no bizarre errors */
237: {
238: if (ncount + rcount) /* log only if sending */
239: {
240: x ((log = fopen (fn, "a")) == NULL, "nfsend: bad net log file");
241: fprintf (log, "%s: %s send (%3d,%3d) to %-10s at %s\n",
242: nfname, queuestat ? "Fail" : "Did", ncount, rcount,
243: tosite, sendtime);
244: x (fclose (log) == EOF, "nfsend: trouble fclosing log file");
245: printf ("%-14s: %4s send (%3d,%3d) to %s since %s\n",
246: nfname, queuestat ? "Fail" : "Did", ncount, rcount,
247: tosite, line);
248: }
249: else
250: {
251: printf ("%-14s: No new notes since %s\n", nfname, line);
252: }
253: fflush (stdout); /* force it out */
254:
255: }
256:
257: if (strcmp (scrfile, "") != 0) /* contains a name */
258: {
259: unlink (scrfile); /* don't leave droppings */
260: }
261:
262: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.