|
|
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: 9541 (0x2545)
Types: TextFile
Names: »entry_load.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
└─⟦35176feda⟧ »EurOpenD22/isode/isode-6.tar.Z«
└─⟦de7628f85⟧
└─⟦this⟧ »isode-6.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 7.1 89/12/19 16:20:34 mrose Exp $";
#endif
/*
* $Header: /f/osi/quipu/RCS/entry_load.c,v 7.1 89/12/19 16:20:34 mrose Exp $
*
*
* $Log: entry_load.c,v $
* Revision 7.1 89/12/19 16:20:34 mrose
* sync
*
* Revision 7.0 89/11/23 22:17:39 mrose
* Release 6.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 "config.h"
#include "quipu/util.h"
#include "quipu/entry.h"
#include "quipu/ds_error.h"
#include "tailor.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
extern char * treedir;
extern LLog * log_dsap;
extern int errno;
struct acl_info * acl_dflt ();
static char filename [LINESIZE];
static PS ps;
#define EDBLEN 3 /* length of string "EDB" */
fileexists (fname)
char * fname;
{
struct stat buf;
if (stat (fname,&buf) != 0) {
if (errno != ENOENT)
DLOG (log_dsap,LLOG_DEBUG,("File %s will not stat - %d",fname,errno));
return FALSE;
}
return TRUE;
}
static read_mapped_rdn (aps,name,file)
PS aps;
char * name;
char * file;
{
FILE * mapfp;
char *ptr, *newname, *getline();
extern int parse_line;
register int i;
if ((mapfp = fopen (file,"r")) == (FILE *)NULL) {
LLOG(log_dsap,LLOG_EXCEPTIONS,("Can read \"%s\" (%d)",file,errno));
return FALSE;
}
parse_line = 0;
while ( (ptr = getline(mapfp)) != NULLCP) {
if ((newname = rindex(ptr,'#')) == NULLCP) {
LLOG(log_dsap,LLOG_EXCEPTIONS,("Seperator missing in map file \"%s\", line %d",file,parse_line));
(void) fclose (mapfp);
return FALSE;
}
*newname++ = 0;
if (lexequ (name,ptr) == 0) {
/* got it - replace in ps*/
i = strlen (name);
aps->ps_ptr -= i;
aps->ps_cnt += i;
ps_print (aps,newname);
(void) fclose (mapfp);
return TRUE;
}
}
DLOG (log_dsap, LLOG_DEBUG,("%s not found in map file %s",name,file));
(void) fclose (mapfp);
return FALSE;
}
static write_mapped_rdn (aps,name,file)
PS aps;
char * name;
char * file;
{
FILE * mapfp;
char mapname[LINESIZE];
char sname[LINESIZE];
char *mptr, *nptr;
register int i;
if (strlen(name) < MAXFILENAMELEN)
return FALSE;
/* Make unique name for it */
mptr = mapname;
if ((nptr = index (name,'=')) == NULLCP)
return FALSE;
for (i=0 ; (*nptr!=0) && (i < MAXFILENAMELEN-6) ; nptr++)
if (isalpha(*nptr))
*mptr++ = *nptr, i++;
(void) strcpy (sname,name);
(void) strcpy (mptr,"XXXXXX");
i = strlen (name);
nptr = (aps->ps_ptr -= i);
aps->ps_cnt += i;
ps_print (aps,mapname);
*aps->ps_ptr = 0;
if ((aps->ps_base = mktemp (aps->ps_base)) == NULLCP)
return FALSE;
DLOG(log_dsap,LLOG_DEBUG,("mapped name %s",aps->ps_base));
if (mkdir (aps->ps_base,0700) != 0) {
LLOG (log_dsap,LLOG_EXCEPTIONS,("map rdn mkdir failure \"%s\" (%d)",aps->ps_base,errno));
return FALSE;
}
/* write it to map file */
if (fileexists(file))
mapfp = fopen (file,"a");
else {
int um;
um = umask (0177);
mapfp = fopen (file,"w");
(void) umask (um);
}
if (mapfp == (FILE *)NULL) {
LLOG(log_dsap,LLOG_EXCEPTIONS,("Can't write to \"%s\" (%d)",file,errno));
return FALSE;
}
if (fprintf (mapfp,"%s#%s\n",sname,nptr) == EOF) {
LLOG(log_dsap,LLOG_EXCEPTIONS,("Can't write to \"%s\" (%d)",file,errno));
return FALSE;
}
if (fclose (mapfp) != 0) {
LLOG(log_dsap,LLOG_EXCEPTIONS,("Can't close \"%s\" (%d)",file,errno));
return FALSE;
}
return TRUE;
}
static rdn2filename (aps,rdn,make)
PS aps;
RDN rdn;
char make;
{
char *start = aps->ps_ptr;
char mapbuf [LINESIZE];
/* look for EDB.map file */
*aps->ps_ptr = 0;
(void) sprintf (mapbuf, "%sEDB.map",aps->ps_base);
rdn_print (aps,rdn,DIROUT);
*aps->ps_ptr = 0;
if ((fileexists (mapbuf)) && (read_mapped_rdn (aps,start,mapbuf)))
return OK;
#ifdef SYS5
else if ( strlen(start) > MAXFILENAMELEN )
LLOG (log_dsap,LLOG_EXCEPTIONS,("Potential problem with \"%s\" (name too long)",start));
#endif
if (fileexists(aps->ps_base))
return OK;
if (make) {
if (write_mapped_rdn (aps,start,mapbuf))
return OK;
if (mkdir (aps->ps_base,0700) != 0) {
LLOG (log_dsap,LLOG_EXCEPTIONS,("dn2file mkdir failure \"%s\" (%d)",aps->ps_base,errno));
return NOTOK;
}
return OK;
}
return NOTOK;
}
static dn2filename (aps,dn,make)
PS aps;
DN dn;
char make;
{
if (treedir != NULLCP) {
ps_print (aps,isodefile(treedir,0));
if (make) {
*aps->ps_ptr = 0;
if ((! fileexists (aps->ps_base)) &&
(mkdir (aps->ps_base,0700) != 0)) {
LLOG (log_dsap,LLOG_EXCEPTIONS,("dn2file mkdir failure \"%s\" (%d)",aps->ps_base,errno));
return NOTOK;
}
}
if (*(aps->ps_ptr - 1) != '/')
ps_print (aps,"/");
} else
ps_print (aps,"./");
if (dn != NULLDN) {
if (rdn2filename (aps,dn->dn_rdn,make) == NOTOK)
return NOTOK;
if (dn->dn_parent != NULLDN) {
DN eptr;
for (eptr = dn->dn_parent; eptr != NULLDN; eptr = eptr->dn_parent) {
ps_print (aps,"/");
if (rdn2filename (aps,eptr->dn_rdn,make) == NOTOK)
return NOTOK;
}
}
}
return OK;
}
char * dn2edbfile (dn)
DN dn;
{
PS aps;
static char result [LINESIZE];
if ((aps = ps_alloc (str_open)) == NULLPS) {
LLOG (log_dsap, LLOG_EXCEPTIONS, ("dn2dir ps_alloc failed"));
return NULLCP;
}
if (str_setup (aps,result,LINESIZE,1) == NOTOK) {
LLOG (log_dsap, LLOG_EXCEPTIONS, ("dn2dir ps_alloc failed"));
return NULLCP;
}
if (dn2filename (aps,dn,TRUE) != OK)
return NULLCP;
if (*(aps->ps_ptr - 1) != '/')
ps_print (aps,"/EDB");
else
ps_print (aps,"EDB");
*aps->ps_ptr = 0;
ps_free (aps);
return result;
}
static file_check (offset,entryptr)
register int offset;
register Entry entryptr;
{
ps->ps_ptr = filename + offset;
ps->ps_cnt = LINESIZE - offset;
if (rdn2filename (ps,entryptr->e_name,FALSE) == OK) {
if (*(ps->ps_ptr - 1) != '/')
ps_print (ps,"/EDB");
else
ps_print (ps,"EDB");
*ps->ps_ptr = 0;
return (OK);
}
return (NOTOK);
}
static entry_load_kids (entryptr,offset)
register Entry entryptr;
register int offset;
{
register Entry ptr;
ps->ps_ptr = filename + offset;
ps->ps_cnt = LINESIZE - offset;
*ps->ps_ptr = 0;
for ( ptr = entryptr; ptr != NULLENTRY; ptr = ptr->e_sibling) {
if ((ptr->e_master == NULLAV) && (ptr->e_slave == NULLAV)) {
ptr->e_leaf = TRUE;
continue;
}
if (file_check (offset,ptr) == OK) {
if ((ptr->e_child = getentry_block (ptr,filename)) == NULLENTRY)
return (NOTOK);
ptr->e_leaf = FALSE;
if (entry_load_kids (ptr->e_child,strlen(filename) - EDBLEN) == NOTOK)
return (NOTOK);
} else
LLOG (log_dsap,LLOG_TRACE,("Sibling file %s/EDB NOT found", filename));
}
return (OK);
}
Entry subtree_load (parent,dn)
Entry parent;
DN dn;
{
Entry treetop, temp, old_entry, sibl, find_sibling();
if ((parent != NULLENTRY) && (parent->e_child != NULLENTRY))
if (parent->e_child->e_data != E_TYPE_CONSTRUCTOR)
return (parent->e_child);
if ((ps = ps_alloc (str_open)) == NULLPS) {
LLOG (log_dsap, LLOG_EXCEPTIONS, ("file open ps_alloc failed"));
return (NULLENTRY);
}
if (str_setup (ps,filename,LINESIZE,1) == NOTOK) {
LLOG (log_dsap, LLOG_EXCEPTIONS, ("file open ps_alloc failed"));
return (NULLENTRY);
}
(void) dn2filename (ps,dn,FALSE);
if (*(ps->ps_ptr - 1) != '/')
ps_print (ps,"/EDB");
else
ps_print (ps,"EDB");
*ps->ps_ptr = 0;
if ((parent != NULLENTRY) && (parent->e_child != NULLENTRY)) {
/* yuk - already got an edb lower in the DIT ... */
treetop = getentry_block (parent,filename);
for (temp = treetop; temp != NULLENTRY; temp=temp->e_sibling) {
temp->e_parent = parent;
if ((old_entry = find_sibling (temp->e_name,parent->e_child)) != NULLENTRY) {
temp->e_leaf = FALSE;
temp->e_allchildrenpresent = old_entry->e_allchildrenpresent;
temp->e_child = old_entry->e_child;
for (sibl = temp->e_child; sibl != NULLENTRY; sibl=sibl->e_sibling)
sibl->e_parent = temp;
if (old_entry->e_edbversion != NULLCP)
temp->e_edbversion = strdup (old_entry->e_edbversion);
}
}
for (temp = parent->e_child; temp != NULLENTRY; temp=old_entry) {
old_entry = temp->e_sibling;
entry_free (temp);
}
parent->e_child = treetop;
ps_free (ps);
return (treetop);
}
if (dn == NULLDN) {
parent = get_default_entry (NULLENTRY);
parent->e_leaf = FALSE;
parent->e_acl = acl_alloc();
parent->e_acl->ac_child = acl_dflt ();
parent->e_acl->ac_entry = acl_dflt ();
parent->e_acl->ac_default = acl_dflt ();
if ((treetop = getentry_block (parent,filename)) == NULLENTRY)
return (NULLENTRY);
} else
treetop = getentry_block (parent,filename);
parent->e_child = treetop;
if (entry_load_kids (treetop,strlen (filename) - EDBLEN) == NOTOK)
return (NULLENTRY);
ps_free (ps);
if (dn == NULLDN)
return (parent); /* be wary of this when calling subtree load... */
/* if DN == NULL - you may want the child !!! */
else
return (treetop);
}
refresh_from_disk(dn)
DN dn;
{
Entry parent;
Entry child;
Entry tmp;
extern Entry database_root;
if ((parent = local_find_entry (dn,FALSE)) == NULLENTRY)
return (NOTOK);
child = parent->e_child;
parent->e_child = NULLENTRY;
if ((tmp = subtree_load (parent,dn)) == NULLENTRY)
return (NOTOK);
if (dn == NULLDN) {
database_root = tmp;
entry_free (parent);
}
directory_free (child);
return (OK);
}