|
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: 7248 (0x1c50) Types: TextFile Names: »entry_load.c«
└─⟦3d0c2be1b⟧ Bits:30001254 ISODE-5.0 Tape └─⟦eba4602b1⟧ »./isode-5.0.tar.Z« └─⟦d3ac74d73⟧ └─⟦this⟧ »isode-5.0/quipu/entry_load.c«
/* entry_load.c - load bits of the database */ #ifndef lint static char *rcsid = "$Header: /f/osi/quipu/RCS/entry_load.c,v 6.0 89/03/18 23:41:35 mrose Rel $"; #endif /* * $Header: /f/osi/quipu/RCS/entry_load.c,v 6.0 89/03/18 23:41:35 mrose Rel $ * * * $Log: entry_load.c,v $ * Revision 6.0 89/03/18 23:41:35 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 "quipu/ds_error.h" #include "tailor.h" #include <sys/types.h> #include "usr.dirent.h" extern char * treedir; Entry database_root; char filename [LINESIZE]; PS ps; extern LLog * log_dsap; Entry directory_load (root,level,check) char * root; char level; char check; /* if TRUE check attributes against mandatory/may list */ { FILE * fptr; Entry treetop; if ((ps = ps_alloc (str_open)) == NULLPS) fatal (-39,"file open ps_alloc failed"); if (str_setup (ps,filename,LINESIZE,1) == NOTOK) fatal (-40,"file open std_setup failed"); if (root != NULLCP) { if ((*root != '/') && (treedir != 0)) { ps_print (ps,isodefile(treedir)); ps_print (ps,"/"); } ps_print (ps,root); *ps->ps_ptr = 0; LLOG (log_dsap,LLOG_NOTICE,("root is %s",filename)); } else { if (treedir != 0) { ps_print (ps,isodefile(treedir)); ps_print (ps,"/EDB"); } else ps_print (ps,"EDB"); *ps->ps_ptr = 0; LLOG (log_dsap,LLOG_NOTICE,("root is %s",filename)); } if ((fptr = fopen (filename,"r")) == (FILE *) NULL) { LLOG (log_dsap,LLOG_NOTICE,("WARNING: can't open DIT root EDB - \"%s\" - should I be able to ?",filename)); return (NULLENTRY); } treetop = get_default_entry (NULLENTRY); treetop->e_leaf = FALSE; treetop->e_acl->ac_child = acl_default (); treetop->e_acl->ac_entry = acl_default (); treetop->e_acl->ac_default = acl_default (); if ((treetop->e_child = getentry_block (fptr,treetop,filename,check)) == NULLENTRY) return (NULLENTRY); (void) fclose (fptr); if (level == 'w') if (entry_load_kids (treetop->e_child,strlen(isodefile(treedir))+1,check) == NOTOK) return (NULLENTRY); ps_free (ps); return (treetop); } entry_load_kids (entryptr,offset,check) register Entry entryptr; register int offset; char check; { register Entry ptr; FILE * fileptr; DIR * dirp; ps->ps_ptr = filename + offset; ps->ps_cnt = LINESIZE - offset; *ps->ps_ptr = 0; dirp = opendir (filename); for ( ptr = entryptr; ptr != NULLENTRY; ptr = ptr->e_sibling) { if (check) /* don't load children unless there are KNOWN to exist */ if ((ptr->e_master == NULLAV) && (ptr->e_slave == NULLAV)) { ptr->e_leaf = TRUE; continue; } DLOG (log_dsap,LLOG_DEBUG,("scan --- %s", filename)); if (file_check (offset,ptr,dirp) == OK) { DLOG (log_dsap,LLOG_DEBUG,("Opening file %s",filename)); if ((fileptr = fopen (filename,"r")) != (FILE *) NULL) { if ((ptr->e_child = getentry_block (fileptr,ptr,filename,check)) == NULLENTRY) { (void) closedir (dirp); (void) fclose (fileptr); return (NOTOK); } (void) fclose (fileptr); if (ptr->e_child != NULLENTRY) { ptr->e_leaf = FALSE; if (entry_load_kids (ptr->e_child,strlen(filename)-3,check) == NOTOK) { (void) closedir (dirp); return (NOTOK); } } else ptr->e_leaf = TRUE; } } } (void) closedir (dirp); return (OK); } file_check (offset,entryptr,dirp) register int offset; register Entry entryptr; DIR * dirp; { struct dirent * dp, * readdir(); ps->ps_ptr = filename + offset; ps->ps_cnt = LINESIZE - offset; rdn_print (ps,entryptr->e_name,DIROUT); *ps->ps_ptr = 0; rewinddir (dirp); while ((dp = readdir (dirp)) != NULL) if (strcmp(dp->d_name,filename+offset) == 0) { ps_print (ps,"/EDB"); *ps->ps_ptr = 0; return (OK); } return (NOTOK); } Entry subtree_load (parent,dn) Entry parent; DN dn; { FILE * fptr; Entry treetop; int len; if ((parent != NULLENTRY) && (parent->e_child != NULLENTRY)) { DLOG (log_dsap,LLOG_NOTICE,("WARNING: Subtree load of non NULL child - This can USUALLY be ignored if it occurs during startup!!!")); return (parent->e_child); } if ((ps = ps_alloc (str_open)) == NULLPS) fatal (-41,"file open ps_alloc failed"); if (str_setup (ps,filename,LINESIZE,1) == NOTOK) fatal (-42,"file open std_setup failed"); if (treedir != 0) { ps_print (ps,isodefile(treedir)); ps_print (ps,"/"); } dn_print (ps,dn,DIROUT); ps_print (ps,"/EDB"); *ps->ps_ptr = 0; len = strlen (filename) -3; DLOG (log_dsap,LLOG_NOTICE,("root is %s",filename)); if ((fptr = fopen (filename,"r")) == (FILE *) NULL) { LLOG (log_dsap,LLOG_EXCEPTIONS,("WARNING - can't open subtree EDB file - \"%s\" - should I be able to ?",filename)); return (NULLENTRY); } treetop = getentry_block (fptr,parent,filename,TRUE); parent->e_child = treetop; (void) fclose (fptr); if (entry_load_kids (treetop,len,TRUE) == NOTOK) return (NULLENTRY); ps_free (ps); return (treetop); } refresh_from_disk(str) char * str; { DN dn, str2dn(); Entry parent; Entry child; if (( dn= str2dn (str)) == NULLDN) return (NOTOK); if ((parent = local_find_entry (dn,FALSE)) == NULLENTRY) return (NOTOK); child = parent->e_child; parent->e_child = NULLENTRY; if ((subtree_load (parent,dn)) == NULLENTRY) return (NOTOK); directory_free (child); return (OK); } Entry new_constructor (parent) Entry parent; { Entry constructor; constructor = get_default_entry (parent); constructor->e_leaf = FALSE; constructor->e_complete = FALSE; constructor->e_data = E_TYPE_CONSTRUCTOR; constructor->e_acl->ac_child = acl_default (); constructor->e_acl->ac_entry = acl_default (); constructor->e_acl->ac_default = acl_default (); return (constructor); } Entry make_path (dn) DN dn; { Entry ptr; register RDN a_rdn, b_rdn; if ((database_root == NULLENTRY) || (database_root->e_child == NULLENTRY)) { database_root = new_constructor(NULLENTRY); ptr = database_root; for (; dn!= NULLDN; dn=dn->dn_parent) { ptr->e_child = new_constructor(ptr); ptr = ptr->e_child; ptr->e_name = rdn_cpy (dn->dn_rdn); } return (ptr); } else { /* follow links as far as poss, then add new bits */ ptr = database_root->e_child; b_rdn = dn->dn_rdn; a_rdn = ptr->e_name ; for(;;) { /* return out */ while (rdn_cmp (a_rdn, b_rdn) != OK) { if (ptr->e_sibling == NULLENTRY) { for (; dn!= NULLDN; dn=dn->dn_parent) { ptr->e_sibling = new_constructor(ptr->e_parent); ptr = ptr->e_sibling; ptr->e_name = rdn_cpy (dn->dn_rdn); } return (ptr); } ptr = ptr->e_sibling; a_rdn = ptr->e_name ; } if ( dn->dn_parent == NULLDN) return (ptr); dn = dn->dn_parent; b_rdn = dn->dn_rdn; if ( ptr->e_child == NULLENTRY) { for (; dn!= NULLDN; dn=dn->dn_parent) { ptr->e_child = new_constructor(ptr); ptr = ptr->e_child; ptr->e_name = rdn_cpy (dn->dn_rdn); } return (ptr); } ptr = ptr->e_child; a_rdn = ptr->e_name; } } /* NOTREACHED */ }