For an internal add, you allocate space for a parameter block. You set up the parameter block for the add with slapi_add_entry_internal_set_pb(). Thus, the entry is in the parameter block when you invoke slapi_add_internal_pb(). Then you free the parameter block. The internal add consumes the entry that is passed in to the server through the parameter block.
#include "slapi-plugin.h"
/* Internal operations require an ID for the plug-in. */
static Slapi_ComponentId * plugin_id = NULL;
int
test_internal()
{
Slapi_DN * sdn; /* DN holder for internal ops */
Slapi_Entry * entry; /* Entry holder for internal ops */
Slapi_PBlock * pb; /* PBlock for internal ops */
char * str = NULL; /* String holder for internal ops*/
int len; /* Length of LDIF from entry */
int rc; /* Return code; 0 means success. */
/* Check that the example suffix exists. */
sdn = slapi_sdn_new_dn_byval("dc=example,dc=com");
if (slapi_be_exist(sdn)) {
slapi_log_info_ex(
SLAPI_LOG_INFO_AREA_PLUGIN,
SLAPI_LOG_INFO_LEVEL_DEFAULT,
SLAPI_LOG_NO_MSGID,
SLAPI_LOG_NO_CONNID,
SLAPI_LOG_NO_OPID,
"test_internal in test-internal plug-in",
"Suffix (%s) does not exist, exiting.\n",
slapi_sdn_get_dn(sdn)
);
slapi_sdn_free(&sdn);
return (0);
}
slapi_sdn_free(&sdn);
/*
* Add an entry for Quentin Cubbins to the example suffix
* using slapi_add_entry_internal(). */
entry = slapi_entry_alloc();
slapi_entry_set_dn( /* slapi_entry_set_dn() */
entry, /* requires a copy of the DN. */
slapi_ch_strdup("uid=qcubbins,ou=People,dc=example,dc=com")
);
/* slapi_entry_add_string() */
/* does not require a copy. */
slapi_entry_add_string(entry, "objectclass", "top");
slapi_entry_add_string(entry, "objectclass", "person");
slapi_entry_add_string(entry, "objectclass", "organizationalPerson");
slapi_entry_add_string(entry, "objectclass", "inetOrgPerson");
slapi_entry_add_string(entry, "uid", "qcubbins");
slapi_entry_add_string(entry, "givenName", "Quentin");
slapi_entry_add_string(entry, "sn", "Cubbins");
slapi_entry_add_string(entry, "cn", "Quentin Cubbins");
slapi_entry_add_string(entry, "mail", "qcubbins@example.com");
slapi_entry_add_string(entry, "userPassword", "qcubbins");
slapi_entry_add_string(entry, "secretary",
"uid=bjensen,ou=People,dc=example,dc=com");
pb = slapi_pblock_new(); /* Make a new PBlock... */
rc = slapi_add_entry_internal_set_pb(
pb,
entry,
NULL, /* No controls */
plugin_id,
SLAPI_OP_FLAG_NEVER_CHAIN /* Never chain this operation. */
);
if (rc != 0) {
slapi_pblock_destroy(pb);
return (-1);
}
str = slapi_entry2str(entry, &len);/* Entry as LDIF for the log.
* Note you have to capture this
* before the internal add, during
* which the entry is consumed. */
rc = slapi_add_internal_pb(pb); /* Entry consumed here */
/* ... get status ... */
slapi_pblock_get(pb, SLAPI_PLUGIN_INTOP_RESULT, &rc);
if (rc != LDAP_SUCCESS) {
slapi_pblock_destroy(pb);
return (-1);
}
slapi_pblock_destroy(pb);
slapi_log_info_ex(
SLAPI_LOG_INFO_AREA_PLUGIN,
SLAPI_LOG_INFO_LEVEL_DEFAULT,
SLAPI_LOG_NO_MSGID,
SLAPI_LOG_NO_CONNID,
SLAPI_LOG_NO_OPID,
"test_internal in test-internal plug-in",
"\nAdded entry:\n%sEntry length: %d\n", str, len
);
return (0);
}
Notice that the internal operation requires a plugin_id. As shown, the plug-in ID is a global variable. The plug-in ID is set during plug-in initialization, using this function:
slapi_pblock_get(pb, SLAPI_PLUGIN_IDENTITY, &plugin_id);
The parameter block, pb, is passed to the plug-in initialization function. Refer to the internal_init() function in internal.c for a sample implementation.