Annotation of 43BSD/contrib/notes/src/newsout.c, revision 1.1.1.1

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, &note);                  /* get descriptor */
                    104:        respnum = 0;                                    /* response chain */
                    105:        if (inorder (&io.stime, &note.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, &note, 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, &note, 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: }

unix.superglobalmegacorp.com

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