2.9BSD/usr/contrib/notes/nfsend.c
static char *sccsid = "%W%";
#include "parms.h"
#include "structs.h"
/*
* nfsend will send the notes/responses to a new site that
* that site has not seen (at least as far as we are concerned)
* This means that we send them the ones that we received later
* then the last time we sent them, and also that were not
* written there nor were routed through there.
*
* Also, a logfile is maintained of the network transmissions made.
*
* Returns: -1 if the notefile is not a networked notefile
* else count of articles sent
*
* Original Coding: Ray Essick December 1981
*/
nfsend (tosite, nfname, dmpfile, usetime, atime, sendnews)
char *tosite, /* name of site we are sending to */
*nfname, /* name of notefile sending to them */
*dmpfile; /* and name of local file to place articles in */
struct when_f *atime; /* for explicitly specified times */
{
struct io_f io;
struct note_f note;
struct resp_f rsprec;
int ncount,
rcount, /* how many of each sent */
num,
rrecnum,
roffset,
respnum;
FILE * log,
*zfile,
*fopen (); /* logfile stuff */
struct when_f entered;
char seqname[SYSSZ + 20]; /* buffer for sequencer name */
char line[DATELEN]; /* hold a formatted date */
char fn[WDLEN]; /* path to network log */
char sendtime[DATELEN]; /* time we are doing this at */
struct when_f xsendtime; /* unformatted of above */
gettime (&xsendtime);
sprdate (&xsendtime, sendtime); /* format when we sent it */
x ((zfile = fopen (dmpfile, "w")) == NULL, "nfsend: scratch");
if (init (&io, nfname) < 0) {
printf ("%s: no such notesfile: %s\n",SYSTEM,nfname);
fclose (zfile);
return(-1);
}
if (allow (&io, DRCTOK) == 0) { /* must be director */
printf ("%s: not a director of %s\n", SYSTEM, nfname);
fclose (zfile);
finish (&io);
return(-1);
}
getperms (&io, 1, tosite); /* grab system name */
if (allow (&io, READOK) == 0) { /* is he allowed to read ?? */
printf ("%s: site %s has no read permission for %s\n",
SYSTEM, tosite, nfname);
finish (&io); /* close it */
fclose (zfile);
return(-1); /* and go back */
}
if ((io.descr.d_stat & NETWRKD) == 0) {
printf ("%s: notefile %s is not networked\n", SYSTEM, nfname);
finish (&io);
fclose (zfile);
return(-1);
}
gettime (&entered); /* get time for updating sequencer */
sprintf (seqname, "Sy:%s", tosite); /* make sequencer name */
getlast (&io.stime, nfname, 1, seqname); /* grab the time */
if (usetime) {
copydate (atime, &io.stime); /* use this one instead */
}
sprdate (&io.stime, line);
printf ("%s: %s: Sending articles more recent than %s to %s\n",SYSTEM, nfname, line, tosite);
rcount = ncount = 0; /* how many things sent */
num = 0; /* start at the beginning */
while ((num = nxtnote (&io, num, &io.stime)) != -1) {
getnrec (&io, num, ¬e); /* grab the header */
if (strcmp (note.n_from, tosite) == 0) {
goto doresps; /* they sent it to us */
}
if (strcmp (note.n_id.sys, tosite) == 0) {
goto doresps; /* written there */
}
if (inorder (&io.stime, ¬e.n_rcvd) == 0) {
goto doresps; /* just modified since then */
}
if ((note.n_stat & FRMNEWS) && (sendnews == 0)) { /* DO NOT send news */
goto doresps; /* cause uniqid probs */
}
/* they should have copy */
dmpnote(&io, ¬e, num, zfile, NODETAIL); /* dump to output */
ncount++; /* bump count of sent articles */
io.nnotxmit++; /* and global stats */
doresps: /* process the responses */
respnum = 0;
while ((respnum = nxtresp (&io, num, respnum, &io.stime)) != -1) {
if (lrsp(&io, num, respnum, &rsprec, &roffset, &rrecnum) == -1)
break; /* no response */
if (strcmp(rsprec.r_id[roffset].sys, tosite) == 0) {
continue; /* written over there */
}
if (strcmp(rsprec.r_from[roffset], tosite) == 0) {
continue; /* came from over there */
}
if ((rsprec.r_stat[roffset] & FRMNEWS) && (sendnews == 0)) {
continue; /* never forward NEWS(I) stuff */
}
dmprsp(&io, ¬e, num, zfile, respnum, NODETAIL);
rcount++;
io.nrspxmit++; /* and global stats */
}
}
fixlast (&entered, nfname, 1, seqname); /* update the sequencer time */
lock(&io, 'n');
getdscr(&io, &io.descr);
gettime(&io.descr.d_lstxmit); /* mark as sent now */
if (ncount + rcount > 0) { /* only if sent stuff */
io.descr.netwrkouts++; /* increment number of xmits */
}
putdscr(&io, &io.descr);
unlock(&io, 'n');
finish(&io); /* close the notefile */
fclose(zfile); /* and the dumping file */
printf("%s: %s: %d notes & %d responses sent to %s\n",
SYSTEM, nfname, ncount, rcount, tosite);
sprintf(fn, "%s/%s/%s", MSTDIR, UTILITY, NETLOG);
if (ncount + rcount) { /* log only if sending */
glock(&io, LOGLOCK); /* now, update the log file */
x ((log = fopen(fn, "a")) == NULL, "nfsend: bad net log file");
fprintf(log, "%s: sent %d notes & %d responses to %s at %s\n",
nfname, ncount, rcount, tosite, sendtime);
x (fclose(log) == EOF, "nfsend: trouble fclosing log file");
gunlock(&io, LOGLOCK); /* and unlock */
}
return(ncount+rcount);
}