ni_status ni2_destroydir(void *domain, ni_id *dir, ni_id *parent) { /* destroy a directory and all it's subdirectories */ /* this is the recursive workhorse */ ni_status ret; int i; ni_idlist children; ni_id child; /* need to be talking to the master */ ni_needwrite(domain, 1); /* get a list of all my children */ NI_INIT(&children); ret = ni_children(domain, dir, &children); if (ret != NI_OK) return ret; /* destroy each child */ for (i = 0; i < children.ni_idlist_len; i++) { child.nii_object = children.ni_idlist_val[i]; ret = ni_self(domain, &child); if (ret != NI_OK) return ret; ret = ni2_destroydir(domain, &child, dir); if (ret != NI_OK) return ret; } /* free list of child ids */ ni_idlist_free(&children); /* destroy myself */ return ni_destroy(domain, parent, *dir); }
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_status ni2_copydirtoparentdir(void *srcdomain, ni_id *srcdir, void*dstdomain, ni_id *dstdir , bool recursive) { ni_status ret; ni_idlist children; int i, len; ni_proplist p; ni_id dir, newdstdir; NI_INIT(&p); /* get proplist from src dir */ ret = ni_read(srcdomain, srcdir, &p); if (ret != NI_OK) { return ret; } /* create the destination dir */ ret = ni_create(dstdomain, dstdir, p, &newdstdir, NI_INDEX_NULL); if (ret != NI_OK) { ni_proplist_free(&p); return ret; } ni_proplist_free(&p); if (recursive) { NI_INIT(&children); /* get list of children */ ret = ni_children(srcdomain, srcdir, &children); if (ret != NI_OK) { return ret; } len = children.ni_idlist_len; for (i = 0; i < len; i++) { dir.nii_object = children.ni_idlist_val[i]; ret = ni_self(srcdomain, &dir); if (ret != NI_OK) { ni_idlist_free(&children); return ret; } ret = ni2_copydirtoparentdir(srcdomain,&dir,dstdomain, &newdstdir,recursive); } ni_idlist_free(&children); } return NI_OK; }
krb5_error_code KRB5_LIB_FUNCTION krb5_config_parse_file (krb5_context context, const char *fname, krb5_config_section **res) { void *ni = NULL, *lastni = NULL; int i; ni_status nis; ni_id nid; ni_idlist children; krb5_config_section *s; int ret; s = NULL; for (i = 0; i < 256; i++) { if (i == 0) { nis = ni_open(NULL, ".", &ni); } else { if (lastni != NULL) ni_free(lastni); lastni = ni; nis = ni_open(lastni, "..", &ni); } if (nis != NI_OK) break; nis = ni_pathsearch(ni, &nid, "/locations/kerberos"); if (nis == NI_OK) { nis = ni_children(ni, &nid, &children); if (nis != NI_OK) break; nis = ni_idlist2binding(ni, &children, &s); break; } } if (ni != NULL) ni_free(ni); if (ni != lastni && lastni != NULL) ni_free(lastni); ret = (nis == NI_OK) ? 0 : -1; if (ret == 0) { *res = s; } else { *res = NULL; } return ret; }