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; }
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); }
void ni_proplist_delete( ni_proplist *pl, ni_index which ) { int i; ni_prop_free(&pl->nipl_val[which]); for (i = (int)which + 1; i < pl->nipl_len; i++) { pl->nipl_val[i - 1] = pl->nipl_val[i]; } MM_SHRINK_ARRAY(pl->nipl_val, pl->nipl_len--); }
void ni_proplist_free( ni_proplist *pl ) { ni_index i; if (pl->nipl_val == NULL) { return; } for (i = 0; i < pl->nipl_len; i++) { ni_prop_free(&pl->nipl_val[i]); } MM_FREE_ARRAY(pl->nipl_val, pl->nipl_len); NI_INIT(pl); }
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; }