Annotation of 43BSDTahoe/new/notes/src/loadem.c, revision 1.1.1.1

1.1       root        1: #include "parms.h"
                      2: #include "structs.h"
                      3: 
                      4: #ifdef RCSIDENT
                      5: static char rcsid[] = "$Header: loadem.c,v 1.7.0.1 85/04/11 09:23:51 notes Rel $";
                      6: #endif RCSIDENT
                      7: 
                      8: /*
                      9:  *     load a file of generic notes.
                     10:  *     This routine will read the file supplied ( as an fid )   
                     11:  *     and place it into the notefile.
                     12:  *     locking is supressed if the lockit flag is false
                     13:  *     uids are mapped to zero if the system that the note came from
                     14:  *     does not match the local system.
                     15:  *
                     16:  *     Original coding:        Ray Essick      December 1981
                     17:  *     Recoding:               Ray Essick      March 1984
                     18:  *                             Streamlining, prepare for alternate protocols
                     19:  */
                     20: 
                     21: /*
                     22:  *     routines for loading notes and responses
                     23:  */
                     24: extern int  loadnote ();                               /* proto 0 note */
                     25: extern int  loadresp ();                               /* proto 0 resp */
                     26: extern int  ldnote1 ();                                        /* proto 1 note */
                     27: extern int  ldresp1 ();                                        /* proto 1 resp */
                     28: 
                     29: /*
                     30:  *     jump tables pointing to the proper routines to parse
                     31:  *     notes and responses in the assorted protocols
                     32:  */
                     33: static int  (*noteproto[]) () =                                /* notes */
                     34: {
                     35:                 loadnote
                     36: };
                     37: static int  (*respproto[]) () =                                /* responses */
                     38: {
                     39:                 loadresp
                     40: };
                     41: static int  nproto = sizeof noteproto / sizeof noteproto[0];
                     42: static int  rproto = sizeof respproto / sizeof respproto[0];
                     43: 
                     44: 
                     45: loadem (io, infile, lockit, whofrom, extensive, articles)
                     46: struct io_f *io;
                     47: FILE * infile;
                     48: char   *whofrom;
                     49: {
                     50:     char    oneline[BUFSIZ];                           /* hold a line */
                     51:     char    articletype[32];                           /* proto switching */
                     52:     int     proto;                                     /* dynamic protocol */
                     53:     int     loaded;                                    /* article count */
                     54: 
                     55:     loaded = 0;
                     56:     while (loaded != articles &&                       /* if want more */
                     57:            fgets (oneline, sizeof (oneline) - 1, infile) != (char *) NULL)
                     58:     {
                     59:        switch (oneline[0])                             /* what is it */
                     60:        {
                     61:            case 'N':                                   /* proto 1 note */
                     62:                loadnote (io, oneline, whofrom, extensive, lockit, infile);
                     63:                loaded++;                               /* count it */
                     64:                break;
                     65: 
                     66:            case 'R':                                   /* proto 1 response */
                     67:                loadresp (io, oneline, whofrom, extensive, lockit, infile);
                     68:                loaded++;                               /* count */
                     69:                break;
                     70: 
                     71: /*
                     72:  *     Code to catch later protocols.  This is currently unimplemented
                     73:  */
                     74:            case 'P':                                   /* newer protocol */
                     75:                sscanf (oneline, "Protocol: %d %s", &proto, articletype);
                     76:                if (proto == 0)                         /* old protocol */
                     77:                    break;                              /* to while() loop */
                     78:                if (!strcmp (articletype, "Note"))
                     79:                {
                     80:                    if (proto < nproto)                 /* exists */
                     81:                        (*noteproto[proto]) (io, whofrom, extensive, lockit, infile);
                     82:                    else
                     83:                        printf ("Unsupported note protocol %d\n", proto);
                     84:                }
                     85:                else                                    /* assume response */
                     86:                {
                     87:                    if (proto < rproto)                 /* exists */
                     88:                        (*respproto[proto]) (io, whofrom, extensive, lockit, infile);
                     89:                    else
                     90:                        printf ("Unsupported response protocol %d\n", proto);
                     91:                }
                     92: 
                     93:            default:                                    /* bong it */
                     94:                x (1, "loadem: Bad generic format");
                     95:                break;
                     96:        }
                     97:     }
                     98: }
                     99: 
                    100: /*
                    101:  *     loadnote(line,infile)
                    102:  *
                    103:  *     Load a note in protocol 1. line points to the first line
                    104:  *     of the article's header.
                    105:  */
                    106: 
                    107: loadnote (io, firstline, whofrom, extensive, lockit, infile)
                    108: struct io_f *io;
                    109: char   *firstline;
                    110: char   *whofrom;
                    111: FILE * infile;
                    112: {
                    113:     char    oneline[BUFSIZ];                           /* hold lines */
                    114:     long    count;
                    115:     long    count2;
                    116:     int     i;
                    117:     char    title[TITLEN];
                    118:     struct note_f   note,
                    119:                     note2;
                    120:     struct id_f noteid;
                    121:     struct daddr_f  where;
                    122:     struct auth_f   auth;
                    123:     int     posit;
                    124:     int     status;
                    125:     int     fields;                                    /* scanf retcodes */
                    126:     char    field1[101],                               /* scanf temps */
                    127:             field2[100];
                    128: 
                    129: /*
                    130:  *     grab unique id (sys,integer). Ignore "number of responses"
                    131:  */
                    132:     sscanf (firstline, "N:%99[^:]:%ld", field1, &noteid.uniqid);
                    133:     strncpy (noteid.sys, field1, SYSSZ);
                    134:     noteid.sys[SYSSZ - 1] = '\0';                      /* terminate */
                    135: 
                    136:     fgets (oneline, sizeof (oneline) - 1, infile);     /* title */
                    137:     for (i = 0; (i < TITLEN) && oneline[i] && (oneline[i] != '\n'); i++)
                    138:        title[i] = oneline[i];
                    139:     if (i < TITLEN)
                    140:        title[i] = '\0';
                    141:     else
                    142:        title[TITLEN - 1] = '\0';                       /* make sure it stops */
                    143:     for (i = strlen (title) - 1; i >= 0 && title[i] == ' '; i--)
                    144:        title[i] = '\0';                                /* chop trailing spaces */
                    145: 
                    146:     fgets (oneline, sizeof (oneline) - 1, infile);     /* author */
                    147:     fields = sscanf (oneline, "%99[^:]:%d:%99[^:]:",
                    148:            field1, &auth.aid, field2);
                    149:     strncpy (auth.aname, field1, NAMESZ);
                    150:     auth.aname[NAMESZ - 1] = '\0';                     /* shift name */
                    151:     if (fields < 3)                                    /* no home system -- */
                    152:     {
                    153:        strcpy (auth.asystem, noteid.sys);              /* use unique id */
                    154:     }
                    155:     else
                    156:     {
                    157:        strncpy (auth.asystem, field2, HOMESYSSZ);
                    158:        auth.asystem[HOMESYSSZ - 1] = '\0';             /* terminate */
                    159:     }
                    160:     auth.aid &= UIDMASK;
                    161:     if (strcmp (System, noteid.sys) != 0)              /* map non-local to */
                    162:        auth.aid = Anonuid;                             /* local anonymous */
                    163: 
                    164:     fgets (oneline, sizeof (oneline) - 1, infile);     /* time written */
                    165:     timein (oneline, &note.n_date);                    /* fills in if bad */
                    166: 
                    167:     if (extensive)                                     /* if reloading */
                    168:     {
                    169:        fgets (oneline, sizeof (oneline) - 1, infile);  /* received */
                    170:        timein (oneline, &note.n_rcvd);
                    171:        fgets (oneline, sizeof (oneline) - 1, infile);  /* last modified */
                    172:        timein (oneline, &note.n_lmod);
                    173:        fgets (oneline, sizeof (oneline) - 1, infile);  /* from */
                    174:        sscanf (oneline, "%s", field1);
                    175:        strncpy (note.n_from, field1, SYSSZ);
                    176:        note.n_from[SYSSZ - 1] = '\0';                  /* make sure */
                    177:     }
                    178:     else
                    179:     {
                    180:        strcpy (note.n_from, whofrom);                  /* who gave it to us */
                    181:     }
                    182: 
                    183:     do
                    184:     {
                    185:        fgets (oneline, sizeof (oneline) - 1, infile);  /* status */
                    186:        /* 
                    187:         * old code forgot that fgets keeps the newline and didn't
                    188:         * remove it before a strcpy. result is that we have a bunch
                    189:         * of notesfiles with "\n" in the n_from field. This
                    190:         * lets a nfdump/nfload cycle clear them up for us.
                    191:         */
                    192:     } while (oneline[0] == '\n');                      /* fix old bug */
                    193:     sscanf (oneline, "%o:%ld", &status, &count);
                    194: 
                    195: 
                    196:     if (extensive == 0)                                        /* if not reloading */
                    197:     {
                    198:        getperms (io, 1, noteid.sys);                   /* check permission */
                    199:        if (!allow (io, WRITOK))                        /* not allowed */
                    200:        {
                    201:            io -> nnotdrop++;                           /* drop it */
                    202:            for (count2 = 0; count2 < count; count2++)  /* drop message */
                    203:                getc (infile);                          /* ignore the character */
                    204:            return;                                     /* back for another */
                    205:        }
                    206:     }
                    207: 
                    208:     if (lockit)
                    209:        locknf (io, DSCRLOCK);                          /* lock us up now */
                    210:     posit = chknote (io, &noteid, &note2);             /* see if here */
                    211:     if (posit == 0)                                    /* not in data base */
                    212:     {
                    213:        for (i = 0; i < SYSSZ; i++)
                    214:            note.n_id.sys[i] = noteid.sys[i];
                    215:        note.n_id.uniqid = noteid.uniqid;               /* copy unique id in */
                    216:        puttrec (io, infile, &where, count);            /* suck text */
                    217:        putnote (io, &where, title, status, &note, &auth, NOPOLICY,
                    218:                NOLOCKIT, NOADDID, note.n_from, (extensive == NODETAIL));
                    219:        io -> nnotrcvd++;                               /* count as a recieved */
                    220:     }
                    221:     else
                    222:     {
                    223: /*
                    224:  *     A copy exists. See if the one here is an orphan and possibly
                    225:  *     replace it
                    226:  */
                    227:        if ((note2.n_stat & ORPHND) && NOT (status & ORPHND))
                    228:        {                                               /* extant is orphan */
                    229:                                                        /* new one isn't */
                    230:            puttrec (io, infile, &note2.n_addr, count); /* suck text */
                    231:            gettime (&note2.n_rcvd);
                    232:            gettime (&note2.n_lmod);                    /* time stamp it */
                    233:            copyauth (&auth, &note2.n_auth);            /* load author */
                    234:            note2.n_stat = status;                      /* correct status */
                    235:            strncpy (note2.ntitle, title, TITLEN);
                    236:            copydate (&note.n_date, &note2.n_date);
                    237:            strmove (note.n_from, note2.n_from);
                    238:            putnrec (io, posit, &note2);                /* and replace */
                    239:            io -> adopted++;                            /* orphan adopted */
                    240:            printf ("Foster Parent Replaced. Id=%ld@%s\n",
                    241:                    noteid.uniqid, noteid.sys);
                    242:        }
                    243:        else
                    244:        {
                    245:            for (count2 = 0; count2 < count; count2++)
                    246:                getc (infile);                          /* skip text */
                    247:            printf ("Duplicate note recieved id=%ld@%s\n",
                    248:                    noteid.uniqid, noteid.sys);
                    249:            io -> nnotdrop++;                           /* count a dropped */
                    250:        }
                    251:     }
                    252: 
                    253:     if (lockit)
                    254:        unlocknf (io, DSCRLOCK);                        /* release lock */
                    255: }
                    256: 
                    257: /*
                    258:  *     loadresp(firstline,infile)
                    259:  *
                    260:  *     load a protocol 1 response
                    261:  */
                    262: 
                    263: loadresp (io, firstline, whofrom, extensive, lockit, infile)
                    264: struct io_f *io;
                    265: char   *firstline;
                    266: char   *whofrom;
                    267: FILE * infile;
                    268: {
                    269:     char    oneline[BUFSIZ];
                    270:     long    count;
                    271:     long    count2;
                    272:     struct note_f   note;
                    273:     struct id_f noteid,
                    274:                 respid;
                    275:     struct auth_f   auth;
                    276:     struct daddr_f  where;
                    277:     struct when_f   ztime,
                    278:                     ztime2;
                    279:     char    zfrom[BUFSIZ];                             /* usually <10 */
                    280:     int     status;
                    281:     int     fosterstat;
                    282:     int     posit;
                    283:     int     fields;                                    /* scanf return codes */
                    284:     char    field1[100],                               /* scanf temps */
                    285:             field2[100];
                    286:     int     i;
                    287:     char   *p;
                    288: 
                    289: /*
                    290:  *     parse the parent id and the response id.
                    291:  */
                    292:     sscanf (firstline, "R:%99[^:]:%ld:%99[^:]:%ld",
                    293:            field1, &noteid.uniqid,
                    294:            field2, &respid.uniqid);
                    295:     strncpy (noteid.sys, field1, SYSSZ);
                    296:     strncpy (respid.sys, field2, SYSSZ);
                    297:     noteid.sys[SYSSZ - 1] = respid.sys[SYSSZ - 1] = '\0';
                    298: 
                    299:     fgets (oneline, sizeof (oneline) - 1, infile);     /* author */
                    300:     fields = sscanf (oneline, "%99[^:]:%d:%99[^:]:",
                    301:            field1, &auth.aid, field2);
                    302:     strncpy (auth.aname, field1, NAMESZ);              /* shift and */
                    303:     auth.aname[NAMESZ - 1] = '\0';                     /* terminate */
                    304:     if (fields < 3)                                    /* no home system */
                    305:     {
                    306:        strcpy (auth.asystem, respid.sys);              /* use unique id */
                    307:     }
                    308:     else
                    309:     {
                    310:        strncpy (auth.asystem, field2, HOMESYSSZ);
                    311:        auth.asystem[HOMESYSSZ - 1] = '\0';
                    312:     }
                    313:     auth.aid &= UIDMASK;                               /* mask appropriately */
                    314:     if (strcmp (System, note.n_id.sys) != 0)           /* map non-local to */
                    315:        auth.aid = Anonuid;                             /* local anonymous */
                    316: 
                    317:     fgets (oneline, sizeof (oneline) - 1, infile);     /* date written */
                    318:     timein (oneline, &ztime);
                    319: 
                    320:     if (extensive)                                     /* if reloading */
                    321:     {
                    322:        fgets (oneline, sizeof (oneline) - 1, infile);  /* date received */
                    323:        timein (oneline, &ztime2);
                    324:        fgets (oneline, sizeof (oneline) - 1, infile);  /* received from */
                    325:        sscanf (oneline, "%s", field1);
                    326:        strncpy (zfrom, field1, SYSSZ);
                    327:        zfrom[SYSSZ - 1] = '\0';                        /* make sure */
                    328:     }
                    329:     else
                    330:     {
                    331:        strcpy (zfrom, whofrom);                        /* who gave it to us */
                    332:     }
                    333: 
                    334:     do
                    335:     {
                    336:        fgets (oneline, sizeof (oneline) - 1, infile);  /* status */
                    337:        /* 
                    338:         * old code forgot that fgets keeps the newline and didn't
                    339:         * remove it before a strcpy. result is that we have a bunch
                    340:         * of notesfiles with "\n" in the n_from field. This
                    341:         * lets a nfdump/nfload cycle clear them up for us.
                    342:         */
                    343:     } while (oneline[0] == '\n');                      /* fix old bug */
                    344:     sscanf (oneline, "%o:%ld", &status, &count);
                    345: 
                    346: 
                    347:     if (lockit)
                    348:        locknf (io, DSCRLOCK);                          /* CRITICAL SECTION */
                    349:     posit = chknote (io, &noteid, &note);              /* look for daddy */
                    350:     if (posit == 0)                                    /* no daddy */
                    351:     {                                                  /* build foster parent */
                    352:        strcpy (note.n_id.sys, noteid.sys);
                    353:        note.n_id.uniqid = noteid.uniqid;
                    354:        note.n_nresp = 0;
                    355:        note.n_auth.aid = Anonuid;
                    356:        strcpy (note.n_auth.aname, "Unknown");
                    357:        strcpy (note.n_auth.asystem, note.n_id.sys);    /* use unique id */
                    358:        copydate (&ztime, &note.n_date);
                    359:        fosterstat = ORPHND;                            /* mark as foster */
                    360:        strcpy (note.ntitle, "Orphaned Response");
                    361:        where.addr = 0;                                 /* no text */
                    362:        where.textlen = 0;
                    363:        posit = putnote (io, &where, note.ntitle, fosterstat, &note,
                    364:                &note.n_auth, NOPOLICY, NOLOCKIT, NOADDID, whofrom, ADDTIME);
                    365:        io -> norphans++;                               /* count orphans */
                    366:        printf ("Response Id=%ld@%s is an orphan of note Id=%ld@%s\n",
                    367:                respid.uniqid, respid.sys,
                    368:                noteid.uniqid, noteid.sys);
                    369:     }
                    370: /*
                    371:  *     we definitely have a parent here, since we either found one
                    372:  *     or created one
                    373:  */
                    374:     if (chkresp (io, &respid, &note, posit) == 0)      /* response here */
                    375:     {
                    376:        if (extensive == 0)                             /* if not reloading */
                    377:            getperms (io, 1, respid.sys);               /* can he? */
                    378:        if (allow (io, RESPOK) || extensive)
                    379:        {
                    380:            puttrec (io, infile, &where, count);        /* read text */
                    381:            putresp (io, &where, status, posit, &ztime, &auth,
                    382:                    &note, 0, &respid, 0, zfrom, (extensive == NODETAIL), &ztime2);
                    383:            io -> nrsprcvd++;                           /* he is a rcvd ! */
                    384:        }
                    385:        else
                    386:        {                                               /* no permission */
                    387:            io -> nrspdrop++;                           /* dropped */
                    388:            for (count2 = 0; count2 < count; count2++)
                    389:                getc (infile);                          /* skip text */
                    390:        }
                    391:     }
                    392:     else
                    393:     {                                                  /* copy already here */
                    394:        io -> nrspdrop++;                               /* on the floor */
                    395:        for (count2 = 0; count2 < count; count2++)
                    396:            getc (infile);                              /* skip text */
                    397:        printf ("Duplicate response id=%ld@%s to note id=%ld@%s\n",
                    398:                respid.uniqid, respid.sys, noteid.uniqid, noteid.sys);
                    399:     }
                    400:     if (lockit)
                    401:        unlocknf (io, DSCRLOCK);                        /* no longer critical */
                    402: }

unix.superglobalmegacorp.com

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