|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T e
Length: 7078 (0x1ba6)
Types: TextFile
Names: »entry_dump.c«
└─⟦3d0c2be1b⟧ Bits:30001254 ISODE-5.0 Tape
└─⟦eba4602b1⟧ »./isode-5.0.tar.Z«
└─⟦d3ac74d73⟧
└─⟦this⟧ »isode-5.0/quipu/entry_dump.c«
/* entry_dump.c - routines to dump the database */
#ifndef lint
static char *rcsid = "$Header: /f/osi/quipu/RCS/entry_dump.c,v 6.0 89/03/18 23:41:33 mrose Rel $";
#endif
/*
* $Header: /f/osi/quipu/RCS/entry_dump.c,v 6.0 89/03/18 23:41:33 mrose Rel $
*
*
* $Log: entry_dump.c,v $
* Revision 6.0 89/03/18 23:41:33 mrose
* Release 5.0
*
*/
/*
* NOTICE
*
* Acquisition, use, and distribution of this module and related
* materials are subject to the restrictions of a license agreement.
* Consult the Preface in the User's Manual for the full terms of
* this agreement.
*
*/
#include "quipu/util.h"
#include "quipu/entry.h"
#include <errno.h>
#include "tailor.h"
FILE * file_open ();
static void child_dump ();
extern int errno;
extern char filename [LINESIZE];
extern PS ps;
extern LLog * log_dsap;
extern char * parse_file;
extern RDN parse_rdn;
entry_print (psa,entryptr,format)
PS psa;
Entry entryptr;
int format;
{
if (entryptr == NULLENTRY)
return;
switch (format) {
case READOUT:
ps_print (psa,"Entry data block for ");
rdn_print (psa,entryptr->e_name,format);
ps_print (psa,"\n");
ps_print (psa,entryptr->e_edbversion);
ps_print (psa,"\n");
as_print (psa,entryptr->e_attributes,format);
break;
case EDBOUT:
rdn_print (psa,entryptr->e_name,format);
parse_rdn = entryptr->e_name;
ps_print (psa,"\n");
as_print (psa,entryptr->e_attributes,format);
parse_rdn = NULLRDN;
break;
}
}
entry_block_print (psa,block,format)
PS psa;
Entry block;
int format;
{
Entry ptr;
if (block != NULLENTRY) {
for ( ptr = block; ptr != NULLENTRY; ptr = ptr->e_sibling) {
entry_print (psa,ptr,format);
ps_print (psa,"\n");
}
}
}
directory_print (psa,directory)
PS psa;
Entry directory;
{
Entry ptr;
if (directory != NULLENTRY) {
for ( ptr = directory; ptr != NULLENTRY; ptr = ptr->e_sibling) {
entry_print (psa,ptr,READOUT);
ps_print (psa,"*******************\n");
directory_print (psa,ptr->e_child);
ps_print (psa,"End of ");
rdn_print (psa,ptr->e_name,READOUT);
ps_print (psa,"\n\n");
}
}
}
mk_directory (offset,entryptr)
register int offset;
register Entry entryptr;
{
ps->ps_ptr = filename + offset;
ps->ps_cnt = LINESIZE - offset;
rdn_print (ps,entryptr->e_name,DIROUT);
*ps->ps_ptr = 0; /* bit of a hack - but solves problems !!! */
DLOG (log_dsap,LLOG_DEBUG,("creating diretory %s",filename));
if ( mkdir (filename,0700) != 0 ) {
if ( errno == EEXIST )
LLOG (log_dsap,LLOG_EXCEPTIONS,("directory %s already exists",filename));
else
LLOG (log_dsap,LLOG_EXCEPTIONS,("can't make directory %s",filename));
return (-1);
}
return (0);
}
header_print (psa,edb,format)
PS psa;
Entry edb;
int format;
{
char * new_version ();
switch (format) {
case READOUT: return;
case EDBOUT:
switch (edb->e_data) {
case E_DATA_MASTER:
ps_print (psa,"MASTER\n");
break;
case E_TYPE_SLAVE :
ps_print (psa,"SLAVE\n");
break;
default:
ps_print (psa,"CACHE\n");
break;
}
if (edb->e_parent != NULLENTRY)
ps_printf (psa,"%s\n",edb->e_parent->e_edbversion);
else
ps_printf (psa,"%s\n",new_version());
}
}
directory_dump (dir,directory,format,level)
char * dir;
Entry directory;
int format;
char level;
{
extern Entry database_root;
FILE * fptr;
register Entry ptr;
PS entryps;
int um;
if ((ps = ps_alloc (str_open)) == NULLPS)
fatal (-35,"file open ps_alloc failed");
if (str_setup (ps,filename,LINESIZE,1) == NOTOK)
fatal (-36,"file open std_setup failed");
ps->ps_ptr = filename;
ps->ps_cnt = LINESIZE;
if (level == 'w') {
if ( mkdir (isodefile(dir),0700) != 0 ) {
if ( errno == EEXIST )
LLOG (log_dsap,LLOG_EXCEPTIONS,("directory %s already exists",filename));
else
LLOG (log_dsap,LLOG_EXCEPTIONS,("can't make directory %s",filename));
return;
}
if ((ps = ps_alloc (str_open)) == NULLPS)
fatal (-37,"file open ps_alloc failed");
if (str_setup (ps,filename,LINESIZE,1) == NOTOK)
fatal (-38,"file open std_setup failed");
ps_print (ps,isodefile(dir));
DLOG (log_dsap,LLOG_DEBUG,("root is %s",filename));
ps_print (ps,"/");
ps_print (ps,"EDB");
*ps->ps_ptr = 0;
} else
(void) strcpy (filename,dir);
if (directory == NULLENTRY)
directory = database_root->e_child;
if (directory->e_data != E_TYPE_CONSTRUCTOR) {
um = umask (0177);
if ((fptr = fopen (filename,"w")) == (FILE *) NULL) {
LLOG (log_dsap,LLOG_EXCEPTIONS,("can't create root %s",filename));
return;
}
(void) umask (um);
if ((entryps = ps_alloc (std_open)) == NULLPS) {
LLOG (log_dsap,LLOG_EXCEPTIONS,("entryps_alloc failed"));
return;
}
if (std_setup (entryps,fptr) == NOTOK) {
LLOG (log_dsap,LLOG_EXCEPTIONS,("std_setup failed"));
return;
}
parse_file = filename;
header_print (entryps,directory,format);
for ( ptr = directory; ptr != NULLENTRY; ptr = ptr->e_sibling ) {
entry_print (entryps,ptr,format);
ps_print (entryps,"\n");
child_dump (ptr->e_child,format,strlen(isodefile(dir))+1);
}
ps_free (entryps);
ps_free (ps);
(void) fclose (fptr);
} else
for ( ptr = directory; ptr != NULLENTRY; ptr = ptr->e_sibling )
child_dump (ptr->e_child,format,strlen(isodefile(dir))+1);
}
static void child_dump (child,format,offset)
Entry child;
register int format;
int offset;
{
FILE * fptr;
register Entry ptr;
PS entryps;
register int keepoffset;
if (child != NULLENTRY) {
if (mk_directory (offset,child->e_parent) != 0) {
LLOG (log_dsap,LLOG_EXCEPTIONS,("can't make child directory"));
return;
}
if (child->e_data != E_TYPE_CONSTRUCTOR) {
if ((fptr = file_open (offset, child->e_parent,"w")) == (FILE *) NULL) {
LLOG (log_dsap,LLOG_EXCEPTIONS,("file_open failed"));
return;
}
if ((entryps = ps_alloc (std_open)) == NULLPS) {
LLOG (log_dsap,LLOG_EXCEPTIONS,("ps_alloc failed"));
return;
}
if (std_setup (entryps,fptr) == NOTOK) {
LLOG (log_dsap,LLOG_EXCEPTIONS,("std_setup failed"));
return;
}
header_print (entryps,child,format);
entry_block_print (entryps,child,format);
ps_free (entryps);
(void) fclose (fptr);
keepoffset = strlen (filename) -3;
} else {
ps_print (ps,"/");
*ps->ps_ptr = 0;
keepoffset = strlen (filename);
}
for ( ptr = child; ptr != NULLENTRY; ptr = ptr->e_sibling)
child_dump (ptr->e_child,format,keepoffset);
}
}
FILE * file_open (offset,entryptr,mode)
register int offset;
register Entry entryptr;
register char * mode;
{
int um;
FILE * t_fptr;
ps->ps_ptr = filename + offset;
ps->ps_cnt = LINESIZE - offset;
rdn_print (ps,entryptr->e_name,DIROUT);
ps_print (ps,"/EDB");
*ps->ps_ptr = 0;
DLOG (log_dsap,LLOG_DEBUG,("Opening file %s",filename));
parse_file = filename;
um = umask (0177);
t_fptr = fopen (filename,mode);
(void) umask (um);
return (t_fptr);
}
char * new_version ()
{
long clock;
struct UTCtime ut;
extern time_t time();
(void) time (&clock);
tm2ut (gmtime (&clock),&ut);
return (strdup(gent2str(&ut)));
}