This section shows how to develop functionality called by Directory Server before a client compare operation. The following example logs the target DN and attribute of the entry with which to compare values. For complete example code, refer to install-path/examples/testpreop.c.
#include "slapi-plugin.h"
int
testpreop_cmp(Slapi_PBlock * pb)
{
char * dn; /* Target DN */
char * attr_type; /* Type of attr to compare */
/* Attribute value could be lots of things, even a binary file.
* Here, do not try to retrieve the value to compare. */
int connId, opId, rc = 0;
long msgId;
rc |= slapi_pblock_get(pb, SLAPI_COMPARE_TARGET, &dn);
rc |= slapi_pblock_get(pb, SLAPI_COMPARE_TYPE, &attr_type);
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) {
slapi_log_info_ex(
SLAPI_LOG_INFO_AREA_PLUGIN,
SLAPI_LOG_INFO_LEVEL_DEFAULT,
msgId,
connId,
opId,
"testpreop_cmp in test-preop plug-in",
"Target DN: %s\tAttribute type: %s\n", dn, attr_type
);
}
return (rc);
}
The plug-in function can access the attribute value to use for the comparison as well. The attribute value in the parameter block is in a berval structure. Thus, the value could be binary data such as a JPEG image. No attempt is made to write the value to the logs.
The following example shows the slapi_pblock_get() call used to obtain the attribute value.
#include "slapi-plugin.h"
int
my_compare_fn(Slapi_PBlock * pb)
{
int rc = 0;
struct berval * attr_val;
/* Obtain the attribute value from the parameter block */
rc |= slapi_pblock_get(pb, SLAPI_COMPARE_VALUE, &attr_val);
if (rc != 0) {
rc = LDAP_OPERATIONS_ERROR;
slapi_send_ldap_result(pb, rc, NULL, NULL, 0, NULL);
return 0;
}
/* Do something with the value here. */
return 0;
}
Before using the plug-in function as described here, set up the example suffix and register the plug-in. See Extending the Bind Operation and “To register the Plug-in”, as described previously.
Try the example plug-in function using the ldapcompare tool installed with the Directory Server Resource Kit.
$ ldapcompare sn:Jensen uid=bjensen,ou=people,dc=example,dc=com comparing type: "sn" value: "Jensen" in entry "uid=bjensen,ou=people,dc=example,dc=com" compare TRUE |
The log entry in instance-path/logs/errors shows the following results, not including housekeeping information at the beginning of the log entry:
Target DN: uid=bjensen,ou=people,dc=example,dc=com Attribute type: sn