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

1.1       root        1: /* ds_init.c - initialise the DSA */
                      2: 
                      3: #ifndef lint
                      4: static char *rcsid = "$Header: /f/osi/quipu/RCS/ds_init.c,v 7.2 90/07/09 14:45:42 mrose Exp $";
                      5: #endif
                      6: 
                      7: /*
                      8:  * $Header: /f/osi/quipu/RCS/ds_init.c,v 7.2 90/07/09 14:45:42 mrose Exp $
                      9:  *
                     10:  *
                     11:  * $Log:       ds_init.c,v $
                     12:  * Revision 7.2  90/07/09  14:45:42  mrose
                     13:  * sync
                     14:  * 
                     15:  * Revision 7.1  90/03/15  11:18:49  mrose
                     16:  * quipu-sync
                     17:  * 
                     18:  * Revision 7.0  89/11/23  22:17:08  mrose
                     19:  * Release 6.0
                     20:  * 
                     21:  */
                     22: 
                     23: /*
                     24:  *                                NOTICE
                     25:  *
                     26:  *    Acquisition, use, and distribution of this module and related
                     27:  *    materials are subject to the restrictions of a license agreement.
                     28:  *    Consult the Preface in the User's Manual for the full terms of
                     29:  *    this agreement.
                     30:  *
                     31:  */
                     32: 
                     33: 
                     34: #include "quipu/config.h"
                     35: #include "quipu/util.h"
                     36: #include "quipu/read.h"
                     37: #include "quipu/dua.h"
                     38: #include "quipu/connection.h"
                     39: #include "quipu/entry.h"
                     40: 
                     41: AV_Sequence super_user;
                     42: Entry subtree_load ();
                     43: Entry make_path ();
                     44: extern LLog * log_dsap;
                     45: extern DN mydsadn;
                     46: extern Entry database_root;
                     47: static Entry load_dsa_cache_entry(), load_dsa_remote_entry();
                     48: 
                     49: dsa_init ()
                     50: {
                     51: Attr_Sequence as;
                     52: AttributeType manager;
                     53: extern char * mydsaname;
                     54: DN str2dn();
                     55: extern char * treedir;
                     56: extern char * get_entry_passwd();
                     57: struct edb_info * dsainfo;
                     58: AV_Sequence avs;
                     59: Entry newentry;
                     60: extern char * new_version();
                     61: extern char * quipuversion, * TidyString();
                     62: extern int parse_status;
                     63: Entry my_entry, rem_entry;
                     64: extern IFP unrav_fn;
                     65: extern IFP schema_fn;
                     66: int real_unravel_attribute ();
                     67: int real_check_schema ();
                     68: char loadstate = TRUE;
                     69: 
                     70:        check_dsa_known_oids ();
                     71: 
                     72:        unrav_fn = (IFP) real_unravel_attribute;
                     73:        schema_fn = (IFP) real_check_schema;
                     74: 
                     75:        if (( manager = AttrT_new (MANAGER_OID)) == NULLAttrT)
                     76:                fatal (-1,"Manager - unknown attribute - check oid tables");
                     77: 
                     78:        LLOG (log_dsap,LLOG_NOTICE,("dsa name %s",mydsaname));
                     79: 
                     80:        if ((mydsadn = str2dn (mydsaname)) == NULLDN) {
                     81:                fatal (-2,"Invalid dsa name");
                     82:        }
                     83: 
                     84:        if ((my_entry = load_dsa_cache_entry (mydsadn)) == NULLENTRY) {
                     85:                if (parse_status != 0)
                     86:                        fatal (-3,"can't load my entry");
                     87: 
                     88:                LLOG (log_dsap,LLOG_NOTICE,("Can't find my own entry - trying another DSA"));
                     89:                if ((my_entry = load_dsa_remote_entry (mydsadn)) == NULLENTRY)
                     90:                        fatal (-4,"can't get my own entry!");
                     91:                else {
                     92: #ifdef TURBO_DISK
                     93:                        if (turbo_writeall(my_entry) != OK)
                     94:                                fatal (-4,"Can't write my entry");
                     95: #else
                     96:                        if (journal (my_entry) != OK)
                     97:                                fatal (-4,"Can't write my entry");
                     98: #endif
                     99:                }
                    100:        } else if (my_entry->e_data == E_TYPE_CACHE_FROM_MASTER)
                    101:                if ((rem_entry = load_dsa_remote_entry (mydsadn)) != NULLENTRY) {
                    102:                        if (rem_entry->e_parent != NULLENTRY)
                    103:                                rem_entry->e_parent->e_edbversion = new_version();
                    104: #ifdef TURBO_DISK
                    105:                        if (turbo_writeall(rem_entry) != OK)
                    106:                                fatal (-4,"Can't re-write my entry");
                    107: #else
                    108:                        if (journal (rem_entry) != OK)
                    109:                                fatal (-4,"Can't re-write my entry");
                    110: #endif
                    111:                        my_entry = rem_entry;
                    112:                }
                    113: 
                    114:        if (get_entry_passwd (my_entry->e_attributes) == NULLCP) 
                    115:                /* This is not a fatal error, but some remote operations may fail */
                    116:                LLOG(log_dsap,LLOG_EXCEPTIONS,("Can't find my own PASSWORD"));
                    117: 
                    118:        if (my_entry->e_dsainfo != NULLDSA) {
                    119:                /* get manager attribute */
                    120:                if ((as = as_find_type(my_entry->e_attributes,manager)) == NULLATTR )
                    121:                        fatal (-5,"Manager attribute missing in my own entry");
                    122:                AttrT_free (manager);
                    123:                super_user = avs_cpy ((AV_Sequence)as->attr_value);
                    124:                if (strcmp(my_entry->e_dsainfo->dsa_version,TidyString (strdup (quipuversion))) != 0)
                    125:                        LLOG(log_dsap,LLOG_EXCEPTIONS,("WARNING: version number wrong (expecting '%s', got '%s') !!",quipuversion,my_entry->e_dsainfo->dsa_version));
                    126:                if (quipu_ctx_supported(my_entry) != 2)
                    127:                        LLOG(log_dsap,LLOG_EXCEPTIONS,("WARNING: I don't appear to support the QUIPU Context !!!"));
                    128:        } else 
                    129:                fatal (-6,"No edbinfo attribute in my own entry");
                    130: 
                    131:        if (parse_status != 0)
                    132:                loadstate = FALSE;
                    133: 
                    134:        for (avs = my_entry->e_dsainfo->dsa_attr ; avs != NULLAV; avs=avs->avseq_next) {
                    135:                if (avs->avseq_av.av_struct == NULL)
                    136:                        continue;
                    137:                dsainfo = (struct edb_info *) avs->avseq_av.av_struct;
                    138:                newentry = make_path (dsainfo->edb_name);
                    139:                (void) subtree_load (newentry,dsainfo->edb_name);
                    140:                if (parse_status != 0)
                    141:                        loadstate = FALSE;
                    142:        }
                    143: 
                    144:        if (loadstate == FALSE)
                    145:                fatal (-7,"DSA Halted");        
                    146: 
                    147:        if (database_root->e_child != NULLENTRY)
                    148:                database_root->e_data = database_root->e_child->e_data;
                    149: 
                    150:        return (OK);
                    151: 
                    152: }
                    153: 
                    154: static Entry load_dsa_cache_entry(dn)
                    155: DN dn;
                    156: {
                    157: DN ptr,trail = NULLDN;
                    158: Entry newentry;
                    159: 
                    160:        for (ptr=dn; ptr->dn_parent != NULLDN; ptr=ptr->dn_parent)
                    161:                trail = ptr;
                    162: 
                    163:        if (trail == NULLDN) {
                    164:                database_root = subtree_load (NULLENTRY,NULLDN);
                    165:                return (local_find_entry (dn,TRUE)); 
                    166:        }
                    167: 
                    168:        trail->dn_parent = NULLDN;
                    169:        newentry = make_path (dn);
                    170:        (void) subtree_load (newentry,dn);
                    171:        trail->dn_parent = ptr;
                    172:        
                    173:        return (local_find_entry (dn,TRUE)); 
                    174: }
                    175: 
                    176: static Entry load_dsa_remote_entry(dn)
                    177: DN dn;
                    178: {
                    179: static struct ds_read_arg read_arg =
                    180:        {
                    181:                default_common_args,
                    182:                NULLDN,
                    183:                {       /* entry info selection */
                    184:                        TRUE,
                    185:                        NULLATTR,
                    186:                        EIS_ATTRIBUTESANDVALUES
                    187:                }
                    188:        };
                    189: struct ds_read_result result;
                    190: struct DSError error;
                    191: extern Entry current_entry;
                    192: static struct ds_bind_arg bindarg;
                    193: static struct ds_bind_arg bindresult;
                    194: static struct ds_bind_error binderr;
                    195: int ad, id;
                    196: extern struct PSAPaddr *parent_psap();
                    197: struct PSAPaddr * addr;
                    198: 
                    199: #ifndef NO_STATS
                    200: extern LLog * log_stat;
                    201: extern dn_print ();
                    202: 
                    203:        pslog (log_stat,LLOG_NOTICE,"SYNC DAP remote entry lookup",dn_print,(caddr_t)dn);
                    204: #endif
                    205: 
                    206:        /* read from of remote DSA */
                    207:        /* Do synchronus read for now */
                    208:        /* Async read eventually */
                    209: 
                    210:        make_dsa_bind_arg (&bindarg);
                    211: 
                    212:        if ((addr = parent_psap ()) == NULLPA) {
                    213:                LLOG (log_dsap,LLOG_EXCEPTIONS,("No parent or quipu-db defined - check quiputailor"));
                    214:                return (NULLENTRY);
                    215:        }
                    216:        
                    217:        if (dap_bind (&ad, &bindarg, &binderr, &bindresult,addr) != OK) {
                    218:                LLOG (log_dsap,LLOG_EXCEPTIONS,("Can't bind to remote DSA thus can't read my own entry"));
                    219:                bind_arg_free (&bindarg);
                    220:                return (NULLENTRY);
                    221:        }
                    222: 
                    223:        bind_arg_free (&bindarg);
                    224:        bind_arg_free (&bindresult);
                    225: 
                    226:        read_arg.rda_object = dn;
                    227: 
                    228:        id = 1;
                    229:        if (dap_read (ad, &id,&read_arg, &error, &result) != DS_OK) {
                    230:                log_ds_error (&error);
                    231:                LLOG (log_dsap,LLOG_EXCEPTIONS,("Remote DSA failed on lookup of my address"));
                    232:                (void) dap_unbind (ad);
                    233:                return (NULLENTRY);
                    234:        }
                    235: 
                    236:        cache_entry (&(result.rdr_entry), TRUE, EIS_ATTRIBUTESANDVALUES);
                    237: 
                    238:        if (unravel_attribute (current_entry,&error) != OK) {
                    239:                log_ds_error (&error);
                    240:                LLOG (log_dsap, LLOG_EXCEPTIONS, ("Remote copy of my entry is wrong!"));
                    241:                return (NULLENTRY);
                    242:        }
                    243: 
                    244:        (void) dap_unbind (ad);
                    245: 
                    246:        return (current_entry);
                    247: }
                    248: 
                    249: 

unix.superglobalmegacorp.com

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