4.3BSD/usr/contrib/notes/src/dump.c
#include "parms.h"
#include "structs.h"
#ifdef RCSIDENT
static char rcsid[] = "$Header: dump.c,v 1.7.0.1 85/10/09 18:11:12 notes Rel $";
#endif RCSIDENT
/*
* dumpnf(nfname)
*
* Dump a notesfile. Parameters are a notesfile name, a name
* for the descriptor information, and a name for the rest
* of the notesfile.
*
*/
dumpnf (nfname, dfile)
char *nfname; /* name of notesfile */
char *dfile; /* descriptor */
{
struct io_f io;
struct note_f note;
FILE * dout;
int i;
if ((i = init (&io, nfname)) < 0)
{
fprintf (stderr, "Problems opening notesfile %s\n", nfname);
return (i); /* die */
}
if (!allow (&io, READOK)) /* no read access! */
{
fprintf (stderr, "You aren't allowed to read %s\n", nfname);
closenf (&io);
return (-1);
}
if (!strcmp (dfile, "-")) /* use stdout */
dout = stdout;
else
if ((dout = fopen (dfile, "w")) == NULL) /* a real file */
{
closenf (&io); /* die */
return (-1);
}
dmpdescr (&io, dout); /* dump descriptor */
dmpaccess (&io, dout); /* access list out */
for (i = 1; i <= io.descr.d_nnote; i++) /* dump each note */
{
getnrec (&io, i, ¬e); /* get record */
if (note.n_stat & DELETED)
continue; /* ignore */
dmpnote (&io, ¬e, i, dout, DETAIL, 0); /* base note */
dmprall (&io, ¬e, i, dout, DETAIL, 0); /* and responses */
}
fclose (dout); /* close descriptor */
closenf (&io); /* and notesfile */
return (0); /* return nicely */
}
/*
* dmpdescr
*
* Dump a notesfile descriptor and it's policy note if there is
* one. Send it to the supplied stdio file.
*
*/
dmpdescr (io, dmpfile)
struct io_f *io;
FILE * dmpfile;
{
char buf[128]; /* hold strings */
register int i;
getdscr (io, &io -> descr); /* grab descriptor */
fprintf (dmpfile, "NF-Title: %s\n", io -> descr.d_title);
fprintf (dmpfile, "NF-Director-Message: %s\n", io -> descr.d_drmes);
sprdate (&io -> descr.d_lastm, buf);
fprintf (dmpfile, "NF-Last-Modified: %s\n", buf);
fprintf (dmpfile, "NF-Status:"); /* status */
{
if (io -> descr.d_stat & ANONOK)
fprintf (dmpfile, " Anonymous");
if (io -> descr.d_stat & OPEN)
fprintf (dmpfile, " Open");
if (io -> descr.d_stat & NETWRKD)
fprintf (dmpfile, " Networked");
if (io -> descr.d_stat & ISARCH)
fprintf (dmpfile, " Archive");
}
putc ('\n', dmpfile); /* end status line */
fprintf (dmpfile, "NF-Id-Sequence: %ld@%s\n",
io -> descr.d_id.uniqid, io -> descr.d_id.sys);
fprintf (dmpfile, "NF-Number: %ld\n", (long) io -> descr.d_nfnum);
sprdate (&io -> descr.d_lstxmit, buf);
fprintf (dmpfile, "NF-Last-Transmit: %s\n", buf);
sprdate (&io -> descr.d_created, buf);
fprintf (dmpfile, "NF-Created: %s\n", buf);
sprdate (&io -> descr.d_lastuse, buf);
fprintf (dmpfile, "NF-Last-Used: %s\n", buf);
fprintf (dmpfile, "NF-Days-Used: %ld\n", io -> descr.d_daysused);
fprintf (dmpfile, "NF-Notes-Written: %ld\n", io -> descr.d_notwrit);
fprintf (dmpfile, "NF-Notes-Read: %ld\n", io -> descr.d_notread);
fprintf (dmpfile, "NF-Notes-Transmitted: %ld\n", io -> descr.d_notxmit);
fprintf (dmpfile, "NF-Notes-Received: %ld\n", io -> descr.d_notrcvd);
fprintf (dmpfile, "NF-Notes-Dropped: %ld\n", io -> descr.d_notdrop);
fprintf (dmpfile, "NF-Responses-Written: %ld\n", io -> descr.d_rspwrit);
fprintf (dmpfile, "NF-Responses-Read: %ld\n", io -> descr.d_rspread);
fprintf (dmpfile, "NF-Responses-Transmitted: %ld\n",
io -> descr.d_rspxmit);
fprintf (dmpfile, "NF-Responses-Received: %ld\n", io -> descr.d_rsprcvd);
fprintf (dmpfile, "NF-Responses-Dropped: %ld\n", io -> descr.d_rspdrop);
fprintf (dmpfile, "NF-Entries: %ld\n", io -> descr.entries);
fprintf (dmpfile, "NF-Walltime: %ld seconds\n",
io -> descr.walltime);
fprintf (dmpfile, "NF-Orphans-Received: %ld\n", io -> descr.d_orphans);
fprintf (dmpfile, "NF-Orphans-Adopted: %ld\n", io -> descr.d_adopted);
fprintf (dmpfile, "NF-Transmits: %ld\n", io -> descr.netwrkouts);
fprintf (dmpfile, "NF-Receives: %ld\n", io -> descr.netwrkins);
fprintf (dmpfile, "NF-Expiration-Age: %ld Days\n", io -> descr.d_archtime);
switch ((int) io -> descr.d_archkeep)
{
case KEEPYES:
strcpy (buf, "Archive");
break;
case KEEPNO:
strcpy (buf, "Delete");
break;
default:
strcpy (buf, "Default");
break;
}
fprintf (dmpfile, "NF-Expiration-Action: %s\n", buf);
switch ((int) io -> descr.d_dmesgstat)
{
case DIRON:
strcpy (buf, "On");
break;
case DIROFF:
strcpy (buf, "Off");
break;
case DIRNOCARE:
strcpy (buf, "Either");
break;
default:
strcpy (buf, "Default");
break;
}
fprintf (dmpfile, "NF-Expiration-Status: %s\n", buf);
fprintf (dmpfile, "NF-Working-Set-Size: %ld\n", io -> descr.d_workset);
fprintf (dmpfile, "NF-Longest-Text: %ld bytes\n", io -> descr.d_longnote);
fprintf (dmpfile, "NF-Policy-Exists: %s\n",
io -> descr.d_plcy ? "Yes" : "No");
fprintf (dmpfile, "NF-Descriptor: Finished\n"); /* mark as done */
/*
* dump the policy note if there is one
*/
if (io -> descr.d_plcy) /* if a policy note */
{ /* dump it */
struct note_f note;
getnrec (io, 0, ¬e);
dmpnote (io, ¬e, 0, dmpfile, DETAIL, 0); /* dump it */
}
}
/*
* dmpaccess(&io)
*
* dump the access list.
* short circuited for now.
*/
dmpaccess (io, dfile)
struct io_f *io;
FILE * dfile;
{
struct perm_f perms[NPERMS]; /* access rights */
int nperms; /* and how many */
char pathname[WDLEN];
char *atype;
char mode[32]; /* at most 5 */
int i;
FILE * afile;
sprintf (pathname, "%s/%s/%s", io -> basedir, io -> nf, ACCESS);
x ((afile = fopen (pathname, "r")) == NULL, "dmpaccess: no access list");
x ((nperms = fread (perms, sizeof (struct perm_f), NPERMS, afile)) == 0,
"dmpaccess: empty access list");
fclose (afile); /* all done */
for (i = 0; i < nperms; i++)
{
switch (perms[i].ptype)
{
case PERMUSER:
atype = "User";
break;
case PERMGROUP:
atype = "Group";
break;
case PERMSYSTEM:
atype = "System";
break;
default:
atype = "Bizarro";
break;
}
strcpy (mode, ""); /* build it up */
if (perms[i].perms & DRCTOK) /* director */
strcat (mode, "d");
if (perms[i].perms & READOK) /* read */
strcat (mode, "r");
if (perms[i].perms & WRITOK) /* write */
strcat (mode, "w");
if (perms[i].perms & RESPOK) /* respond */
strcat (mode, "a");
fprintf (dfile, "Access-Right: %s:%s=%s\n",
atype, perms[i].name, mode);
}
fprintf (dfile, "NF-Access-Finished:\n");
}