Use the slapi_dn_parent() function to return the parent and slapi_dn_beparent() to return the suffix associated with the entry, as shown in the following example.
#include "slapi-plugin.h" int test_dns(Slapi_PBlock * pb) { char * bind_DN; /* DN being used to bind */ char * parent_DN; /* DN of parent entry */ char * suffix_DN; /* DN of suffix entry */ int connId, opId, rc = 0; long msgId; rc |= slapi_pblock_get(pb, SLAPI_BIND_TARGET, &bind_DN); rc |= slapi_pblock_get(pb, SLAPI_OPERATION_MSGID, &msgId); rc |= slapi_pblock_get(pb, SLAPI_CONN_ID, &connId); rc |= slapi_pblock_get(pb, SLAPI_OPERATION_ID, &opId); if (rc != 0) return (-1); /* Get the parent DN of the DN being used to bind. */ parent_DN = slapi_dn_parent(bind_DN); slapi_log_info_ex( SLAPI_LOG_INFO_AREA_PLUGIN, SLAPI_LOG_INFO_LEVEL_DEFAULT, msgId, connId, opId, "test_dns in test-dns plug-in", "Parent DN of %s: %s\n", bind_DN, parent_DN ); /* Get the suffix DN of the DN being used to bind. */ suffix_DN = slapi_dn_beparent(pb, bind_DN); if (suffix_DN != NULL) { slapi_log_info_ex( SLAPI_LOG_INFO_AREA_PLUGIN, SLAPI_LOG_INFO_LEVEL_DEFAULT, msgId, connId, opId, "test_dns in test-dns plug-in", "Suffix for user (%s) is (%s).\n", bind_DN, suffix_DN ); } return rc; }
Notice that the suffix and parent DNs can be the same if the tree is not complex. For example, if the bind_DN is uid=bjensen,ou=People,dc=example,dc=com, the parent is ou=People,dc=example,dc=com. In this case, the parent is the same as the suffix.