|
|
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.