Annotation of 43BSDReno/contrib/isode-beta/dsap/common/cache.c, revision 1.1

1.1     ! root        1: /* cache.c - */
        !             2: 
        !             3: #ifndef        lint
        !             4: static char *rcsid = "$Header: /f/osi/dsap/common/RCS/cache.c,v 7.1 90/07/09 14:34:09 mrose Exp $";
        !             5: #endif
        !             6: 
        !             7: /* 
        !             8:  * $Header: /f/osi/dsap/common/RCS/cache.c,v 7.1 90/07/09 14:34:09 mrose Exp $
        !             9:  *
        !            10:  *
        !            11:  * $Log:       cache.c,v $
        !            12:  * Revision 7.1  90/07/09  14:34:09  mrose
        !            13:  * sync
        !            14:  * 
        !            15:  * Revision 7.0  89/11/23  22:16:40  mrose
        !            16:  * Release 6.0
        !            17:  * 
        !            18:  */
        !            19: 
        !            20: /*
        !            21:  *                               NOTICE
        !            22:  *
        !            23:  *    Acquisition, use, and distribution of this module and related
        !            24:  *    materials are subject to the restrictions of a license agreement.
        !            25:  *    Consult the Preface in the User's Manual for the full terms of
        !            26:  *    this agreement.
        !            27:  *
        !            28:  */
        !            29: 
        !            30: 
        !            31: #include "quipu/util.h"
        !            32: #include "quipu/dua.h"
        !            33: #include "quipu/list.h"
        !            34: #include "quipu/entry.h"
        !            35: 
        !            36: extern LLog * log_dsap;
        !            37: extern Entry database_root;
        !            38: extern time_t time();
        !            39: extern int local_cache_size;
        !            40: 
        !            41: struct list_cache *list_top = NULLCACHE;
        !            42: Entry  current_entry = NULLENTRY;
        !            43: DN     current_dn = NULLDN;
        !            44: extern time_t cache_timeout;
        !            45: 
        !            46: struct subordinate * subord_cpy (x)
        !            47: struct subordinate * x;
        !            48: {
        !            49: struct subordinate * sub;
        !            50: struct subordinate * y;
        !            51: struct subordinate * top;
        !            52: 
        !            53:        if (x == NULLSUBORD)
        !            54:                return (x);
        !            55:        
        !            56:        top = (struct subordinate *) smalloc (sizeof(struct subordinate));
        !            57:        top->sub_copy =  x->sub_copy;
        !            58:        top->sub_rdn = rdn_cpy(x->sub_rdn);
        !            59:        top->sub_aliasentry = x->sub_aliasentry;
        !            60:        top->sub_next = NULLSUBORD;
        !            61:        y = top;
        !            62: 
        !            63:        for (x=x->sub_next; x != NULLSUBORD; x=x->sub_next) {
        !            64:                sub = (struct subordinate *) smalloc (sizeof(struct subordinate));
        !            65:                sub->sub_copy =  x->sub_copy;
        !            66:                sub->sub_rdn = rdn_cpy(x->sub_rdn);
        !            67:                sub->sub_aliasentry = x->sub_aliasentry;
        !            68:                sub->sub_next = NULLSUBORD;
        !            69:                y->sub_next = sub;
        !            70:                y = sub;
        !            71:        }
        !            72: 
        !            73:        return (top);   
        !            74: }
        !            75: 
        !            76: /* ARGSUSED */
        !            77: cache_list (ptr, prob,dn,sizelimit)
        !            78: struct subordinate *ptr;
        !            79: int             prob;
        !            80: DN             dn;
        !            81: int            sizelimit;
        !            82: {
        !            83:        struct list_cache *cache;
        !            84:        struct subordinate *sub;
        !            85:        register int i;
        !            86: 
        !            87:        if ((cache = find_list_cache (dn,0)) == NULLCACHE) {
        !            88:                cache = (struct list_cache *) smalloc (sizeof (struct list_cache));
        !            89:                cache->list_dn = dn_cpy (dn);
        !            90:                cache->list_subs = subord_cpy (ptr);
        !            91:                cache->list_sub_top = cache->list_subs;
        !            92:                cache->list_next = list_top;
        !            93:                cache->list_problem = prob;
        !            94:                list_top = cache;
        !            95:        } else {
        !            96:                subords_free (cache->list_sub_top);
        !            97:                cache->list_subs = subord_cpy (ptr);
        !            98:                        cache->list_sub_top = cache->list_subs;
        !            99:                cache->list_problem = prob;
        !           100:        }
        !           101: 
        !           102:        for (i=0, sub=cache->list_subs; 
        !           103:                sub != NULLSUBORD; 
        !           104:                i++, sub = sub->sub_next);
        !           105:        cache->list_count = i;
        !           106: 
        !           107: }
        !           108: 
        !           109: delete_list_cache (adn)
        !           110: DN adn;
        !           111: {
        !           112: DN dntop, trail = NULLDN;
        !           113: struct list_cache *ptr, *lt = NULLCACHE;
        !           114: 
        !           115:        if (adn == NULLDN)
        !           116:                return;
        !           117: 
        !           118:        dntop = adn;
        !           119: 
        !           120:        for (; adn->dn_parent != NULLDN; adn=adn->dn_parent)
        !           121:                trail = adn;
        !           122: 
        !           123:        if (trail == NULLDN)
        !           124:                dntop = NULLDN;
        !           125:        else
        !           126:                trail->dn_parent = NULLDN;
        !           127: 
        !           128:         for (ptr = list_top; ptr != NULLCACHE; ptr = ptr->list_next) {
        !           129:                 if (dn_cmp (ptr->list_dn, dntop) == 0) {
        !           130:                        if (lt == NULLCACHE) 
        !           131:                                list_top = ptr->list_next;
        !           132:                        else 
        !           133:                                lt->list_next = ptr->list_next;
        !           134:                        subords_free(ptr->list_sub_top);
        !           135:                        free ((char *)ptr);
        !           136:                        if (trail != NULLDN)
        !           137:                                trail->dn_parent = adn;
        !           138:                        return;
        !           139:                }
        !           140:                lt = ptr;
        !           141:        }
        !           142:        if (trail != NULLDN)
        !           143:                trail->dn_parent = adn;
        !           144: }
        !           145: 
        !           146: struct list_cache *find_list_cache (dn,sizelimit)
        !           147: DN dn;
        !           148: int sizelimit;
        !           149: {
        !           150:        struct list_cache *ptr;
        !           151:        int i;
        !           152:        for (ptr = list_top; ptr != NULLCACHE; ptr = ptr->list_next)
        !           153:                if (dn_cmp (ptr->list_dn, dn) == 0)
        !           154:                        if ((ptr->list_problem == LSR_NOLIMITPROBLEM) 
        !           155:                                || ((ptr->list_count >= sizelimit) && (sizelimit != -1)))
        !           156:                                {
        !           157:                                ptr->list_subs = ptr->list_sub_top;
        !           158:                                if (sizelimit == -1)    
        !           159:                                        return (ptr);
        !           160:                                /* only want sizelimit of them */
        !           161:                                for (i=ptr->list_count - sizelimit; i>0; i--)
        !           162:                                        ptr->list_subs = ptr->list_subs->sub_next;
        !           163:                                return (ptr);
        !           164:                                }
        !           165: 
        !           166:        return (NULLCACHE);
        !           167: }
        !           168: 
        !           169: 
        !           170: 
        !           171: cache_entry (ptr, complete, vals)
        !           172: EntryInfo      *ptr;
        !           173: char            complete;
        !           174: char            vals;
        !           175: {
        !           176:        Entry           make_path ();
        !           177:        DN              dnptr;
        !           178:        extern  oid_table_attr * tab_alias;
        !           179:        Attr_Sequence   as, as_merge_aux();
        !           180: 
        !           181:        /* use e_lock to indicate if values are present */
        !           182: 
        !           183:        if (ptr->ent_dn == NULLDN)
        !           184:                return;
        !           185: 
        !           186:        dn_free (current_dn);
        !           187: 
        !           188:        current_dn = dn_cpy (ptr->ent_dn);
        !           189: 
        !           190:        for (dnptr = current_dn; dnptr->dn_parent != NULLDN; dnptr = dnptr->dn_parent)
        !           191:                ;
        !           192: 
        !           193:        if ((current_entry = local_find_entry (current_dn, FALSE)) != NULLENTRY) {
        !           194:                current_entry->e_age = time((time_t *)0);
        !           195:                if (vals && complete) {
        !           196:                        as_free (current_entry->e_attributes);
        !           197:                        current_entry->e_attributes = as_cpy(ptr->ent_attr);
        !           198:                        current_entry->e_lock = vals;
        !           199:                        current_entry->e_complete = complete;
        !           200:                } else if (!current_entry->e_complete) {
        !           201:                        current_entry->e_complete = complete;
        !           202:                        current_entry->e_attributes = as_merge_aux (current_entry->e_attributes, as_cpy(ptr->ent_attr));
        !           203:                        if (vals != current_entry->e_lock)
        !           204:                                current_entry->e_lock = FALSE;
        !           205:                } else if ((!current_entry->e_lock) & vals) {
        !           206:                        current_entry->e_attributes = as_merge_aux (current_entry->e_attributes, as_cpy(ptr->ent_attr));
        !           207:                }
        !           208:        } else {
        !           209:                current_entry = make_path (current_dn);
        !           210: /*
        !           211:                current_entry->e_name = rdn_cpy (dnptr->dn_rdn);
        !           212: */
        !           213:                current_entry->e_complete = complete;
        !           214:                current_entry->e_data = E_TYPE_CACHE_FROM_MASTER;
        !           215:                current_entry->e_age = time((time_t *)0);
        !           216:                current_entry->e_lock = vals;
        !           217:                current_entry->e_attributes = as_cpy(ptr->ent_attr);
        !           218:                local_cache_size++;
        !           219:        }
        !           220: 
        !           221:        /* insert alias pointers */
        !           222:        for ( as = current_entry->e_attributes; as != NULLATTR; as = as->attr_link) {
        !           223:                if (as->attr_type == tab_alias)
        !           224:                        if (as->attr_value)
        !           225:                                current_entry->e_alias = (DN) as->attr_value->avseq_av.av_struct;
        !           226:        }
        !           227: }
        !           228: 
        !           229: 
        !           230: delete_cache (adn)
        !           231: DN              adn;
        !           232: {
        !           233:        Entry           ptr;
        !           234: 
        !           235:        delete_list_cache (adn);
        !           236: 
        !           237:        if ((ptr = local_find_entry (adn, FALSE)) != NULLENTRY) {
        !           238:                if (ptr->e_data == E_TYPE_CACHE_FROM_MASTER) {
        !           239:                        local_cache_size--;
        !           240:                        if (ptr->e_child != NULLENTRY) {
        !           241:                                ptr->e_data = E_TYPE_CONSTRUCTOR;
        !           242:                                ptr->e_complete = FALSE;        
        !           243:                                as_free (ptr->e_attributes);
        !           244:                                ptr->e_attributes = NULLATTR;
        !           245:                        } else if ( ptr->e_parent->e_child == ptr ) {
        !           246:                                ptr->e_parent->e_child = ptr->e_sibling;
        !           247:                                entry_free (ptr);
        !           248:                        } else {
        !           249:                                Entry tmp;
        !           250:                                for (tmp=ptr->e_parent->e_child; tmp != NULLENTRY; tmp=tmp->e_sibling) {
        !           251:                                        if (tmp->e_sibling == ptr)
        !           252:                                                break;
        !           253:                                }
        !           254:                                tmp->e_sibling = ptr->e_sibling ;
        !           255:                                entry_free (ptr);
        !           256:                        }
        !           257:                }
        !           258:        }
        !           259: }
        !           260: 
        !           261: 
        !           262: Entry local_find_entry (object,deref)
        !           263: DN                      object;
        !           264: char deref;
        !           265: {
        !           266: Entry  the_entry;
        !           267: register RDN    a_rdn, b_rdn;
        !           268: DN     dn;
        !           269: 
        !           270:        DLOG (log_dsap,LLOG_TRACE,("local find entry"));
        !           271: 
        !           272:        if (database_root == NULLENTRY) 
        !           273:                return (NULLENTRY);
        !           274: 
        !           275:        if ((dn = object) == NULLDN)
        !           276:                return (database_root);
        !           277: 
        !           278:        b_rdn = dn->dn_rdn;
        !           279:        if ((the_entry = database_root->e_child) == NULLENTRY) 
        !           280:                return (NULLENTRY);
        !           281: 
        !           282:        a_rdn = the_entry->e_name ;
        !           283: 
        !           284:        for(;;) { /* break or return out */
        !           285:                while (rdn_cmp (a_rdn, b_rdn) != OK) {
        !           286:                        the_entry = the_entry->e_sibling ;
        !           287:                        if ( the_entry == NULLENTRY ) 
        !           288:                                return (NULLENTRY);
        !           289:                        a_rdn = the_entry->e_name ;
        !           290:                }
        !           291: 
        !           292:                if ( the_entry->e_alias != NULLDN )
        !           293:                        /* got an alias entry */
        !           294:                        if (deref) {
        !           295:                                Entry new_entry;
        !           296:                                if (dn_cmp (the_entry->e_alias,object) == 0) 
        !           297:                                        return (NULLENTRY);
        !           298:                                new_entry = local_find_entry (the_entry->e_alias,deref);
        !           299:                                if (new_entry == NULLENTRY ) 
        !           300:                                        return (NULLENTRY);
        !           301:                                the_entry = new_entry;
        !           302:                        } else if ( dn->dn_parent == NULLDN) {
        !           303:                                if ((the_entry->e_data == E_TYPE_CACHE_FROM_MASTER) 
        !           304:                                        && (time((time_t *)0) - the_entry->e_age > cache_timeout))
        !           305:                                        return (NULLENTRY);
        !           306:                                else
        !           307:                                        return (the_entry); /* found it !!! */
        !           308:                        } else 
        !           309:                                return (NULLENTRY);
        !           310: 
        !           311:                if ( dn->dn_parent == NULLDN) {
        !           312:                        if ((the_entry->e_data == E_TYPE_CACHE_FROM_MASTER) 
        !           313:                                && (time((time_t *)0) - the_entry->e_age > cache_timeout))
        !           314:                                return (NULLENTRY);
        !           315:                        else
        !           316:                                return (the_entry); /* found it !!! */
        !           317:                }
        !           318: 
        !           319:                dn = dn->dn_parent;
        !           320:                b_rdn = dn->dn_rdn;
        !           321: 
        !           322:                if ( the_entry->e_child == NULLENTRY )
        !           323:                        return (NULLENTRY);
        !           324: 
        !           325:                the_entry = the_entry->e_child;
        !           326:                a_rdn = the_entry->e_name;
        !           327:        }
        !           328:        /* NOTREACHED */
        !           329: }
        !           330: 
        !           331: 
        !           332: DN get_copy_dn (entryptr)
        !           333: Entry entryptr;
        !           334: {
        !           335: DN dn;
        !           336: DN dnptr;
        !           337: Entry ptr;
        !           338: 
        !           339:        if ((entryptr == NULLENTRY) || (entryptr->e_parent == NULL))
        !           340:                return NULLDN;
        !           341: 
        !           342:        dn = dn_comp_new (rdn_cpy (entryptr->e_name));
        !           343:        for (ptr = entryptr->e_parent; ptr->e_parent != NULLENTRY; ptr = ptr->e_parent) {
        !           344:                dnptr = dn_comp_new (rdn_cpy (ptr->e_name));
        !           345:                dnptr->dn_parent = dn;
        !           346:                dn = dnptr;
        !           347:        }
        !           348: 
        !           349:        return (dn);
        !           350: }
        !           351: 
        !           352: 
        !           353: IFP unrav_fn = NULLIFP;
        !           354: IFP schema_fn = NULLIFP;
        !           355: 
        !           356: unravel_attribute (eptr,error)
        !           357: Entry eptr;
        !           358: struct DSError * error;
        !           359: {
        !           360:        if (unrav_fn == NULLIFP)
        !           361:                return (OK);
        !           362:        else
        !           363:                return ((*unrav_fn)(eptr,error));
        !           364: }
        !           365: 
        !           366: check_schema (eptr,as,error)
        !           367: Entry eptr;
        !           368: Attr_Sequence as;
        !           369: struct DSError * error;
        !           370: {
        !           371:        if (schema_fn == NULLIFP)
        !           372:                return (OK);
        !           373:        else 
        !           374:                return ((*schema_fn)(eptr,as,error));
        !           375: }
        !           376: 
        !           377: 
        !           378: char * new_version ()
        !           379: {
        !           380: long clock;
        !           381: struct UTCtime ut;
        !           382: extern time_t time();
        !           383: 
        !           384:        (void) time (&clock);
        !           385:        tm2ut (gmtime (&clock),&ut);
        !           386:        return (strdup(utct2str(&ut)));
        !           387: }
        !           388: 

unix.superglobalmegacorp.com

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