Annotation of 43BSD/contrib/notes/src/nfsend.c, revision 1.1

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, &note);                      /* 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, &note.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, &note, 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, &note, 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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.