Annotation of 43BSDReno/contrib/isode-beta/quipu/entry_load.c, revision 1.1

1.1     ! root        1: /* entry_load.c - load bits of the database */
        !             2: 
        !             3: #ifndef lint
        !             4: static char *rcsid = "$Header: /f/osi/quipu/RCS/entry_load.c,v 7.3 90/07/09 14:46:10 mrose Exp $";
        !             5: #endif
        !             6: 
        !             7: /*
        !             8:  * $Header: /f/osi/quipu/RCS/entry_load.c,v 7.3 90/07/09 14:46:10 mrose Exp $
        !             9:  *
        !            10:  *
        !            11:  * $Log:       entry_load.c,v $
        !            12:  * Revision 7.3  90/07/09  14:46:10  mrose
        !            13:  * sync
        !            14:  * 
        !            15:  * Revision 7.2  90/04/18  08:49:54  mrose
        !            16:  * 6.2
        !            17:  * 
        !            18:  * Revision 7.1  89/12/19  16:20:34  mrose
        !            19:  * sync
        !            20:  * 
        !            21:  * Revision 7.0  89/11/23  22:17:39  mrose
        !            22:  * Release 6.0
        !            23:  * 
        !            24:  */
        !            25: 
        !            26: /*
        !            27:  *                                NOTICE
        !            28:  *
        !            29:  *    Acquisition, use, and distribution of this module and related
        !            30:  *    materials are subject to the restrictions of a license agreement.
        !            31:  *    Consult the Preface in the User's Manual for the full terms of
        !            32:  *    this agreement.
        !            33:  *
        !            34:  */
        !            35: 
        !            36: #include "config.h"
        !            37: #include "quipu/util.h"
        !            38: #include "quipu/entry.h"
        !            39: #include "quipu/ds_error.h"
        !            40: #include "tailor.h"
        !            41: #include <sys/stat.h>
        !            42: #include <errno.h>
        !            43: 
        !            44: extern char * treedir;
        !            45: extern LLog * log_dsap;
        !            46: extern int errno;
        !            47: struct acl_info * acl_dflt ();
        !            48: 
        !            49: static char filename [LINESIZE];
        !            50: static PS ps;
        !            51: 
        !            52: #define EDBLEN 3       /* length of string "EDB" */
        !            53: 
        !            54: fileexists (fname)
        !            55: char * fname;
        !            56: {
        !            57: struct stat buf;
        !            58: 
        !            59:        if (stat (fname,&buf) != 0) {
        !            60:                if (errno != ENOENT)
        !            61:                        DLOG (log_dsap,LLOG_DEBUG,("File %s will not stat - %d",fname,errno));
        !            62:                return FALSE;
        !            63:        }
        !            64:        return TRUE;
        !            65: }
        !            66: 
        !            67: static read_mapped_rdn (aps,name,file)
        !            68: PS aps;
        !            69: char * name;
        !            70: char * file;
        !            71: {
        !            72: FILE * mapfp;
        !            73: char *ptr, *newname, *tmp, *getline();
        !            74: extern int parse_line;
        !            75: register int i;
        !            76: 
        !            77:        if ((mapfp = fopen (file,"r")) == (FILE *)NULL) {
        !            78:                LLOG(log_dsap,LLOG_EXCEPTIONS,("Can read \"%s\" (%d)",file,errno));
        !            79:                return FALSE;
        !            80:        }
        !            81: 
        !            82:        parse_line = 0;
        !            83:        while ( (ptr = getline(mapfp)) != NULLCP) {
        !            84:                if ((newname = rindex(ptr,'#')) == NULLCP) {
        !            85:                        LLOG(log_dsap,LLOG_EXCEPTIONS,("Seperator missing in map file \"%s\", line %d",file,parse_line));
        !            86:                        (void) fclose (mapfp);                  
        !            87:                        return FALSE;
        !            88:                }
        !            89:                tmp = newname;
        !            90:                *newname++ = 0;
        !            91:                while (isspace(*--tmp))
        !            92:                        *tmp = 0;
        !            93: 
        !            94:                if (lexequ (name,ptr) == 0) {
        !            95:                        /* got it - replace in ps*/     
        !            96:                        i = strlen (name);
        !            97:                        aps->ps_ptr -= i;
        !            98:                        aps->ps_cnt += i;
        !            99:                        ps_print (aps,SkipSpace(newname));
        !           100:                        (void) fclose (mapfp);                  
        !           101:                        return TRUE;
        !           102:                }
        !           103:        }
        !           104: 
        !           105:        DLOG (log_dsap, LLOG_DEBUG,("%s not found in map file %s",name,file));
        !           106:        (void) fclose (mapfp);                  
        !           107:        return FALSE;
        !           108: }
        !           109: 
        !           110: static write_mapped_rdn (aps,name,file)
        !           111: PS aps;
        !           112: char * name;
        !           113: char * file;
        !           114: {
        !           115: FILE * mapfp;
        !           116: char mapname[LINESIZE];
        !           117: char sname[LINESIZE];
        !           118: char *mptr, *nptr;
        !           119: register int i;
        !           120: 
        !           121:        if (strlen(name) < MAXFILENAMELEN) 
        !           122:                return FALSE;
        !           123: 
        !           124:        /* Make unique name for it */
        !           125:        mptr = mapname;
        !           126:        if ((nptr = index (name,'=')) == NULLCP)
        !           127:                return FALSE;
        !           128: 
        !           129:        for (i=0 ; (*nptr!=0) && (i < MAXFILENAMELEN-6) ; nptr++)
        !           130:                if (isalpha(*nptr))
        !           131:                        *mptr++ = *nptr, i++;
        !           132: 
        !           133:        (void) strcpy (sname,name);
        !           134:        (void) strcpy (mptr,"XXXXXX");
        !           135:        i = strlen (name);
        !           136:        nptr = (aps->ps_ptr -= i);
        !           137:        aps->ps_cnt += i;
        !           138:        ps_print (aps,mapname);
        !           139:        *aps->ps_ptr = 0;
        !           140: 
        !           141:        if ((aps->ps_base = mktemp (aps->ps_base)) == NULLCP)
        !           142:                return FALSE;
        !           143: 
        !           144:        DLOG(log_dsap,LLOG_DEBUG,("mapped name %s",aps->ps_base));
        !           145: 
        !           146:        if (mkdir (aps->ps_base,0700) != 0) {
        !           147:                LLOG (log_dsap,LLOG_EXCEPTIONS,("map rdn mkdir failure \"%s\" (%d)",aps->ps_base,errno));
        !           148:                return FALSE;
        !           149:        }
        !           150: 
        !           151:        /* write it to map file */
        !           152:        if (fileexists(file)) 
        !           153:                mapfp = fopen (file,"a");
        !           154:        else {
        !           155:                int um;
        !           156:                um = umask (0177);
        !           157:                mapfp = fopen (file,"w");
        !           158:                (void) umask (um);
        !           159:        }
        !           160: 
        !           161:        if (mapfp == (FILE *)NULL) {
        !           162:                LLOG(log_dsap,LLOG_EXCEPTIONS,("Can't write to \"%s\" (%d)",file,errno));
        !           163:                return FALSE;
        !           164:        }
        !           165: 
        !           166:        if (fprintf (mapfp,"%s#%s\n",sname,nptr) == EOF) {
        !           167:                LLOG(log_dsap,LLOG_EXCEPTIONS,("Can't write to \"%s\" (%d)",file,errno));
        !           168:                return FALSE;
        !           169:        }
        !           170: 
        !           171:        if (fclose (mapfp) != 0) {
        !           172:                LLOG(log_dsap,LLOG_EXCEPTIONS,("Can't close \"%s\" (%d)",file,errno));
        !           173:                return FALSE;
        !           174:        }
        !           175: 
        !           176:        return TRUE;
        !           177: }
        !           178: 
        !           179: static rdn2filename (aps,rdn,make)
        !           180: PS aps;
        !           181: RDN rdn;
        !           182: char make;
        !           183: {
        !           184:        char *start = aps->ps_ptr;
        !           185:        char mapbuf [LINESIZE]; 
        !           186: 
        !           187:        /* look for EDB.map file */
        !           188:        *aps->ps_ptr = 0;
        !           189:        (void) sprintf (mapbuf, "%sEDB.map",aps->ps_base);
        !           190: 
        !           191:        rdn_print (aps,rdn,DIROUT);
        !           192:        *aps->ps_ptr = 0;
        !           193: 
        !           194:        if ((fileexists (mapbuf)) && (read_mapped_rdn (aps,start,mapbuf))) 
        !           195:                return OK;
        !           196: #ifdef SYS5
        !           197:        else if ( strlen(start) > MAXFILENAMELEN ) 
        !           198:                LLOG (log_dsap,LLOG_EXCEPTIONS,("Potential problem with \"%s\" (name too long)",start));
        !           199: #endif
        !           200: 
        !           201:        if (fileexists(aps->ps_base))
        !           202:                return OK;
        !           203:        
        !           204:        if (make) { 
        !           205:                if (write_mapped_rdn (aps,start,mapbuf)) 
        !           206:                        return OK;
        !           207:                if (mkdir (aps->ps_base,0700) != 0) {
        !           208:                        LLOG (log_dsap,LLOG_EXCEPTIONS,("dn2file mkdir failure \"%s\" (%d)",aps->ps_base,errno));
        !           209:                        return NOTOK;
        !           210:                }
        !           211:                return OK;
        !           212:        }
        !           213: 
        !           214:        return NOTOK;
        !           215: }
        !           216: 
        !           217: static dn2filename (aps,dn,make)
        !           218: PS aps;
        !           219: DN dn;
        !           220: char make;
        !           221: {
        !           222:        if (treedir != NULLCP) {
        !           223:                ps_print (aps,isodefile(treedir,0));
        !           224:                if (make) {
        !           225:                        *aps->ps_ptr = 0;
        !           226:                        if ((! fileexists (aps->ps_base)) &&
        !           227:                                (mkdir (aps->ps_base,0700) != 0)) {
        !           228:                                LLOG (log_dsap,LLOG_EXCEPTIONS,("dn2file mkdir failure \"%s\" (%d)",aps->ps_base,errno));
        !           229:                                return NOTOK;
        !           230:                                }
        !           231:                }
        !           232:                if (*(aps->ps_ptr - 1) != '/')
        !           233:                        ps_print (aps,"/");
        !           234:        } else
        !           235:                ps_print (aps,"./");
        !           236: 
        !           237:        if (dn != NULLDN) {
        !           238:                if (rdn2filename (aps,dn->dn_rdn,make) == NOTOK)
        !           239:                        return NOTOK;
        !           240:                if (dn->dn_parent != NULLDN) {
        !           241:                        DN eptr;
        !           242:                        for (eptr = dn->dn_parent; eptr != NULLDN; eptr = eptr->dn_parent) {
        !           243:                                ps_print (aps,"/"); 
        !           244:                                if (rdn2filename (aps,eptr->dn_rdn,make) == NOTOK)
        !           245:                                        return NOTOK;
        !           246:                        }
        !           247:                }
        !           248:        }
        !           249: 
        !           250:        return OK;
        !           251: 
        !           252: }
        !           253: 
        !           254: char * dn2edbfile (dn)
        !           255: DN dn;
        !           256: {
        !           257: PS aps;
        !           258: static char result [LINESIZE];
        !           259: 
        !           260:        if ((aps = ps_alloc (str_open)) == NULLPS) {
        !           261:                LLOG (log_dsap, LLOG_EXCEPTIONS, ("dn2dir ps_alloc failed"));
        !           262:                return NULLCP;
        !           263:        }
        !           264:        if (str_setup (aps,result,LINESIZE,1) == NOTOK) {
        !           265:                LLOG (log_dsap, LLOG_EXCEPTIONS, ("dn2dir ps_alloc failed"));
        !           266:                return NULLCP;
        !           267:        }
        !           268: 
        !           269:        if (dn2filename (aps,dn,TRUE) != OK)
        !           270:                return NULLCP;
        !           271: 
        !           272:        if (*(aps->ps_ptr - 1) != '/')
        !           273:                ps_print (aps,"/EDB");
        !           274:        else
        !           275:                ps_print (aps,"EDB");
        !           276:        *aps->ps_ptr = 0;
        !           277: 
        !           278:        ps_free (aps);
        !           279: 
        !           280:        return result;
        !           281: }
        !           282: 
        !           283: static file_check (offset,entryptr)
        !           284: register int offset;
        !           285: register Entry entryptr;
        !           286: {
        !           287:        ps->ps_ptr = filename + offset;
        !           288:        ps->ps_cnt = LINESIZE - offset;
        !           289: 
        !           290:        if (rdn2filename (ps,entryptr->e_name,FALSE) == OK) {
        !           291:                if (*(ps->ps_ptr - 1) != '/')
        !           292:                        ps_print (ps,"/EDB");
        !           293:                else
        !           294:                        ps_print (ps,"EDB");
        !           295:                *ps->ps_ptr = 0;
        !           296:                return (OK);
        !           297:        }
        !           298:        return (NOTOK);
        !           299: }
        !           300: 
        !           301: static entry_load_kids (entryptr,offset)
        !           302: register Entry entryptr;
        !           303: register int offset;
        !           304: {
        !           305: register Entry ptr;
        !           306: 
        !           307:        ps->ps_ptr = filename + offset;
        !           308:        ps->ps_cnt = LINESIZE - offset;
        !           309:        *ps->ps_ptr = 0;
        !           310: 
        !           311:        for ( ptr = entryptr; ptr != NULLENTRY; ptr = ptr->e_sibling) {
        !           312:                if ((ptr->e_master == NULLAV) && (ptr->e_slave == NULLAV)) {
        !           313:                        ptr->e_leaf = TRUE;
        !           314:                        continue;
        !           315:                }
        !           316: 
        !           317:                if (file_check (offset,ptr) == OK) {
        !           318:                        if ((ptr->e_child = getentry_block (ptr,filename)) == NULLENTRY)
        !           319:                                return (NOTOK);
        !           320: 
        !           321:                        ptr->e_leaf = FALSE;
        !           322:                        if (entry_load_kids (ptr->e_child,strlen(filename) - EDBLEN) == NOTOK)
        !           323:                                return (NOTOK);
        !           324:                } else
        !           325:                        LLOG (log_dsap,LLOG_TRACE,("Sibling file %s/EDB NOT found", filename));
        !           326:        }
        !           327:        return (OK);
        !           328: 
        !           329: }
        !           330: 
        !           331: 
        !           332: Entry subtree_load (parent,dn)
        !           333: Entry parent;
        !           334: DN dn;
        !           335: {
        !           336: Entry treetop, temp, old_entry, sibl, find_sibling();
        !           337: 
        !           338:        if ((parent != NULLENTRY) && (parent->e_child != NULLENTRY))
        !           339:                if (parent->e_child->e_data != E_TYPE_CONSTRUCTOR)
        !           340:                        return (parent->e_child);
        !           341: 
        !           342:        if ((ps = ps_alloc (str_open)) == NULLPS) {
        !           343:                LLOG (log_dsap, LLOG_EXCEPTIONS, ("file open ps_alloc failed"));
        !           344:                return (NULLENTRY);
        !           345:        }
        !           346:        if (str_setup (ps,filename,LINESIZE,1) == NOTOK) {
        !           347:                LLOG (log_dsap, LLOG_EXCEPTIONS, ("file open ps_alloc failed"));
        !           348:                return (NULLENTRY);
        !           349:        }
        !           350: 
        !           351:        (void) dn2filename (ps,dn,FALSE);
        !           352:        if (*(ps->ps_ptr - 1) != '/')
        !           353:                ps_print (ps,"/EDB");
        !           354:        else
        !           355:                ps_print (ps,"EDB");
        !           356:        *ps->ps_ptr = 0;
        !           357: 
        !           358:        if ((parent != NULLENTRY) && (parent->e_child != NULLENTRY)) {
        !           359:                /* yuk - already got an edb lower in the DIT ... */
        !           360:                treetop = getentry_block (parent,filename);
        !           361: 
        !           362:                for (temp = treetop; temp != NULLENTRY; temp=temp->e_sibling) {
        !           363:                        temp->e_parent = parent;
        !           364: 
        !           365:                        if ((old_entry = find_sibling (temp->e_name,parent->e_child)) != NULLENTRY) {
        !           366:                                temp->e_leaf = FALSE;
        !           367:                                temp->e_allchildrenpresent = old_entry->e_allchildrenpresent;
        !           368:                                temp->e_child = old_entry->e_child;
        !           369:                                for (sibl = temp->e_child; sibl != NULLENTRY; sibl=sibl->e_sibling)
        !           370:                                        sibl->e_parent = temp;
        !           371:                                if (old_entry->e_edbversion != NULLCP)
        !           372:                                        temp->e_edbversion = strdup (old_entry->e_edbversion);
        !           373:                        }
        !           374: 
        !           375:                }
        !           376:                for (temp = parent->e_child; temp != NULLENTRY; temp=old_entry) {
        !           377:                        old_entry = temp->e_sibling;
        !           378:                        entry_free (temp);
        !           379:                }
        !           380: 
        !           381:                parent->e_child = treetop;
        !           382: 
        !           383:                ps_free (ps);
        !           384:                return (treetop);
        !           385:        }
        !           386: 
        !           387:        if (dn == NULLDN) {
        !           388:                parent = get_default_entry (NULLENTRY);
        !           389:                parent->e_leaf = FALSE;
        !           390:                parent->e_acl = acl_alloc();
        !           391:                parent->e_acl->ac_child = acl_dflt ();
        !           392:                parent->e_acl->ac_entry = acl_dflt ();
        !           393:                parent->e_acl->ac_default = acl_dflt ();
        !           394:                if ((treetop = getentry_block (parent,filename)) == NULLENTRY) 
        !           395:                        return (NULLENTRY);
        !           396:        } else 
        !           397:                treetop = getentry_block (parent,filename);
        !           398: 
        !           399:        parent->e_child = treetop;
        !           400: 
        !           401:        if (entry_load_kids (treetop,strlen (filename) - EDBLEN) == NOTOK)
        !           402:                return (NULLENTRY);
        !           403: 
        !           404:        ps_free (ps);
        !           405: 
        !           406:        if (dn == NULLDN)
        !           407:                return (parent); /* be wary of this when calling subtree load... */
        !           408:                                 /* if DN == NULL - you may want the child !!! */
        !           409:        else
        !           410:                return (treetop);
        !           411: }
        !           412: 
        !           413: refresh_from_disk(dn)
        !           414: DN     dn;
        !           415: {
        !           416: Entry parent;
        !           417: Entry child;
        !           418: Entry tmp;
        !           419: extern Entry database_root;
        !           420: 
        !           421:        if ((parent = local_find_entry (dn,FALSE)) == NULLENTRY)
        !           422:                return (NOTOK);
        !           423: 
        !           424:        if (parent->e_data != E_DATA_MASTER) {
        !           425:                LLOG (log_dsap,LLOG_NOTICE, ("Can only refresh MASTER EDB files"));
        !           426:                return (NOTOK);
        !           427:        }
        !           428: 
        !           429:        child = parent->e_child;
        !           430:        parent->e_child = NULLENTRY;
        !           431: 
        !           432:        if ((tmp = subtree_load (parent,dn)) == NULLENTRY)
        !           433:                return (NOTOK);
        !           434: 
        !           435:        if (dn == NULLDN) {
        !           436:                database_root = tmp;
        !           437:                entry_free (parent);
        !           438:        }
        !           439:        directory_free (child);
        !           440: 
        !           441:        return (OK);
        !           442: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.