Annotation of 43BSDReno/contrib/isode-beta/quipu/find_entry.c, revision 1.1.1.1

1.1       root        1: /* find_entry.c - */
                      2: 
                      3: #ifndef lint
                      4: static char *rcsid = "$Header: /f/osi/quipu/RCS/find_entry.c,v 7.1 90/07/09 14:46:12 mrose Exp $";
                      5: #endif
                      6: 
                      7: /*
                      8:  * $Header: /f/osi/quipu/RCS/find_entry.c,v 7.1 90/07/09 14:46:12 mrose Exp $
                      9:  *
                     10:  *
                     11:  * $Log:       find_entry.c,v $
                     12:  * Revision 7.1  90/07/09  14:46:12  mrose
                     13:  * sync
                     14:  * 
                     15:  * Revision 7.0  89/11/23  22:17: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/commonarg.h"
                     33: #include "quipu/entry.h"
                     34: #include "quipu/ds_error.h"
                     35: #include "quipu/connection.h"
                     36: 
                     37: extern Entry database_root;
                     38: extern LLog * log_dsap;
                     39: extern time_t timenow;
                     40: 
                     41: extern int dn_print ();
                     42: 
                     43: int      find_entry (object,ca,acl_who,dn_stack,master,ent_p,err,di_p)
                     44: DN               object;
                     45: common_args    * ca;
                     46: DN               acl_who;
                     47: struct dn_seq  * dn_stack;
                     48: int              master;
                     49: Entry          * ent_p;
                     50: struct DSError * err;
                     51: struct di_block        **di_p;
                     52: {
                     53: int deref = FALSE;
                     54: extern time_t cache_timeout;
                     55: DN dn_found;
                     56: int res;
                     57: 
                     58:        DLOG (log_dsap,LLOG_TRACE,("find_entry"));
                     59:        err->dse_type = DSE_NOERROR;
                     60: 
                     61:        if ((ca->ca_servicecontrol.svc_options & SVC_OPT_DONTDEREFERENCEALIAS) == 0) 
                     62:                deref = TRUE;
                     63: 
                     64:        if ((ca->ca_servicecontrol.svc_options & SVC_OPT_DONTUSECOPY) != 0)
                     65:                master = TRUE;
                     66: 
                     67:        switch(really_find_entry(object,deref,dn_stack,master,ent_p,err,di_p))
                     68:        {
                     69:        case DS_OK:
                     70:            DLOG(log_dsap, LLOG_DEBUG, ("find_entry - rfe: OK"));
                     71:            /* Have set up ent_p continue processing */
                     72:            break;
                     73: 
                     74:        case DS_CONTINUE:
                     75:            DLOG(log_dsap, LLOG_DEBUG, ("find_entry - rfe: CONT"));
                     76: #ifdef DEBUG
                     77:            di_list_log((*di_p));
                     78: #endif
                     79:            /* Have set up di_blocks of DSAs to be questioned */
                     80:            return(DS_CONTINUE);
                     81: 
                     82:        case DS_X500_ERROR:
                     83:            DLOG(log_dsap, LLOG_DEBUG, ("find_entry - rfe: X500_ERROR"));
                     84:            /* Have set up an error */
                     85:            return(DS_X500_ERROR);
                     86: 
                     87:        default:
                     88:            /* Scream */
                     89:            LLOG(log_dsap, LLOG_EXCEPTIONS, ("really_find_entry failed in find_entry 1"));
                     90:            return(DS_ERROR_LOCAL);
                     91:        }
                     92: 
                     93:        /* if the returned entry is a CONSTRUCTOR, return a referral */
                     94:        if ((*ent_p)->e_data == E_TYPE_CONSTRUCTOR) {
                     95:                DLOG(log_dsap, LLOG_DEBUG, ("find_entry - constructor"));
                     96:                dn_found = get_copy_dn (*ent_p);
                     97:                res = constructor_dsa_info(dn_found,dn_stack,FALSE,(*ent_p),err,di_p);
                     98:                dn_free (dn_found);
                     99:                return (res);
                    100:        }
                    101: 
                    102:        /* if the returned entry is a COPY, - check service controls */
                    103:        if ((*ent_p)->e_data != E_DATA_MASTER)
                    104:                if (master) {
                    105:                        DLOG(log_dsap, LLOG_DEBUG, ("find_entry - slave master needed"));
                    106:                        dn_found = get_copy_dn (*ent_p);
                    107:                        res = constructor_dsa_info(dn_found,dn_stack,TRUE,(*ent_p),err,di_p);
                    108:                        dn_free (dn_found);
                    109:                        return (res);
                    110:                }
                    111: 
                    112:        if (((*ent_p)->e_data == E_TYPE_CACHE_FROM_MASTER) && 
                    113:                ( timenow - (*ent_p)->e_age > cache_timeout)) {
                    114:                DLOG(log_dsap, LLOG_DEBUG, ("find_entry - cache timed out"));
                    115:                dn_found = get_copy_dn (*ent_p);
                    116:                res = constructor_dsa_info(dn_found,dn_stack,TRUE,(*ent_p),err,di_p);
                    117:                delete_cache (dn_found);
                    118:                dn_free (dn_found);
                    119:                return (res);
                    120:        }
                    121: 
                    122:        if ((*ent_p)->e_parent == NULLENTRY)
                    123:        {
                    124:                DLOG(log_dsap, LLOG_DEBUG, ("find_entry: (*ent_p)->e_parent is NULLENTRY"));
                    125:                return (DS_OK);     /* no acl for root entry */
                    126:        }
                    127: 
                    128:        if (check_acl (acl_who,ACL_DETECT, (*ent_p)->e_parent->e_acl->ac_child, object) == NOTOK) {
                    129:                err->dse_type = DSE_SECURITYERROR;
                    130:                err->ERR_SECURITY.DSE_sc_problem = DSE_SC_ACCESSRIGHTS;
                    131:                return (DS_X500_ERROR);
                    132:        }
                    133: 
                    134:        if (check_acl (acl_who,ACL_DETECT, (*ent_p)->e_acl->ac_entry, object) == NOTOK) {
                    135:                err->dse_type = DSE_SECURITYERROR;
                    136:                err->ERR_SECURITY.DSE_sc_problem = DSE_SC_ACCESSRIGHTS;
                    137:                return (DS_X500_ERROR);
                    138:        }
                    139: 
                    140:        return (DS_OK);
                    141: }
                    142: 
                    143: int      find_child_entry (object,ca,acl_who,dn_stack,master,ent_p,err,di_p)
                    144: DN                        object;
                    145: common_args             * ca;
                    146: DN                       acl_who;
                    147: struct dn_seq          * dn_stack;
                    148: int                      master;
                    149: Entry                  * ent_p;
                    150: struct DSError          * err;
                    151: struct di_block                **di_p;
                    152: {
                    153: /* this is very similar to find_entry(), except a top level */
                    154: /* constructor is allowed */
                    155: int deref = FALSE;
                    156: int res;
                    157: DN dn_found;
                    158: 
                    159:        DLOG (log_dsap,LLOG_DEBUG,("find_child_entry"));
                    160:        err->dse_type = DSE_NOERROR;
                    161: 
                    162:        if ((ca->ca_servicecontrol.svc_options & SVC_OPT_DONTDEREFERENCEALIAS) == 0)
                    163:                deref = TRUE;
                    164: 
                    165:        if ((ca->ca_servicecontrol.svc_options & SVC_OPT_DONTUSECOPY) != 0)
                    166:                master = TRUE;
                    167: 
                    168:        switch(really_find_entry(object,deref,dn_stack,master,ent_p,err,di_p))
                    169:        {
                    170:        case DS_OK:
                    171:            DLOG(log_dsap, LLOG_DEBUG, ("find_child_entry - rfe: OK"));
                    172:            /* Have set up ent_p continue processing */
                    173:            break;
                    174: 
                    175:        case DS_CONTINUE:
                    176:            DLOG(log_dsap, LLOG_DEBUG, ("find_child_entry - rfe: CONTINUE"));
                    177: #ifdef DEBUG
                    178:            di_list_log((*di_p));
                    179: #endif
                    180:            /* Have set up di_blocks of DSAs to be questioned */
                    181:            return(DS_CONTINUE);
                    182: 
                    183:        case DS_X500_ERROR:
                    184:            /* Have set up an error */
                    185:            DLOG(log_dsap, LLOG_DEBUG, ("find_child_entry - rfe: X500_ERROR"));
                    186:            return(DS_X500_ERROR);
                    187: 
                    188:        default:
                    189:            /* Scream */
                    190:            LLOG(log_dsap, LLOG_EXCEPTIONS, ("really_find_entry failed in find_entry 1"));
                    191:            return(DS_ERROR_LOCAL);
                    192:        }
                    193: 
                    194:        /* check to see if children OK */
                    195:        if (((*ent_p)->e_child != NULLENTRY) && ((*ent_p)->e_allchildrenpresent == TRUE))
                    196:        {
                    197:            DLOG(log_dsap, LLOG_DEBUG, ("find_child_entry - children OK"));
                    198:                switch ((*ent_p)->e_child->e_data) {
                    199:                case E_DATA_MASTER:
                    200:                        DLOG(log_dsap, LLOG_DEBUG, ("find_child_entry - children masters"));
                    201:                        break;
                    202:                case E_TYPE_SLAVE:
                    203:                        /* see if we can use a copy ... */
                    204:                        DLOG(log_dsap, LLOG_DEBUG, ("find_child_entry - children slaves"));
                    205:                        if (master) {
                    206:                                dn_found = get_copy_dn (*ent_p);
                    207:                                res = constructor_dsa_info_aux(dn_found,dn_stack,master,(*ent_p),err,di_p);
                    208:                                dn_free (dn_found);
                    209:                                return (res);
                    210:                        }
                    211:                        break;
                    212:                default:
                    213:                        DLOG(log_dsap, LLOG_DEBUG, ("find_child_entry - default"));
                    214:                        dn_found = get_copy_dn (*ent_p);
                    215:                        res = constructor_dsa_info_aux(dn_found,dn_stack,master,(*ent_p),err,di_p);
                    216:                        dn_free (dn_found);
                    217:                        return (res);
                    218:                }
                    219:        }
                    220:        else {
                    221:            DLOG(log_dsap, LLOG_DEBUG, ("find_child_entry - children NOTOK"));
                    222:                if ((*ent_p)->e_leaf)
                    223:                {
                    224:                        DLOG(log_dsap, LLOG_DEBUG, ("find_child_entry - leaf"));
                    225:                        return (DS_OK);
                    226:                }
                    227:                dn_found = get_copy_dn (*ent_p);
                    228:                res = constructor_dsa_info_aux(dn_found,dn_stack,master,(*ent_p),err,di_p);
                    229:                dn_free (dn_found);
                    230:                return (res);
                    231:        }
                    232: 
                    233:        if (check_acl (acl_who,ACL_DETECT, (*ent_p)->e_acl->ac_child, object) == NOTOK) {
                    234:                err->dse_type = DSE_SECURITYERROR;
                    235:                err->ERR_SECURITY.DSE_sc_problem = DSE_SC_ACCESSRIGHTS;
                    236:                return (DS_X500_ERROR);
                    237:                }
                    238: 
                    239:        return (DS_OK);
                    240: }
                    241: 
                    242: int      really_find_entry (object, deref, dn_stack, master, ent_p, err, di_p)
                    243: DN               object;
                    244: int              deref;
                    245: struct dn_seq  * dn_stack;
                    246: int              master;       /* Generate only master references - NB
                    247:                                   does not imply returned entry is master */
                    248: Entry          * ent_p;
                    249: struct DSError * err;
                    250: struct di_block        **di_p;
                    251: {
                    252: Entry  trail;
                    253: register RDN    a_rdn, b_rdn;
                    254: DN     dn, dn_trail = NULLDN;
                    255: DN     aliasdn = NULLDN;
                    256: 
                    257:        DLOG (log_dsap,LLOG_TRACE,("really find entry"));
                    258: 
                    259:        if (deref == -2) {
                    260:                /* alias loop */
                    261:                err->dse_type = DSE_NAMEERROR;
                    262:                err->ERR_NAME.DSE_na_problem = DSE_NA_ALIASDEREFERENCE;
                    263:                err->ERR_NAME.DSE_na_matched = NULLDN;
                    264:                return (DS_X500_ERROR);
                    265:        }
                    266: 
                    267:        if (database_root == NULLENTRY) {
                    268:                LLOG (log_dsap,LLOG_NOTICE,("null root !!!"));
                    269:                return(dsa_info_parent(object, err, di_p, master));
                    270:        }
                    271: 
                    272:        if ((dn = object) == NULLDN)
                    273:        {
                    274:                DLOG(log_dsap,LLOG_DEBUG,("really_fe - DS_OK: database_root"));
                    275:                (*ent_p) = database_root;
                    276:                return (DS_OK);
                    277:        }
                    278: 
                    279:        b_rdn = dn->dn_rdn;
                    280:        if (((*ent_p) = database_root->e_child) == NULLENTRY) {
                    281:                DLOG(log_dsap, LLOG_DEBUG, ("database->e_child == NULLENTRY"));
                    282:                return (no_reply_child (object,dn,dn_stack,master,database_root,err,di_p));
                    283:        }
                    284: 
                    285:        a_rdn = (*ent_p)->e_name ;
                    286: 
                    287:        for(;;) { /* break or return out */
                    288:                trail = NULLENTRY;
                    289:                while (rdn_cmp (a_rdn, b_rdn) != OK) {
                    290:                        trail = (*ent_p);
                    291:                        (*ent_p) = (*ent_p)->e_sibling ;
                    292:                        if ( (*ent_p) == NULLENTRY ) {
                    293:                                int res = no_reply_edb (object,dn_trail,dn_stack,master,trail->e_parent,err,di_p);
                    294:                                if (aliasdn)
                    295:                                        dn_free (aliasdn);
                    296:                                return res;
                    297:                        }
                    298:                        a_rdn = (*ent_p)->e_name ;
                    299:                }
                    300: 
                    301:                /* make found element first in list - optimistaion */
                    302:                if (trail != NULLENTRY) {  /* NOT already the first */
                    303:                        trail->e_sibling = (*ent_p)->e_sibling;
                    304:                        (*ent_p)->e_sibling = (*ent_p)->e_parent->e_child;
                    305:                        (*ent_p)->e_parent->e_child = (*ent_p);
                    306:                }
                    307: 
                    308:                if ( (*ent_p)->e_alias != NULLDN )
                    309:                        /* got an alias entry */
                    310:                        if (deref != FALSE) {
                    311:                                Entry     new_entry;
                    312:                                int       new_deref;
                    313: 
                    314:                                err->dse_type = DSE_NAMEERROR;
                    315:                                new_deref = (deref == -1) ? -2 : -1;
                    316:                                switch(really_find_entry ((*ent_p)->e_alias,new_deref,dn_stack,master,&(new_entry),err,di_p))
                    317:                                {
                    318:                                case DS_OK:
                    319:                                    DLOG(log_dsap, LLOG_DEBUG, ("rfe:rfe:OK"));
                    320:                                    (*ent_p) = new_entry;
                    321:                                    if (aliasdn)
                    322:                                        dn_free (aliasdn);
                    323:                                    aliasdn = get_copy_dn(new_entry);
                    324:                                    dn_append (aliasdn,dn_cpy(dn->dn_parent));
                    325:                                    object = aliasdn;
                    326:                                    break;
                    327:                                case DS_CONTINUE:
                    328:                                    DLOG(log_dsap, LLOG_DEBUG, ("rfe:rfe:CONT"));
                    329:                                        DLOG(log_dsap, LLOG_DEBUG, ("Alias ?"));
                    330: #ifdef DEBUG
                    331:                                        di_list_log((*di_p));
                    332: #endif
                    333:                                        if (aliasdn)
                    334:                                                dn_free (aliasdn);
                    335:                                        return(DS_CONTINUE);
                    336:                                case DS_X500_ERROR:
                    337:                                    DLOG(log_dsap, LLOG_DEBUG, ("rfe:rfe:X500ERR"));
                    338:                                        if ((err->dse_type == DSE_NAMEERROR) && 
                    339:                                                ( err->ERR_NAME.DSE_na_problem == DSE_NA_ALIASDEREFERENCE)) {
                    340:                                                if (err->ERR_NAME.DSE_na_matched == NULLDN) {
                    341:                                                        DN tmp_dn;
                    342:                                                        tmp_dn = dn->dn_parent;
                    343:                                                        dn->dn_parent = NULLDN;
                    344:                                                        err->ERR_NAME.DSE_na_matched = dn_cpy(object);
                    345:                                                        dn->dn_parent = tmp_dn;
                    346:                                                        pslog (log_dsap,LLOG_EXCEPTIONS,"Alias deref Problem",dn_print,(caddr_t)err->ERR_NAME.DSE_na_matched);
                    347:                                                }
                    348:                                                if (aliasdn)
                    349:                                                        dn_free (aliasdn);
                    350:                                                return (DS_X500_ERROR);
                    351:                                        } else {
                    352:                                                ds_error_free (err);
                    353:                                                err->dse_type = DSE_NAMEERROR;
                    354:                                                err->ERR_NAME.DSE_na_problem = DSE_NA_ALIASPROBLEM;
                    355:                                                err->ERR_NAME.DSE_na_matched = dn_cpy((*ent_p)->e_alias);
                    356:                                                pslog (log_dsap,LLOG_EXCEPTIONS,"Alias Problem",dn_print,(caddr_t)err->ERR_NAME.DSE_na_matched);
                    357:                                                if (aliasdn)
                    358:                                                        dn_free (aliasdn);
                    359:                                                return (DS_X500_ERROR);
                    360:                                        }
                    361:                                default:
                    362:                                    if (aliasdn)
                    363:                                        dn_free (aliasdn);
                    364:                                    DLOG(log_dsap, LLOG_DEBUG, ("rfe:rfe:localerror"));
                    365:                                        return(DS_ERROR_LOCAL);
                    366:                                }
                    367:                                
                    368: 
                    369:                        } else if ( dn->dn_parent == NULLDN)
                    370:                        {
                    371:                                DLOG(log_dsap,LLOG_DEBUG,("really_fe - DS_OK: ?1"));
                    372:                                if (aliasdn)
                    373:                                        dn_free (aliasdn);
                    374:                                return(DS_OK);
                    375:                        }
                    376:                        else {
                    377:                                /* alias on route - error in this case */
                    378:                                DN tmp_dn;
                    379:                                err->dse_type = DSE_NAMEERROR;
                    380:                                err->ERR_NAME.DSE_na_problem = DSE_NA_ALIASDEREFERENCE;
                    381:                                tmp_dn = dn->dn_parent;
                    382:                                dn->dn_parent = NULLDN;
                    383:                                err->ERR_NAME.DSE_na_matched = dn_cpy(object);
                    384:                                dn->dn_parent = tmp_dn;
                    385:                                pslog (log_dsap,LLOG_EXCEPTIONS,"Alias deref(2) Problem",dn_print,(caddr_t)err->ERR_NAME.DSE_na_matched);
                    386:                                if (aliasdn)
                    387:                                        dn_free (aliasdn);
                    388:                                return (DS_X500_ERROR);
                    389:                        }
                    390: 
                    391: 
                    392:                if ( dn->dn_parent == NULLDN)
                    393:                {
                    394:                        DLOG(log_dsap,LLOG_DEBUG,("really_fe - DS_OK: ?2"));
                    395:                        if (aliasdn)
                    396:                                dn_free (aliasdn);
                    397:                        return (DS_OK);
                    398:                }
                    399: 
                    400:                if ( (*ent_p)->e_child == NULLENTRY ) {
                    401:                        int res = no_reply_child (object,dn,dn_stack,master,(*ent_p),err,di_p);
                    402:                        if (aliasdn)
                    403:                                dn_free (aliasdn);
                    404:                        return res;                                             
                    405:                }
                    406: 
                    407:                dn_trail = dn;
                    408:                dn = dn->dn_parent;
                    409:                b_rdn = dn->dn_rdn;
                    410: 
                    411:                (*ent_p) = (*ent_p)->e_child;
                    412:                a_rdn = (*ent_p)->e_name;
                    413:        }
                    414:        /* NOTREACHED */
                    415: }
                    416: 
                    417: 
                    418: int      referral_dsa_info (object,dn_stack,master,ptr,err,di_p,chain)
                    419: DN               object;
                    420: struct dn_seq  * dn_stack;
                    421: int              master;
                    422: Entry            ptr;
                    423: struct DSError * err;
                    424: struct di_block        **di_p;
                    425: char chain;
                    426: {
                    427: int ret;
                    428: struct di_block     * di_tmp;
                    429: 
                    430:        DLOG (log_dsap,LLOG_TRACE,("referral dsa_info"));
                    431:        /* generate a referral to a DUA if possible */
                    432: 
                    433:        if (ptr != NULLENTRY)
                    434:                ptr=ptr->e_parent;
                    435: 
                    436:        if ((ret = constructor_dsa_info_aux(object,dn_stack,master,ptr,err,di_p)) != DS_CONTINUE)
                    437:                return ret;
                    438: 
                    439:        /* Try to make a referral - if not schedule a chain !!! */
                    440:        if (chain)
                    441:                return DS_CONTINUE;
                    442: 
                    443:        /* PROBLEM: The following will get the best referral from our point 
                    444:         * of view.  This may not be the same from the DUAs point of view !!!
                    445:          */
                    446:        sort_dsa_list (di_p);
                    447:         for(di_tmp= *di_p; di_tmp!=NULL_DI_BLOCK; di_tmp=di_tmp->di_next)
                    448:         {
                    449:                 if(di_tmp->di_state == DI_DEFERRED)
                    450:                         continue;
                    451: 
                    452:                 if(di2cref(di_tmp, err, DS_CTX_X500_DAP) == OK)
                    453:                     return (DS_X500_ERROR);    /* return the referral !! */
                    454:         }
                    455:        return DS_CONTINUE;
                    456: 
                    457: }
                    458: 
                    459: int      constructor_dsa_info (object,dn_stack,master,ptr,err,di_p)
                    460: DN               object;
                    461: struct dn_seq  * dn_stack;
                    462: int              master;
                    463: Entry            ptr;
                    464: struct DSError * err;
                    465: struct di_block        **di_p;
                    466: {
                    467:        DLOG (log_dsap,LLOG_TRACE,("constructor dsa_info"));
                    468: 
                    469:        if (ptr != NULLENTRY)
                    470:                ptr=ptr->e_parent;
                    471:                
                    472:        return(constructor_dsa_info_aux(object,dn_stack,master,ptr,err,di_p));
                    473: }
                    474: 
                    475: int      constructor_dsa_info_aux(object,dn_stack,master,ptr,err,di_p)
                    476: DN               object;
                    477: struct dn_seq  * dn_stack;
                    478: int              master;
                    479: Entry            ptr;
                    480: struct DSError * err;
                    481: struct di_block        **di_p;
                    482: {
                    483:        DLOG (log_dsap,LLOG_TRACE,("construct dsa_info aux"));
                    484: 
                    485:        /* follow entry back, until something that is not a CONSTRUCTOR */
                    486: 
                    487:        for (; ptr!= NULLENTRY; ptr=ptr->e_parent)
                    488:                if ((ptr->e_data != E_TYPE_CONSTRUCTOR) && (ptr->e_data != E_TYPE_CACHE_FROM_MASTER)) {
                    489:                        if ( (ptr->e_master == NULLAV) && (ptr->e_slave == NULLAV))
                    490:                                continue ;
                    491:                        return(dsa_info_new(object,dn_stack,master,ptr,err,di_p));
                    492:                }
                    493: 
                    494:        return(dsa_info_parent(object,err,di_p,master));
                    495: }
                    496: 
                    497: int      no_reply_child (object,dn,dn_stack,master,entryptr,err,di_p)
                    498: DN               object;
                    499: DN               dn;   /* tail - not matched */
                    500: struct dn_seq  * dn_stack;
                    501: int              master;
                    502: Entry            entryptr;
                    503: struct DSError * err;
                    504: struct di_block        **di_p;
                    505: {
                    506: DN dn_tmp;
                    507:        
                    508:        DLOG (log_dsap,LLOG_TRACE,("no reply child"));
                    509: 
                    510:        if (entryptr->e_leaf)
                    511:        {
                    512:                DLOG (log_dsap,LLOG_DEBUG,("definate NO"));
                    513:                if (dn != NULLDN) {
                    514:                        dn_tmp = dn->dn_parent;
                    515:                        dn->dn_parent = NULLDN;
                    516:                } else
                    517:                        object = NULLDN;
                    518:                err->dse_type = DSE_NAMEERROR;
                    519:                err->ERR_NAME.DSE_na_problem = DSE_NA_NOSUCHOBJECT;
                    520:                err->ERR_NAME.DSE_na_matched = dn_cpy (object);
                    521:                if (dn != NULLDN)
                    522:                        dn->dn_parent = dn_tmp;
                    523: 
                    524:                return(DS_X500_ERROR);
                    525:        }
                    526:        
                    527:        if ( (entryptr->e_master != NULLAV) || (entryptr->e_slave != NULLAV))
                    528:        {
                    529:                return(dsa_info_new (object, dn_stack, master, entryptr, err, di_p));
                    530:        }
                    531: 
                    532:        if (entryptr->e_child == NULLENTRY) {
                    533:                return(constructor_dsa_info(object,dn_stack,master,entryptr,err,di_p));
                    534:        }
                    535: 
                    536:        if ((entryptr->e_child->e_data == E_DATA_MASTER)
                    537:                || ((! master) && (entryptr->e_child->e_data == E_TYPE_SLAVE))) {
                    538:                DLOG (log_dsap,LLOG_DEBUG,("definate NO"));
                    539:                if (dn != NULLDN) {
                    540:                        dn_tmp = dn->dn_parent;
                    541:                        dn->dn_parent = NULLDN;
                    542:                } else
                    543:                        object = NULLDN;
                    544:                err->dse_type = DSE_NAMEERROR;
                    545:                err->ERR_NAME.DSE_na_problem = DSE_NA_NOSUCHOBJECT;
                    546:                err->ERR_NAME.DSE_na_matched = dn_cpy (object);
                    547:                if (dn != NULLDN)
                    548:                        dn->dn_parent = dn_tmp;
                    549:                return(DS_X500_ERROR);
                    550:        } 
                    551: 
                    552:        return(constructor_dsa_info(object,dn_stack,master,entryptr,err,di_p));
                    553: }
                    554: 
                    555: int      no_reply_edb (object,dn,dn_stack,master,entryptr,err,di_p)
                    556: DN               object;
                    557: DN               dn;   /* tail - not matched */
                    558: struct dn_seq  * dn_stack;
                    559: int              master;
                    560: Entry            entryptr;
                    561: struct DSError * err;
                    562: struct di_block        **di_p;
                    563: {
                    564: DN dn_tmp;
                    565: 
                    566:        DLOG (log_dsap,LLOG_TRACE,("no reply edb"));
                    567: 
                    568:        if (entryptr->e_leaf) {
                    569:                DLOG (log_dsap,LLOG_DEBUG,("definate NO"));
                    570:                if (dn != NULLDN) {
                    571:                        dn_tmp = dn->dn_parent;
                    572:                        dn->dn_parent = NULLDN;
                    573:                } else
                    574:                        object = NULLDN;
                    575:                err->dse_type = DSE_NAMEERROR;
                    576:                err->ERR_NAME.DSE_na_problem = DSE_NA_NOSUCHOBJECT;
                    577:                err->ERR_NAME.DSE_na_matched = dn_cpy (object);
                    578:                if (dn != NULLDN)
                    579:                        dn->dn_parent = dn_tmp;
                    580: 
                    581:                return(DS_X500_ERROR);
                    582:        }
                    583: 
                    584:        if (entryptr->e_child == NULLENTRY) {
                    585:                return(constructor_dsa_info(object,dn_stack,master,entryptr,err,di_p));
                    586:        }
                    587: 
                    588:        if ((entryptr->e_child->e_data == E_DATA_MASTER)
                    589:                || ((! master) && (entryptr->e_child->e_data == E_TYPE_SLAVE))) {
                    590:                DLOG (log_dsap,LLOG_DEBUG,("definate NO"));
                    591:                if (dn != NULLDN) {
                    592:                        dn_tmp = dn->dn_parent;
                    593:                        dn->dn_parent = NULLDN;
                    594:                } else
                    595:                        object = NULLDN;
                    596:                err->dse_type = DSE_NAMEERROR;
                    597:                err->ERR_NAME.DSE_na_problem = DSE_NA_NOSUCHOBJECT;
                    598:                err->ERR_NAME.DSE_na_matched = dn_cpy (object);
                    599:                if (dn != NULLDN)
                    600:                        dn->dn_parent = dn_tmp;
                    601:                return(DS_X500_ERROR);
                    602:        }
                    603: 
                    604:        /* build a referral */
                    605:        return(constructor_dsa_info_aux(object,dn_stack,master,entryptr,err,di_p));
                    606: }

unix.superglobalmegacorp.com

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