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.