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

1.1     ! root        1: /* referral.c - create referral notices */
        !             2: 
        !             3: #ifndef lint
        !             4: static char *rcsid = "$Header: /f/osi/quipu/RCS/referral.c,v 7.1 89/12/19 16:20:45 mrose Exp $";
        !             5: #endif
        !             6: 
        !             7: /*
        !             8:  * $Header: /f/osi/quipu/RCS/referral.c,v 7.1 89/12/19 16:20:45 mrose Exp $
        !             9:  *
        !            10:  *
        !            11:  * $Log:       referral.c,v $
        !            12:  * Revision 7.1  89/12/19  16:20:45  mrose
        !            13:  * sync
        !            14:  * 
        !            15:  * Revision 7.0  89/11/23  22:18:01  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/connection.h"
        !            33: 
        !            34: extern LLog * log_dsap;
        !            35: char remote_lookup = TRUE;
        !            36: struct PSAPaddr        *       psap_cpy();
        !            37: struct dn_seq  * dn_seq_push();
        !            38: struct dn_seq  * dn_seq_pop();
        !            39: struct di_block        * di_alloc();
        !            40: 
        !            41: extern int dn_print ();
        !            42: 
        !            43: static struct access_point * top_ap = NULLACCESSPOINT;
        !            44: 
        !            45: struct access_point    * ap_cpy(ap)
        !            46: struct access_point    * ap;
        !            47: {
        !            48:     struct access_point        * ret_ap;
        !            49:     struct access_point        **tmp_ap;
        !            50: 
        !            51:     if(ap == NULLACCESSPOINT)
        !            52:        return(NULLACCESSPOINT);
        !            53: 
        !            54: 
        !            55:     for(tmp_ap = &ret_ap; ap != NULLACCESSPOINT; ap=ap->ap_next)
        !            56:     {
        !            57:        (*tmp_ap) = (struct access_point *) calloc(1, sizeof(struct access_point));
        !            58:        (*tmp_ap)->ap_name = dn_cpy(ap->ap_name);
        !            59:        (*tmp_ap)->ap_address = psap_cpy(ap->ap_address);
        !            60:        tmp_ap = &((*tmp_ap)->ap_next);
        !            61:     }
        !            62: 
        !            63:     (*tmp_ap) = NULLACCESSPOINT;
        !            64: 
        !            65:     return(ret_ap);
        !            66: }
        !            67: 
        !            68: 
        !            69: static ContinuationRef new_ref (name,rt,ap)
        !            70: DN name;
        !            71: int rt;
        !            72: struct access_point * ap;
        !            73: {
        !            74: ContinuationRef ptr;
        !            75: 
        !            76:        if (ap == NULLACCESSPOINT)
        !            77:                return (NULLCONTINUATIONREF);
        !            78: 
        !            79:        ptr = (ContinuationRef) smalloc (sizeof(continuation_ref));
        !            80:        ptr->cr_aliasedRDNs = CR_NOALIASEDRDNS;
        !            81:        ptr->cr_name = dn_cpy (name);
        !            82:        ptr->cr_rdn_resolved = CR_RDNRESOLVED_NOTDEFINED;
        !            83:        ptr->cr_reftype = rt;
        !            84:        ptr->cr_accesspoints = ap_cpy(ap);
        !            85: 
        !            86:        return (ptr);
        !            87: }
        !            88: 
        !            89: struct access_point * ap_append (a,b)
        !            90: struct access_point * a;
        !            91: struct access_point * b;
        !            92: {
        !            93: struct access_point * trail;
        !            94: struct access_point * top;
        !            95: 
        !            96:        if (a == NULLACCESSPOINT)
        !            97:                return (b);
        !            98:        if ( b == NULLACCESSPOINT)
        !            99:                return (a);
        !           100: 
        !           101:        for (top = a ; a != NULLACCESSPOINT; a = a->ap_next)
        !           102:                trail = a;
        !           103: 
        !           104:        trail->ap_next = b;
        !           105:        return (top);
        !           106: }
        !           107: 
        !           108: ContinuationRef cont_ref_parent (name)
        !           109: DN name;
        !           110: {
        !           111:        return (new_ref(name,RT_SUPERIOR,top_ap));
        !           112: }
        !           113: 
        !           114: add_str_parent (sdn,spsap)
        !           115: char * sdn, *spsap;
        !           116: {
        !           117: DN dn,str2dn();
        !           118: struct PSAPaddr *psap, * str2paddr();
        !           119: struct access_point * next_ap;
        !           120: 
        !           121: /* add string DN and string PSAP to list of parents */
        !           122: 
        !           123:        if ((psap = str2paddr (spsap)) == NULLPA) {
        !           124:                LLOG (log_dsap,LLOG_EXCEPTIONS,("Invalid parent address %s",spsap));
        !           125:                return;
        !           126:        }
        !           127:        if (( dn = str2dn (sdn)) == NULLDN ) {
        !           128:                LLOG (log_dsap,LLOG_EXCEPTIONS,("Invalid parent dn %s",sdn));
        !           129:                return;
        !           130:        }
        !           131: 
        !           132:        next_ap = (struct access_point *) smalloc (sizeof(struct access_point));
        !           133:        next_ap->ap_name = dn;
        !           134:        next_ap->ap_address = psap_cpy(psap);
        !           135:        next_ap->ap_next = NULLACCESSPOINT;
        !           136:        top_ap = ap_append (top_ap,next_ap);
        !           137: 
        !           138: }
        !           139: 
        !           140: struct PSAPaddr *parent_psap()
        !           141: {
        !           142:        if (top_ap == NULLACCESSPOINT)
        !           143:                return (NULLPA);
        !           144:        return (top_ap->ap_address);
        !           145: }
        !           146: 
        !           147: /*
        !           148: *  Generate a list of dsa information blocks (di_block) from the master-dsa
        !           149: *  and slave-dsa attributes of the entry, the dsa dn for which an info block
        !           150: *  is generated is the name from the attribute.
        !           151: *  Currently all of the dsa DNs are used to generate info blocks in the
        !           152: *  list; since this requires access to the entry for each DSA dn this may
        !           153: *  result in some suspended operations being initiated.
        !           154: *  If some info blocks are generated then DS_CONTINUE is returned;
        !           155: *  If no completed or suspended info blocks can be generated then the calling
        !           156: *  process is returned an invalid reference error.
        !           157: *
        !           158: *  NB - As with get_dsa_info, the blocks generated need to be further
        !           159: *  processed by the calling routine.
        !           160: */
        !           161: int      dsa_info_new (name,dn_stack,master,entry_ptr,err,di_p)
        !           162: DN name;
        !           163: struct dn_seq  * dn_stack;
        !           164: int              master;
        !           165: Entry entry_ptr;
        !           166: struct DSError * err;
        !           167: struct di_block        **di_p;
        !           168: {
        !           169: AV_Sequence              avs;
        !           170: int                      ret_val;
        !           171: struct DSError           err_tmp;
        !           172: struct di_block                **di_trail;
        !           173: struct dn_seq          * new_dn_stack;
        !           174: 
        !           175:        DLOG (log_dsap,LLOG_TRACE,("in dsa_info_new"));
        !           176:        ret_val = DS_ERROR_LOCAL;
        !           177:        di_trail = di_p;
        !           178: 
        !           179:        new_dn_stack = dn_seq_push(name,dn_stack);
        !           180: 
        !           181:        for (avs = entry_ptr->e_master; avs != NULLAV; avs=avs->avseq_next) {
        !           182:                if (avs->avseq_av.av_struct == NULL)
        !           183:                        continue;
        !           184: 
        !           185: 
        !           186:                switch(get_dsa_info((DN)avs->avseq_av.av_struct, new_dn_stack,
        !           187:                       &(err_tmp), di_trail))
        !           188:                {
        !           189:                case DS_OK:
        !           190:                    /* di_trail is a completed dsa info block */
        !           191:                    DLOG(log_dsap, LLOG_DEBUG, ("In dsa_info_new gdiOK:"));
        !           192: #ifdef DEBUG
        !           193:                    di_list_log(*di_trail);
        !           194: #endif
        !           195:                    (*di_trail)->di_target = dn_cpy(name);
        !           196:                    di_trail = &((*di_trail)->di_next);
        !           197:                    ret_val = DS_CONTINUE;
        !           198:                    break;
        !           199: 
        !           200:                case DS_CONTINUE:
        !           201:                    /* di_trail is a deferred dsa info block */
        !           202:                    DLOG(log_dsap, LLOG_DEBUG, ("In dsa_info_new gdiCONT:"));
        !           203: #ifdef DEBUG
        !           204:                    di_list_log(*di_trail);
        !           205: #endif
        !           206:                    (*di_trail)->di_target = dn_cpy(name);
        !           207:                    di_trail = &((*di_trail)->di_next);
        !           208:                    ret_val = DS_CONTINUE;
        !           209:                    break;
        !           210: 
        !           211:                case DS_X500_ERROR:
        !           212:                    /* Error encountered generating di_block */
        !           213:                    DLOG(log_dsap, LLOG_NOTICE, ("dsa_info_new - get_dsa_info (slave) returned X500 ERROR"));
        !           214:                    if ((err_tmp.dse_type == DSE_SERVICEERROR )
        !           215:                        && (err_tmp.ERR_SERVICE.DSE_sv_problem == DSE_SV_DITERROR)) {
        !           216:                                *err = err_tmp;
        !           217:                                return DS_X500_ERROR;
        !           218:                        }
        !           219:                    ds_error_free(&err_tmp);
        !           220:                    break;
        !           221: 
        !           222:                default:
        !           223:                    LLOG(log_dsap, LLOG_EXCEPTIONS, ("dsa_info_new - get_dsa_info (master) unexpected return"));
        !           224:                    break;
        !           225:                }
        !           226: 
        !           227:        }
        !           228: 
        !           229:        if(!master)
        !           230:        {
        !           231:            /* repeat for slaves */
        !           232:            for (avs = entry_ptr->e_slave; avs != NULLAV; avs=avs->avseq_next)
        !           233:            {
        !           234: 
        !           235:                if (avs->avseq_av.av_struct == NULL)
        !           236:                        continue;
        !           237: 
        !           238:                switch(get_dsa_info((DN)avs->avseq_av.av_struct, new_dn_stack,
        !           239:                       &(err_tmp), di_trail))
        !           240:                {
        !           241:                case DS_OK:
        !           242:                    /* di_trail is a completed dsa info block */
        !           243:                    DLOG(log_dsap, LLOG_DEBUG, ("In dsa_info_new (slave) gdiOK:"));
        !           244: #ifdef DEBUG
        !           245:                    di_list_log(*di_trail);
        !           246: #endif
        !           247:                    (*di_trail)->di_target = dn_cpy(name);
        !           248:                    di_trail = &((*di_trail)->di_next);
        !           249:                    ret_val = DS_CONTINUE;
        !           250:                    break;
        !           251: 
        !           252:                case DS_CONTINUE:
        !           253:                    /* di_trail is a deferred dsa info block */
        !           254:                    DLOG(log_dsap, LLOG_DEBUG, ("In dsa_info_new (slave) gdiCONT:"));
        !           255: #ifdef DEBUG
        !           256:                    di_list_log(*di_trail);
        !           257: #endif
        !           258:                    (*di_trail)->di_target = dn_cpy(name);
        !           259:                    di_trail = &((*di_trail)->di_next);
        !           260:                    ret_val = DS_CONTINUE;
        !           261:                    break;
        !           262: 
        !           263:                case DS_X500_ERROR:
        !           264:                    /* Error encountered generating di_block */
        !           265:                    DLOG(log_dsap, LLOG_NOTICE, ("dsa_info_new - get_dsa_info slave returned X500 ERROR"));
        !           266:                    if ((err_tmp.dse_type == DSE_SERVICEERROR )
        !           267:                        && (err_tmp.ERR_SERVICE.DSE_sv_problem == DSE_SV_DITERROR)) {
        !           268:                                *err = err_tmp;
        !           269:                                return DS_X500_ERROR;
        !           270:                        }
        !           271:                    ds_error_free(&err_tmp);
        !           272:                    break;
        !           273: 
        !           274:                default:
        !           275:                    LLOG(log_dsap, LLOG_EXCEPTIONS, ("dsa_info_new - get_dsa_info slave unexpected return"));
        !           276:                    break;
        !           277:                }
        !           278: 
        !           279:            }
        !           280:        }
        !           281: 
        !           282:        new_dn_stack = dn_seq_pop(new_dn_stack);
        !           283: 
        !           284:        if((ret_val == DS_ERROR_LOCAL) || (ret_val == DS_X500_ERROR))
        !           285:        {
        !           286:            err->dse_type = DSE_SERVICEERROR;
        !           287:            err->ERR_SERVICE.DSE_sv_problem = DSE_SV_INVALIDREFERENCE;
        !           288:            ret_val = DS_X500_ERROR;
        !           289:            pslog (log_dsap,LLOG_EXCEPTIONS,"Invalid reference in entry",dn_print,(caddr_t)name);
        !           290:        }
        !           291: 
        !           292:        return (ret_val);
        !           293: }
        !           294: 
        !           295: struct di_block * ap2di (ap,name,master,di_type,oper,cr_type)
        !           296: struct access_point *ap;
        !           297: DN name;
        !           298: char master;
        !           299: char di_type;
        !           300: struct oper_act *oper;
        !           301: int cr_type;
        !           302: {
        !           303: struct access_point *loop;
        !           304: struct di_block        *res = NULL_DI_BLOCK;
        !           305: struct di_block        *ptr;
        !           306: struct di_block        *trail;
        !           307: 
        !           308:        if(ap == NULLACCESSPOINT)
        !           309:        {
        !           310:            LLOG(log_dsap, LLOG_EXCEPTIONS, ("No acces point to make into a di"));
        !           311:            return NULL_DI_BLOCK;
        !           312:        }
        !           313: 
        !           314:        for (loop=ap; loop!=NULLACCESSPOINT; loop=loop->ap_next) {
        !           315:                ptr = di_alloc();
        !           316:                ptr->di_dn = dn_cpy(loop->ap_name);
        !           317:                ptr->di_target = dn_cpy(name);
        !           318:                ptr->di_reftype = cr_type;
        !           319:                ptr->di_state = DI_ACCESSPOINT;
        !           320:                ptr->di_type = di_type;
        !           321:                ptr->di_oper = oper;
        !           322:                ptr->di_accesspoints = (struct access_point *) calloc(1, sizeof(struct access_point));
        !           323:                ptr->di_accesspoints->ap_name = dn_cpy(loop->ap_name);
        !           324:                ptr->di_accesspoints->ap_address = psap_cpy(loop->ap_address);
        !           325:                if (res == NULL_DI_BLOCK)
        !           326:                        trail = res = ptr;
        !           327:                else 
        !           328:                        trail = (trail->di_next = ptr);
        !           329: 
        !           330:                if (master) 
        !           331:                        break;  /* Only want to use first AP */
        !           332:        }
        !           333: 
        !           334:        sort_dsa_list (&res);
        !           335: 
        !           336:        return res;
        !           337: }
        !           338: 
        !           339: 
        !           340: int      dsa_info_parent (name,err,di_p,master)
        !           341: DN               name;
        !           342: struct DSError * err;
        !           343: struct di_block        **di_p;
        !           344: char master;
        !           345: {
        !           346:        DLOG(log_dsap, LLOG_TRACE, ("dsa_info_parent"));
        !           347: 
        !           348:        if(top_ap == NULLACCESSPOINT)
        !           349:        {
        !           350:            LLOG(log_dsap, LLOG_EXCEPTIONS, ("No parents!"));
        !           351:            err->dse_type = DSE_SERVICEERROR;
        !           352:            err->ERR_SERVICE.DSE_sv_problem = DSE_SV_INVALIDREFERENCE;
        !           353:            return(DS_X500_ERROR);
        !           354:        }
        !           355: 
        !           356:        *di_p = ap2di (top_ap,name,master,DI_TASK,NULLOPER,RT_SUPERIOR);
        !           357: 
        !           358:        return(DS_CONTINUE);
        !           359: }
        !           360: 

unix.superglobalmegacorp.com

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