static ni_status ni_proplist2binding(ni_proplist *pl, krb5_config_section **ret) { int i, j; krb5_config_section **next = NULL; for (i = 0; i < pl->ni_proplist_len; i++) { if (!strcmp(pl->nipl_val[i].nip_name, "name")) continue; for (j = 0; j < pl->nipl_val[i].nip_val.ni_namelist_len; j++) { krb5_config_binding *b; b = malloc(sizeof(*b)); if (b == NULL) return NI_FAILED; b->next = NULL; b->type = krb5_config_string; b->name = ni_name_dup(pl->nipl_val[i].nip_name); b->u.string = ni_name_dup(pl->nipl_val[i].nip_val.ninl_val[j]); if (next == NULL) { *ret = b; } else { *next = b; } next = &b->next; } } return NI_OK; }
ni_status ni2_mergedirprop(void *domain, ni_id *dir, const ni_name key, ni_namelist values) { /* mergeprop given a directory rather than a pathname */ ni_status ret; ni_property p; ni_namelist nl; ni_index where, whereval; int i; /* need to be talking to the master */ ni_needwrite(domain, 1); /* fetch list of property keys from directory */ NI_INIT(&nl); ret = ni_listprops(domain, dir, &nl); if (ret != NI_OK) { return ret; } /* check for existing property with this key */ where = ni_namelist_match(nl, key); ni_namelist_free(&nl); /* if property doesn't exist, create it */ if (where == NI_INDEX_NULL) { NI_INIT(&p); p.nip_name = ni_name_dup(key); p.nip_val = ni_namelist_dup(values); ret = ni_createprop(domain, dir, p, NI_INDEX_NULL); ni_prop_free(&p); return ret; } /* property exists: replace the existing values */ /* fetch existing namelist for this property */ NI_INIT(&nl); ret = ni_readprop(domain, dir, where, &nl); if (ret != NI_OK) { return ret; } /* merge new values */ for (i = 0; i < values.ni_namelist_len; i++) { whereval = ni_namelist_match(nl, values.ni_namelist_val[i]); if (whereval == NI_INDEX_NULL) { ni_namelist_insert(&nl, values.ni_namelist_val[i], NI_INDEX_NULL); } } /* write the new list back */ ret = ni_writeprop(domain, dir, where, nl); ni_namelist_free(&nl); return ret; }
static ni_status ni_idlist2binding(void *ni, ni_idlist *idlist, krb5_config_section **ret) { int i; ni_status nis; krb5_config_section **next; for (i = 0; i < idlist->ni_idlist_len; i++) { ni_proplist pl; ni_id nid; ni_idlist children; krb5_config_binding *b; ni_index index; nid.nii_instance = 0; nid.nii_object = idlist->ni_idlist_val[i]; nis = ni_read(ni, &nid, &pl); if (nis != NI_OK) { return nis; } index = ni_proplist_match(pl, "name", NULL); b = malloc(sizeof(*b)); if (b == NULL) return NI_FAILED; if (i == 0) { *ret = b; } else { *next = b; } b->type = krb5_config_list; b->name = ni_name_dup(pl.nipl_val[index].nip_val.ninl_val[0]); b->next = NULL; b->u.list = NULL; /* get the child directories */ nis = ni_children(ni, &nid, &children); if (nis == NI_OK) { nis = ni_idlist2binding(ni, &children, &b->u.list); if (nis != NI_OK) { return nis; } } nis = ni_proplist2binding(&pl, b->u.list == NULL ? &b->u.list : &b->u.list->next); ni_proplist_free(&pl); if (nis != NI_OK) { return nis; } next = &b->next; } ni_idlist_free(idlist); return NI_OK; }
ni_property ni_prop_dup( const ni_property prop ) { ni_property newprop; newprop.nip_name = ni_name_dup(prop.nip_name); newprop.nip_val = ni_namelist_dup(prop.nip_val); return (newprop); }
void nipl_createprop(ni_proplist *l, const ni_name n) { /* property list utility */ /* add a name property to a property list */ ni_property p; NI_INIT(&p); p.nip_name = ni_name_dup(n); p.nip_val.ninl_len = 0; p.nip_val.ninl_val = NULL; ni_proplist_insert(l, p, NI_INDEX_NULL); ni_prop_free(&p); }
ni_namelist ni_namelist_dup( const ni_namelist nl ) { ni_namelist newlist; ni_index i; newlist.ninl_len = nl.ninl_len; MM_ALLOC_ARRAY(newlist.ninl_val, newlist.ninl_len); for (i = 0; i < nl.ninl_len; i++) { newlist.ninl_val[i] = ni_name_dup(nl.ninl_val[i]); } return (newlist); }
void ni_namelist_insert( ni_namelist *nl, ni_name_const nm, ni_index where ) { ni_index i; MM_GROW_ARRAY(nl->ninl_val, nl->ninl_len); for (i = nl->ninl_len; i > where; i--) { nl->ninl_val[i] = nl->ninl_val[i - 1]; } nl->ninl_val[i] = ni_name_dup(nm); nl->ninl_len++; }
ni_proplist ni_proplist_dup( const ni_proplist pl ) { ni_proplist newlist; ni_index i; newlist.nipl_len = pl.nipl_len; MM_ALLOC_ARRAY(newlist.nipl_val, pl.nipl_len); for (i = 0; i < pl.nipl_len; i++) { newlist.nipl_val[i].nip_name = ni_name_dup(pl.nipl_val[i].nip_name); newlist.nipl_val[i].nip_val = ni_namelist_dup(pl.nipl_val[i].nip_val); } return (newlist); }
int isnidir(char *dir, ni_name *tag) { char *s; int i; s = rindex(dir, '.'); if (s == NULL) { return (0); } for (i = 0; suffixes[i] != NULL; i++) { if (ni_name_match(s, suffixes[i])) { *tag = ni_name_dup(dir); s = rindex(*tag, '.'); *s = 0; return (1); } } return (0); }
ni_status ni2_createdirprop(void *domain, ni_id *dir, const ni_name key, ni_namelist values) { /* createprop given a directory rather than a pathname */ ni_status ret; ni_property p; ni_namelist nl; ni_index where; /* need to be talking to the master */ ni_needwrite(domain, 1); /* fetch list of property keys from directory */ NI_INIT(&nl); ret = ni_listprops(domain, dir, &nl); if (ret != NI_OK) { return ret; } /* check for existing property with this key */ where = ni_namelist_match(nl, key); ni_namelist_free(&nl); /* if property doesn't exist, create it */ if (where == NI_INDEX_NULL) { NI_INIT(&p); p.nip_name = ni_name_dup(key); p.nip_val = ni_namelist_dup(values); ret = ni_createprop(domain, dir, p, NI_INDEX_NULL); ni_prop_free(&p); return ret; } /* property exists: replace the existing values */ ret = ni_writeprop(domain, dir, where, values); return ret; }