/* * findSubtreeAndSearch - walk up the tree to find an entry with * the marker object class; if found, call search from there and * return the result it returns * * If 'attr' is NULL, the values are taken from 'values'. * If 'attr' is non-NULL, the values are taken from 'attr'. * * Return: * LDAP_SUCCESS - no matches, or the attribute matches the * target dn. * LDAP_CONSTRAINT_VIOLATION - an entry was found that already * contains the attribute value. * LDAP_OPERATIONS_ERROR - a server failure. */ static int findSubtreeAndSearch(Slapi_DN *parentDN, const char *attrName, Slapi_Attr *attr, struct berval **values, const char *requiredObjectClass, Slapi_DN *target, const char *markerObjectClass) { int result = LDAP_SUCCESS; Slapi_PBlock *spb = NULL; Slapi_DN *curpar = slapi_sdn_new(); Slapi_DN *newpar = NULL; slapi_sdn_get_parent(parentDN, curpar); while ((curpar != NULL) && (slapi_sdn_get_dn(curpar) != NULL)) { if ((spb = dnHasObjectClass(curpar, markerObjectClass))) { freePblock(spb); /* * Do the search. There is no entry that is allowed * to have the attribute already. */ result = search(curpar, attrName, attr, values, requiredObjectClass, target); break; } newpar = slapi_sdn_new(); slapi_sdn_copy(curpar, newpar); slapi_sdn_get_parent(newpar, curpar); slapi_sdn_free(&newpar); } slapi_sdn_free(&curpar); return result; }
Slapi_DN * slapi_sdn_dup( const Slapi_DN *sdn ) { Slapi_DN *new_sdn; new_sdn = slapi_sdn_new(); slapi_sdn_copy( sdn, new_sdn ); return new_sdn; }