static char *sccsid = "%W%"; #include "parms.h" #include "structs.h" /* * load a file of generic notes. * This routine will read the file supplied (as an fid) * and place it into the notefile. * locking is supressed if the lockit flag is false * uids are mapped to zero if the system that the note came from * does not match the local system. * * Original coding: Ray Essick December 1981 */ long numin (); /* declare func in ldmisc.c */ loadem (io, infile, lockit, whofrom, extensive) struct io_f *io; FILE * infile; int lockit; char *whofrom; /* where these notes are being loaded from */ int extensive; { struct note_f note; struct note_f note2; /* scratch for chknote */ struct auth_f auth; struct id_f noteid, respid; struct daddr_f where; char line[CMDLEN]; char title[TITLEN]; char zfrom[SYSSZ]; /* hold system this resp came from */ struct when_f ztime, ztime2; int i, posit, count, status; char c, *p, *q; while (sukline (infile, line) != -1) { /* get line which identifies stuff */ c = line[0]; switch (c) { case 'N': p = line; while (*p++ != ':'); /* skip to (and over) first colon */ parseid (p, ¬eid); sukline (infile, line); /* note title */ for (i = 0; (i < TITLEN) && line[i] && (line[i] != '\n'); i++) title[i] = line[i]; for (; i < TITLEN; i++) { title[i] = ' '; /* space fill title */ } sukline (infile, line); /* note's author */ p = line; q = auth.aname; while ((*q++ = *p++) != ':'); *--q = '\0'; /* null terminate and overwrite colon */ auth.aid = numin (p) & UIDMASK; /* get user id */ if (strcmp (SYSTEM, noteid.sys) != 0) { auth.aid = ANONUID; /* non-local map to effective anon */ } sukline (infile, line); /* time of writing */ timein (line, ¬e.n_date); if (extensive) { sukline (infile, line); timein (line, ¬e.n_rcvd); sukline (infile, line); timein (line, ¬e.n_lmod); sukline (infile, line); strmove (line, note.n_from); } else { strmove (whofrom, note.n_from); /* set up who came from */ } sukline (infile, line); /* status */ sscanf (line, "%o:%d", &status, &count); if (extensive == 0) { getperms (io, 1, noteid.sys); /* find out if permitted */ if (allow (io, WRITOK) == 0) { io->nnotdrop++; /* count it as dropped */ break; /* & skip to next */ } } if (lockit) lock(io, 'n'); posit = chknote (io, ¬eid, ¬e2); /* see if here */ if (posit == 0) { /* only if not already in the system */ for (i = 0; i < SYSSZ; i++) { note.n_id.sys[i] = noteid.sys[i]; } note.n_id.uniqid = noteid.uniqid; /* copy unique id in */ puttrec (io, infile, &where, count); /* suck text */ putnote (io, &where, title, status, ¬e, &auth, NOPOLICY, NOLOCKIT, NOADDID, note.n_from, (extensive == NODETAIL)); io->nnotrcvd++; /* count as a recieved */ } else { if ((note2.n_stat & ORPHND) && NOT (status & ORPHND)) { /* extant is orphan, new isnt */ puttrec (io, infile, ¬e2.n_addr, count); /* suck text */ gettime (¬e2.n_rcvd); gettime (¬e2.n_lmod); /* time stamp it */ copyauth (&auth, ¬e2.n_auth); /* put correct author */ note2.n_stat = status; /* correct status */ for (i = 0; i < TITLEN; i++) { note2.ntitle[i] = title[i]; } copydate (¬e.n_date, ¬e2.n_date); strmove (note.n_from, note2.n_from); putnrec (io, posit, ¬e2); /* and replace */ } else { for (i = 0; i < count; i++) { getc (infile); /* skip text */ } printf ("%s: duplicate note recieved id=%s:%ld\n", SYSTEM, noteid.sys, noteid.uniqid); io->nnotdrop++; /* count a dropped */ } } if (lockit) unlock(io, 'n'); break; case 'R': p = line; while(*p++ != ':'); /* skip to (and over) first colon */ parseid(p, ¬eid); while(*p++ != ':'); while(*p++ != ':'); /* skip over note identifier */ parseid(p, &respid); /* get response identifier */ sukline(infile, line); /* response's author */ p = line; q = auth.aname; while ((*q++ = *p++) != ':'); *--q = '\0'; /* null terminate and overwrite colon */ auth.aid = numin(p) & UIDMASK; /* get user id */ if (strcmp(SYSTEM, note.n_id.sys) != 0) { auth.aid = ANONUID; /* non-local map to effective anon */ } sukline(infile, line); /* time of writing */ timein(line, &ztime); if (extensive) { sukline(infile, line); timein(line, &ztime2); sukline(infile, line); strmove(line, zfrom); } else { strmove(whofrom, zfrom); /* set correct source */ } sukline(infile, line); /* status */ sscanf(line, "%o:%d", &status, &count); if (lockit) lock(io, 'n'); posit = chknote(io, ¬eid, ¬e); /* see if note is here */ if (posit == 0) { strmove(noteid.sys, note.n_id.sys); note.n_id.uniqid = noteid.uniqid; /* build us a fake note */ note.n_nresp = 0; note.n_auth.aid = ANONUID; strcpy(note.n_auth.aname, "Unknown"); copydate(&ztime, ¬e.n_date); status = ORPHND; /* this note is base of an orpahn */ for (i = 0, p = "Orphaned Response"; (i < TITLEN) && *p; p++, i++) note.ntitle[i] = *p; for (; i < TITLEN; i++) { note.ntitle[i] = ' '; /* pad */ } where.addr = 0; /* no text */ posit = putnote(io, &where, note.ntitle, status, ¬e, ¬e.n_auth, NOPOLICY, NOLOCKIT, NOADDID, whofrom, ADDTIME); /* enter it */ io->norphans++; /* bump count of recieved orphans */ } if (chkresp(io, &respid, ¬e, posit) == 0) { if (extensive == 0) { getperms(io, 1, respid.sys); /* grab systems permissions */ } if (allow(io, RESPOK) || extensive) { puttrec(io, infile, &where, count); /* read text */ putresp(io, &where, status, posit, &ztime, &auth, ¬e, 0, &respid, 0, zfrom, (extensive == NODETAIL), &ztime2); io->nrsprcvd++; /* he is a rcvd ! */ } else { io->nrspdrop++; /* count non-permitted as dropped */ for (i = 0; i < count; i++) { getc(infile); /* skip text */ } } } else { io->nrspdrop++; /* on the floor */ for (i = 0; i < count; i++) { getc(infile); /* skip text */ } printf("%s: duplicate response id=%s:%ld to note id=%s:%ld\n", SYSTEM, respid.sys, respid.uniqid, noteid.sys, noteid.uniqid); } if (lockit) unlock(io, 'n'); break; default: x (-1, "loadem: bad generic file"); break; } } }