|
|
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, ¬eid.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, ¬e.n_date); /* fills in if bad */ ! 166: ! 167: if (extensive) /* if reloading */ ! 168: { ! 169: fgets (oneline, sizeof (oneline) - 1, infile); /* received */ ! 170: timein (oneline, ¬e.n_rcvd); ! 171: fgets (oneline, sizeof (oneline) - 1, infile); /* last modified */ ! 172: timein (oneline, ¬e.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, ¬eid, ¬e2); /* 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, ¬e, &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, ¬e2.n_addr, count); /* suck text */ ! 231: gettime (¬e2.n_rcvd); ! 232: gettime (¬e2.n_lmod); /* time stamp it */ ! 233: copyauth (&auth, ¬e2.n_auth); /* load author */ ! 234: note2.n_stat = status; /* correct status */ ! 235: strncpy (note2.ntitle, title, TITLEN); ! 236: copydate (¬e.n_date, ¬e2.n_date); ! 237: strmove (note.n_from, note2.n_from); ! 238: putnrec (io, posit, ¬e2); /* 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, ¬eid.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, ¬eid, ¬e); /* 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, ¬e.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, ¬e, ! 364: ¬e.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, ¬e, 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: ¬e, 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.