|
|
1.1 ! root 1: #include "parms.h" ! 2: #include "structs.h" ! 3: #include "dump.h" ! 4: ! 5: #ifdef RCSIDENT ! 6: static char rcsid[] = "$Header: loadnf.c,v 1.7 85/01/18 15:41:25 notes Rel $"; ! 7: #endif RCSIDENT ! 8: ! 9: /* ! 10: * loadnf(basedir, nfname, infile) ! 11: * ! 12: * creates and loads a notesfile. Notesfile is read in from ! 13: * FILE *infile. Given name "nfname" in directory "basedir". ! 14: * ! 15: */ ! 16: ! 17: loadnf (basedir, nfname, infile) ! 18: char *basedir; ! 19: char *nfname; ! 20: FILE * infile; ! 21: { ! 22: struct io_f io; ! 23: char pathname[BUFSIZ]; ! 24: struct note_f note; ! 25: ! 26: if (buildnf (nfname, basedir, 0, 0, 0) < 0) /* damn */ ! 27: { ! 28: printf ("Unable to create notesfile %s in %s\n", nfname, basedir); ! 29: return (-1); /* failed right away */ ! 30: } ! 31: sprintf (pathname, "%s/%s", basedir, nfname); ! 32: if (init (&io, pathname) < 0) /* pisser */ ! 33: { ! 34: printf ("Unable to open newly created notesfile %s\n", pathname); ! 35: return (-1); ! 36: } ! 37: ! 38: /* ! 39: * Well, now that we have an open notesfile, let's start ! 40: * layering in the appropriate information from the file. ! 41: * ! 42: * First thing in is the notesfile descriptor. ! 43: */ ! 44: ! 45: locknf (&io, DSCRLOCK); /* Ensure privacy */ ! 46: getdscr (&io, &io.descr); ! 47: loaddescr (&io.descr, infile); /* loads it */ ! 48: putdscr (&io, &io.descr); /* save it */ ! 49: if (io.descr.d_plcy) /* policy there? */ ! 50: { ! 51: loadem (&io, infile, NOLOCKIT, "Noplace", DETAIL, 1);/* load */ ! 52: getdscr (&io, &io.descr); /* update descr */ ! 53: getnrec (&io, io.descr.d_nnote, ¬e); /* grab */ ! 54: putnrec (&io, 0, ¬e); /* move */ ! 55: io.descr.d_nnote--; ! 56: putdscr (&io, &io.descr); /* fix count */ ! 57: } ! 58: ! 59: /* ! 60: * Now we should load the access lists. This isn't ! 61: * perfect since this loading mechanism won't remove ! 62: * the "Other" entries that are placed there by default. ! 63: */ ! 64: ! 65: loadaccess (&io, infile); /* load it */ ! 66: ! 67: /* ! 68: * Now, load the notesfile text itself. ! 69: * This is the easiest part. ! 70: */ ! 71: ! 72: loadem (&io, infile, NOLOCKIT, "Noplace", DETAIL, -1);/* load articles */ ! 73: ! 74: /* ! 75: * use closenf() instead of finish() to circumvent screwing ! 76: * with statistics. ! 77: */ ! 78: unlocknf (&io, DSCRLOCK); /* all done */ ! 79: closenf (&io); ! 80: return (0); ! 81: ! 82: } ! 83: ! 84: /* ! 85: * loaddescr(&descr_f, infile) ! 86: * ! 87: * Read an ASCII representation of the notesfile descriptor ! 88: * and load it. ! 89: */ ! 90: ! 91: loaddescr (descr, infile) ! 92: struct descr_f *descr; ! 93: FILE * infile; ! 94: { ! 95: register int varno; /* variable parsed */ ! 96: register char *field; /* field data */ ! 97: register int i; ! 98: long longval; /* sscanf temp */ ! 99: char line[BUFSIZ]; /* line buffer */ ! 100: ! 101: while (fgets (line, sizeof line, infile) != NULL) /* read */ ! 102: { ! 103: if ((varno = rfcparse (line, descrnames)) == -1)/* nothing */ ! 104: continue; /* ignore */ ! 105: if (varno == NF_DESCRIPTOR) /* end sentinel */ ! 106: return (0); /* all cool */ ! 107: field = index (line, ':'); /* find data */ ! 108: field++; /* skip colon */ ! 109: field++; /* and space */ ! 110: switch (varno) /* parse line */ ! 111: { ! 112: case NF_TITLE: ! 113: for (i = 0; i < NNLEN && *field != '\n'; i++, field++) ! 114: descr -> d_title[i] = *field; ! 115: if (i < NNLEN) ! 116: descr -> d_title[i] = '\0'; /* fill */ ! 117: else ! 118: descr -> d_title[NNLEN - 1] = '\0'; ! 119: break; ! 120: case NF_DIRECTOR_MESSAGE: ! 121: for (i = 0; i < DMLEN && *field != '\n'; i++, field++) ! 122: descr -> d_drmes[i] = *field; ! 123: if (i < DMLEN) ! 124: descr -> d_drmes[i] = '\0'; /* fill */ ! 125: else ! 126: descr -> d_drmes[DMLEN - 1] = '\0'; /* fill */ ! 127: break; ! 128: case NF_LAST_MODIFIED: ! 129: parsetime (field, &descr -> d_lastm); /* get it */ ! 130: break; ! 131: case NF_STATUS: ! 132: { ! 133: char statname[32]; /* status token */ ! 134: char *p; /* into token list */ ! 135: ! 136: p = field; ! 137: p--; /* get leading space */ ! 138: while (*p && *p != '\n') /* end string */ ! 139: { ! 140: if (sscanf (p, "%s", statname) != 1) ! 141: break; /* no more tokens */ ! 142: if (!strcmp (statname, "Anonymous")) ! 143: descr -> d_stat |= ANONOK; ! 144: if (!strcmp (statname, "Open")) ! 145: descr -> d_stat |= OPEN; ! 146: if (!strcmp (statname, "Networked")) ! 147: descr -> d_stat |= NETWRKD; ! 148: if (!strcmp (statname, "Archive")) ! 149: descr -> d_stat |= ISARCH; ! 150: p += strlen (statname) + 1; /* leading space */ ! 151: } ! 152: } ! 153: break; ! 154: case NF_ID_SEQUENCE: ! 155: if (index (field, '@') != (char *) NULL)/* new format */ ! 156: { ! 157: char field1[100]; /* big temp */ ! 158: sscanf (field, "%ld@%99s", &descr -> d_id.uniqid, field1); ! 159: field1[SYSSZ - 1] = '\0'; ! 160: strcpy (descr -> d_id.sys, field1); ! 161: } ! 162: else ! 163: { ! 164: char *pp; ! 165: pp = rindex (field, '.'); /* find last */ ! 166: *pp++ = '\0'; ! 167: strcpy (descr -> d_id.sys, field); ! 168: sscanf (pp, "%ld", &descr -> d_id.uniqid); ! 169: } ! 170: break; ! 171: case NF_NUMBER: ! 172: if (sscanf (field, "%ld", &longval) == 1)/* ok */ ! 173: descr -> d_nfnum = longval; /* assign */ ! 174: break; ! 175: case NF_LAST_TRANSMIT: ! 176: parsetime (field, &descr -> d_lstxmit); ! 177: break; ! 178: case NF_CREATED: ! 179: parsetime (field, &descr -> d_created); ! 180: break; ! 181: case NF_LAST_USED: ! 182: parsetime (field, &descr -> d_lastuse); ! 183: break; ! 184: case NF_DAYS_USED: ! 185: if (sscanf (field, "%ld", &longval) == 1)/* ok */ ! 186: descr -> d_daysused = longval; /* assign */ ! 187: break; ! 188: case NF_NOTES_WRITTEN: ! 189: if (sscanf (field, "%ld", &longval) == 1)/* ok */ ! 190: descr -> d_notwrit = longval; /* assign */ ! 191: break; ! 192: case NF_NOTES_READ: ! 193: if (sscanf (field, "%ld", &longval) == 1)/* ok */ ! 194: descr -> d_notread = longval; /* assign */ ! 195: break; ! 196: case NF_NOTES_TRANSMITTED: ! 197: if (sscanf (field, "%ld", &longval) == 1)/* ok */ ! 198: descr -> d_notxmit = longval; /* assign */ ! 199: break; ! 200: case NF_NOTES_RECEIVED: ! 201: if (sscanf (field, "%ld", &longval) == 1)/* ok */ ! 202: descr -> d_notrcvd = longval; /* assign */ ! 203: break; ! 204: case NF_NOTES_DROPPED: ! 205: if (sscanf (field, "%ld", &longval) == 1)/* ok */ ! 206: descr -> d_notdrop = longval; /* assign */ ! 207: break; ! 208: case NF_RESPONSES_WRITTEN: ! 209: if (sscanf (field, "%ld", &longval) == 1)/* ok */ ! 210: descr -> d_rspwrit = longval; /* assign */ ! 211: break; ! 212: case NF_RESPONSES_READ: ! 213: if (sscanf (field, "%ld", &longval) == 1)/* ok */ ! 214: descr -> d_rspread = longval; /* assign */ ! 215: break; ! 216: case NF_RESPONSES_TRANSMITTED: ! 217: if (sscanf (field, "%ld", &longval) == 1)/* ok */ ! 218: descr -> d_rspxmit = longval; /* assign */ ! 219: break; ! 220: case NF_RESPONSES_RECEIVED: ! 221: if (sscanf (field, "%ld", &longval) == 1)/* ok */ ! 222: descr -> d_rsprcvd = longval; /* assign */ ! 223: break; ! 224: case NF_RESPONSES_DROPPED: ! 225: if (sscanf (field, "%ld", &longval) == 1)/* ok */ ! 226: descr -> d_rspdrop = longval; /* assign */ ! 227: break; ! 228: case NF_ENTRIES: ! 229: if (sscanf (field, "%ld", &longval) == 1)/* ok */ ! 230: descr -> entries = longval; /* assign */ ! 231: break; ! 232: case NF_WALLTIME: ! 233: if (sscanf (field, "%ld", &longval) == 1)/* ok */ ! 234: descr -> walltime = longval; /* assign */ ! 235: break; ! 236: case NF_ORPHANS_RECEIVED: ! 237: if (sscanf (field, "%ld", &longval) == 1)/* ok */ ! 238: descr -> d_orphans = longval; /* assign */ ! 239: break; ! 240: case NF_ORPHANS_ADOPTED: ! 241: if (sscanf (field, "%ld", &longval) == 1)/* ok */ ! 242: descr -> d_adopted = longval; /* assign */ ! 243: break; ! 244: case NF_TRANSMITS: ! 245: if (sscanf (field, "%ld", &longval) == 1)/* ok */ ! 246: descr -> netwrkouts = longval; /* assign */ ! 247: break; ! 248: case NF_RECEIVES: ! 249: if (sscanf (field, "%ld", &longval) == 1)/* ok */ ! 250: descr -> netwrkins = longval; /* assign */ ! 251: break; ! 252: case NF_EXPIRATION_AGE: ! 253: if (sscanf (field, "%ld", &longval) == 1)/* ok */ ! 254: descr -> d_archtime = longval; /* assign */ ! 255: break; ! 256: case NF_EXPIRATION_ACTION: ! 257: { ! 258: char action[32]; ! 259: sscanf (field, "%s", action); /* get it */ ! 260: if (!strcmp (action, "Archive")) ! 261: descr -> d_archkeep = KEEPYES; ! 262: if (!strcmp (action, "Delete")) ! 263: descr -> d_archkeep = KEEPNO; ! 264: if (!strcmp (action, "Default")) ! 265: descr -> d_archkeep = KEEPDFLT; ! 266: break; ! 267: } ! 268: case NF_EXPIRATION_STATUS: ! 269: { ! 270: char action[32]; ! 271: sscanf (field, "%s", action); /* get it */ ! 272: if (!strcmp (action, "On")) ! 273: descr -> d_dmesgstat = DIRON; ! 274: if (!strcmp (action, "Off")) ! 275: descr -> d_dmesgstat = DIROFF; ! 276: if (!strcmp (action, "Either")) ! 277: descr -> d_dmesgstat = DIRNOCARE; ! 278: if (!strcmp (action, "Default")) ! 279: descr -> d_dmesgstat = DIRDFLT; ! 280: break; ! 281: } ! 282: case NF_WORKING_SET_SIZE: ! 283: if (sscanf (field, "%ld", &longval) == 1)/* ok */ ! 284: descr -> d_workset = longval; /* assign */ ! 285: break; ! 286: case NF_LONGEST_TEXT: ! 287: if (sscanf (field, "%ld", &longval) == 1)/* ok */ ! 288: descr -> d_longnote = longval; /* assign */ ! 289: break; ! 290: case NF_POLICY_EXISTS: ! 291: if (!strncmp ("Yes", field, 3)) /* it's there */ ! 292: descr -> d_plcy = TRUE; /* it's there */ ! 293: else ! 294: descr -> d_plcy = FALSE; /* not there */ ! 295: break; ! 296: } ! 297: } ! 298: return (-1); /* never reached */ ! 299: } ! 300: ! 301: /* ! 302: * loadaccess(&io, infile) ! 303: * ! 304: * load the access list of the specified notesfile from ! 305: * the supplied file. Stops on the keyword "Access-End". ! 306: */ ! 307: ! 308: loadaccess (io, infile) ! 309: struct io_f *io; ! 310: FILE * infile; ! 311: { ! 312: char pline[BUFSIZ]; ! 313: struct perm_f perms[NPERMS]; /* access rights */ ! 314: int nmodes, ! 315: i; ! 316: register char *field; ! 317: ! 318: nmodes = 0; /* load perms[] */ ! 319: while (fgets (pline, sizeof pline, infile) != NULL) ! 320: { ! 321: if ((i = rfcparse (pline, &accessnames)) != ACCESS_RIGHT && i != (-1)) ! 322: break; /* signals the end */ ! 323: if (nmodes == NPERMS) /* full list */ ! 324: continue; ! 325: i = strlen (pline); ! 326: if (pline[i] == '\n') ! 327: pline[i] = '\0'; /* zap newline */ ! 328: field = index (pline, ':'); /* find data */ ! 329: field++; /* skip colon */ ! 330: field++; /* and space */ ! 331: if (parsemode (field, &perms[nmodes], 0) == 0) /* worked? */ ! 332: nmodes++; /* bump counter */ ! 333: } ! 334: /* ! 335: * we break to here when we've sucked in the line ! 336: * "NF-Access-Termination" or some such. Anyway, it's ! 337: * after we've abused the sentinel line. ! 338: */ ! 339: addmodes (io, nmodes, &perms, 0); /* add them */ ! 340: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.