2 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
4 * Copyright 2002-2006 The OpenLDAP Foundation.
5 * Portions Copyright 1997,2002-2003 IBM Corporation.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted only as authorized by the OpenLDAP
12 * A copy of this license is available in the file LICENSE in the
13 * top-level directory of the distribution or, alternatively, at
14 * <http://www.OpenLDAP.org/license.html>.
17 * This work was initially developed by IBM Corporation for use in
18 * IBM products and subsequently ported to OpenLDAP Software by
19 * Steve Omrani. Additional significant contributors include:
29 /* some parameters require a valid connection and operation */
30 #define PBLOCK_LOCK_CONN( _pb ) do { \
31 ldap_pvt_thread_mutex_lock( &(_pb)->pb_conn->c_mutex ); \
34 #define PBLOCK_UNLOCK_CONN( _pb ) do { \
35 ldap_pvt_thread_mutex_unlock( &(_pb)->pb_conn->c_mutex ); \
38 /* some parameters are only settable for internal operations */
39 #define PBLOCK_VALIDATE_IS_INTOP( _pb ) do { if ( (_pb)->pb_intop == 0 ) break; } while ( 0 )
41 static slapi_pblock_class_t
42 pblock_get_param_class( int param )
45 case SLAPI_PLUGIN_TYPE:
46 case SLAPI_PLUGIN_ARGC:
47 case SLAPI_PLUGIN_OPRETURN:
48 case SLAPI_PLUGIN_INTOP_RESULT:
49 case SLAPI_CONFIG_LINENO:
50 case SLAPI_CONFIG_ARGC:
51 case SLAPI_BIND_METHOD:
52 case SLAPI_MODRDN_DELOLDRDN:
53 case SLAPI_SEARCH_SCOPE:
54 case SLAPI_SEARCH_DEREF:
55 case SLAPI_SEARCH_SIZELIMIT:
56 case SLAPI_SEARCH_TIMELIMIT:
57 case SLAPI_SEARCH_ATTRSONLY:
59 case SLAPI_CHANGENUMBER:
61 case SLAPI_REQUESTOR_ISROOT:
62 case SLAPI_BE_READONLY:
63 case SLAPI_BE_LASTMOD:
64 case SLAPI_DB2LDIF_PRINTKEY:
65 case SLAPI_LDIF2DB_REMOVEDUPVALS:
66 case SLAPI_MANAGEDSAIT:
67 case SLAPI_X_MANAGEDIT:
68 case SLAPI_X_OPERATION_NO_SCHEMA_CHECK:
69 case SLAPI_IS_REPLICATED_OPERATION:
70 case SLAPI_X_CONN_IS_UDP:
71 case SLAPI_X_CONN_SSF:
72 case SLAPI_RESULT_CODE:
73 case SLAPI_LOG_OPERATION:
74 return PBLOCK_CLASS_INTEGER;
78 case SLAPI_OPERATION_ID:
79 case SLAPI_OPINITIATED_TIME:
80 case SLAPI_ABANDON_MSGID:
81 case SLAPI_X_OPERATION_DELETE_GLUE_PARENT:
82 return PBLOCK_CLASS_LONG_INTEGER;
85 case SLAPI_PLUGIN_DESTROY_FN:
86 case SLAPI_PLUGIN_DB_BIND_FN:
87 case SLAPI_PLUGIN_DB_UNBIND_FN:
88 case SLAPI_PLUGIN_DB_SEARCH_FN:
89 case SLAPI_PLUGIN_DB_COMPARE_FN:
90 case SLAPI_PLUGIN_DB_MODIFY_FN:
91 case SLAPI_PLUGIN_DB_MODRDN_FN:
92 case SLAPI_PLUGIN_DB_ADD_FN:
93 case SLAPI_PLUGIN_DB_DELETE_FN:
94 case SLAPI_PLUGIN_DB_ABANDON_FN:
95 case SLAPI_PLUGIN_DB_CONFIG_FN:
96 case SLAPI_PLUGIN_CLOSE_FN:
97 case SLAPI_PLUGIN_DB_FLUSH_FN:
98 case SLAPI_PLUGIN_START_FN:
99 case SLAPI_PLUGIN_DB_SEQ_FN:
100 case SLAPI_PLUGIN_DB_ENTRY_FN:
101 case SLAPI_PLUGIN_DB_REFERRAL_FN:
102 case SLAPI_PLUGIN_DB_RESULT_FN:
103 case SLAPI_PLUGIN_DB_LDIF2DB_FN:
104 case SLAPI_PLUGIN_DB_DB2LDIF_FN:
105 case SLAPI_PLUGIN_DB_BEGIN_FN:
106 case SLAPI_PLUGIN_DB_COMMIT_FN:
107 case SLAPI_PLUGIN_DB_ABORT_FN:
108 case SLAPI_PLUGIN_DB_ARCHIVE2DB_FN:
109 case SLAPI_PLUGIN_DB_DB2ARCHIVE_FN:
110 case SLAPI_PLUGIN_DB_NEXT_SEARCH_ENTRY_FN:
111 case SLAPI_PLUGIN_DB_FREE_RESULT_SET_FN:
112 case SLAPI_PLUGIN_DB_SIZE_FN:
113 case SLAPI_PLUGIN_DB_TEST_FN:
114 case SLAPI_PLUGIN_DB_NO_ACL:
115 case SLAPI_PLUGIN_EXT_OP_FN:
116 case SLAPI_PLUGIN_EXT_OP_OIDLIST:
117 case SLAPI_PLUGIN_PRE_BIND_FN:
118 case SLAPI_PLUGIN_PRE_UNBIND_FN:
119 case SLAPI_PLUGIN_PRE_SEARCH_FN:
120 case SLAPI_PLUGIN_PRE_COMPARE_FN:
121 case SLAPI_PLUGIN_PRE_MODIFY_FN:
122 case SLAPI_PLUGIN_PRE_MODRDN_FN:
123 case SLAPI_PLUGIN_PRE_ADD_FN:
124 case SLAPI_PLUGIN_PRE_DELETE_FN:
125 case SLAPI_PLUGIN_PRE_ABANDON_FN:
126 case SLAPI_PLUGIN_PRE_ENTRY_FN:
127 case SLAPI_PLUGIN_PRE_REFERRAL_FN:
128 case SLAPI_PLUGIN_PRE_RESULT_FN:
129 case SLAPI_PLUGIN_INTERNAL_PRE_ADD_FN:
130 case SLAPI_PLUGIN_INTERNAL_PRE_MODIFY_FN:
131 case SLAPI_PLUGIN_INTERNAL_PRE_MODRDN_FN:
132 case SLAPI_PLUGIN_INTERNAL_PRE_DELETE_FN:
133 case SLAPI_PLUGIN_BE_PRE_ADD_FN:
134 case SLAPI_PLUGIN_BE_PRE_MODIFY_FN:
135 case SLAPI_PLUGIN_BE_PRE_MODRDN_FN:
136 case SLAPI_PLUGIN_BE_PRE_DELETE_FN:
137 case SLAPI_PLUGIN_POST_BIND_FN:
138 case SLAPI_PLUGIN_POST_UNBIND_FN:
139 case SLAPI_PLUGIN_POST_SEARCH_FN:
140 case SLAPI_PLUGIN_POST_COMPARE_FN:
141 case SLAPI_PLUGIN_POST_MODIFY_FN:
142 case SLAPI_PLUGIN_POST_MODRDN_FN:
143 case SLAPI_PLUGIN_POST_ADD_FN:
144 case SLAPI_PLUGIN_POST_DELETE_FN:
145 case SLAPI_PLUGIN_POST_ABANDON_FN:
146 case SLAPI_PLUGIN_POST_ENTRY_FN:
147 case SLAPI_PLUGIN_POST_REFERRAL_FN:
148 case SLAPI_PLUGIN_POST_RESULT_FN:
149 case SLAPI_PLUGIN_INTERNAL_POST_ADD_FN:
150 case SLAPI_PLUGIN_INTERNAL_POST_MODIFY_FN:
151 case SLAPI_PLUGIN_INTERNAL_POST_MODRDN_FN:
152 case SLAPI_PLUGIN_INTERNAL_POST_DELETE_FN:
153 case SLAPI_PLUGIN_BE_POST_ADD_FN:
154 case SLAPI_PLUGIN_BE_POST_MODIFY_FN:
155 case SLAPI_PLUGIN_BE_POST_MODRDN_FN:
156 case SLAPI_PLUGIN_BE_POST_DELETE_FN:
157 case SLAPI_PLUGIN_MR_FILTER_CREATE_FN:
158 case SLAPI_PLUGIN_MR_INDEXER_CREATE_FN:
159 case SLAPI_PLUGIN_MR_FILTER_MATCH_FN:
160 case SLAPI_PLUGIN_MR_FILTER_INDEX_FN:
161 case SLAPI_PLUGIN_MR_FILTER_RESET_FN:
162 case SLAPI_PLUGIN_MR_INDEX_FN:
163 case SLAPI_PLUGIN_COMPUTE_EVALUATOR_FN:
164 case SLAPI_PLUGIN_COMPUTE_SEARCH_REWRITER_FN:
165 case SLAPI_PLUGIN_ACL_ALLOW_ACCESS:
166 case SLAPI_X_PLUGIN_PRE_GROUP_FN:
167 case SLAPI_X_PLUGIN_POST_GROUP_FN:
168 case SLAPI_PLUGIN_AUDIT_FN:
169 return PBLOCK_CLASS_FUNCTION_POINTER;
173 case SLAPI_CONNECTION:
174 case SLAPI_OPERATION:
175 case SLAPI_OPERATION_PARAMETERS:
176 case SLAPI_OPERATION_TYPE:
177 case SLAPI_OPERATION_AUTHTYPE:
178 case SLAPI_BE_MONITORDN:
180 case SLAPI_REQUESTOR_DN:
182 case SLAPI_CONN_CLIENTIP:
183 case SLAPI_CONN_SERVERIP:
184 case SLAPI_CONN_AUTHTYPE:
185 case SLAPI_CONN_AUTHMETHOD:
186 case SLAPI_CONN_CERT:
187 case SLAPI_X_CONN_CLIENTPATH:
188 case SLAPI_X_CONN_SERVERPATH:
189 case SLAPI_X_CONN_SASL_CONTEXT:
190 case SLAPI_X_CONFIG_ARGV:
191 case SLAPI_X_INTOP_FLAGS:
192 case SLAPI_X_INTOP_RESULT_CALLBACK:
193 case SLAPI_X_INTOP_SEARCH_ENTRY_CALLBACK:
194 case SLAPI_X_INTOP_REFERRAL_ENTRY_CALLBACK:
195 case SLAPI_X_INTOP_CALLBACK_DATA:
196 case SLAPI_PLUGIN_MR_OID:
197 case SLAPI_PLUGIN_MR_TYPE:
198 case SLAPI_PLUGIN_MR_VALUE:
199 case SLAPI_PLUGIN_MR_VALUES:
200 case SLAPI_PLUGIN_MR_KEYS:
202 case SLAPI_PLUGIN_PRIVATE:
203 case SLAPI_PLUGIN_ARGV:
204 case SLAPI_PLUGIN_OBJECT:
205 case SLAPI_PLUGIN_DESCRIPTION:
206 case SLAPI_PLUGIN_IDENTITY:
207 case SLAPI_PLUGIN_INTOP_SEARCH_ENTRIES:
208 case SLAPI_PLUGIN_INTOP_SEARCH_REFERRALS:
209 case SLAPI_PLUGIN_MR_FILTER_REUSABLE:
210 case SLAPI_PLUGIN_MR_QUERY_OPERATOR:
211 case SLAPI_PLUGIN_MR_USAGE:
213 case SLAPI_OP_LESS_OR_EQUAL:
214 case SLAPI_PLUGIN_MR_USAGE_INDEX:
215 case SLAPI_PLUGIN_SYNTAX_FILTER_AVA:
216 case SLAPI_PLUGIN_SYNTAX_FILTER_SUB:
217 case SLAPI_PLUGIN_SYNTAX_VALUES2KEYS:
218 case SLAPI_PLUGIN_SYNTAX_ASSERTION2KEYS_AVA:
219 case SLAPI_PLUGIN_SYNTAX_ASSERTION2KEYS_SUB:
220 case SLAPI_PLUGIN_SYNTAX_NAMES:
221 case SLAPI_PLUGIN_SYNTAX_OID:
222 case SLAPI_PLUGIN_SYNTAX_FLAGS:
223 case SLAPI_PLUGIN_SYNTAX_COMPARE:
224 case SLAPI_CONFIG_FILENAME:
225 case SLAPI_CONFIG_ARGV:
226 case SLAPI_TARGET_ADDRESS:
227 case SLAPI_TARGET_UNIQUEID:
228 case SLAPI_TARGET_DN:
229 case SLAPI_REQCONTROLS:
230 case SLAPI_ENTRY_PRE_OP:
231 case SLAPI_ENTRY_POST_OP:
232 case SLAPI_RESCONTROLS:
233 case SLAPI_X_OLD_RESCONTROLS:
234 case SLAPI_ADD_RESCONTROL:
235 case SLAPI_CONTROLS_ARG:
236 case SLAPI_ADD_ENTRY:
237 case SLAPI_ADD_EXISTING_DN_ENTRY:
238 case SLAPI_ADD_PARENT_ENTRY:
239 case SLAPI_ADD_PARENT_UNIQUEID:
240 case SLAPI_ADD_EXISTING_UNIQUEID_ENTRY:
241 case SLAPI_BIND_CREDENTIALS:
242 case SLAPI_BIND_SASLMECHANISM:
243 case SLAPI_BIND_RET_SASLCREDS:
244 case SLAPI_COMPARE_TYPE:
245 case SLAPI_COMPARE_VALUE:
246 case SLAPI_MODIFY_MODS:
247 case SLAPI_MODRDN_NEWRDN:
248 case SLAPI_MODRDN_NEWSUPERIOR:
249 case SLAPI_MODRDN_PARENT_ENTRY:
250 case SLAPI_MODRDN_NEWPARENT_ENTRY:
251 case SLAPI_MODRDN_TARGET_ENTRY:
252 case SLAPI_MODRDN_NEWSUPERIOR_ADDRESS:
253 case SLAPI_SEARCH_FILTER:
254 case SLAPI_SEARCH_STRFILTER:
255 case SLAPI_SEARCH_ATTRS:
257 case SLAPI_SEQ_ATTRNAME:
259 case SLAPI_EXT_OP_REQ_OID:
260 case SLAPI_EXT_OP_REQ_VALUE:
261 case SLAPI_EXT_OP_RET_OID:
262 case SLAPI_EXT_OP_RET_VALUE:
263 case SLAPI_MR_FILTER_ENTRY:
264 case SLAPI_MR_FILTER_TYPE:
265 case SLAPI_MR_FILTER_VALUE:
266 case SLAPI_MR_FILTER_OID:
267 case SLAPI_MR_FILTER_DNATTRS:
268 case SLAPI_LDIF2DB_FILE:
269 case SLAPI_PARENT_TXN:
271 case SLAPI_SEARCH_RESULT_SET:
272 case SLAPI_SEARCH_RESULT_ENTRY:
273 case SLAPI_SEARCH_REFERRALS:
274 case SLAPI_RESULT_TEXT:
275 case SLAPI_RESULT_MATCHED:
276 case SLAPI_X_GROUP_ENTRY:
277 case SLAPI_X_GROUP_ATTRIBUTE:
278 case SLAPI_X_GROUP_OPERATION_DN:
279 case SLAPI_X_GROUP_TARGET_ENTRY:
280 case SLAPI_X_ADD_STRUCTURAL_CLASS:
281 case SLAPI_PLUGIN_AUDIT_DATA:
282 case SLAPI_IBM_PBLOCK:
283 case SLAPI_PLUGIN_VERSION:
284 return PBLOCK_CLASS_POINTER;
290 return PBLOCK_CLASS_INVALID;
294 pblock_lock( Slapi_PBlock *pb )
296 ldap_pvt_thread_mutex_lock(&pb->pb_mutex);
300 pblock_unlock( Slapi_PBlock *pb )
302 ldap_pvt_thread_mutex_unlock(&pb->pb_mutex);
306 pblock_get_default( Slapi_PBlock *pb, int param, void **value )
309 slapi_pblock_class_t pbClass;
311 pbClass = pblock_get_param_class( param );
312 if ( pbClass == PBLOCK_CLASS_INVALID ) {
317 case PBLOCK_CLASS_INTEGER:
320 case PBLOCK_CLASS_LONG_INTEGER:
321 *((long *)value) = 0L;
323 case PBLOCK_CLASS_POINTER:
324 case PBLOCK_CLASS_FUNCTION_POINTER:
327 case PBLOCK_CLASS_INVALID:
331 for ( i = 0; i < pb->pb_nParams; i++ ) {
332 if ( pb->pb_params[i] == param ) {
334 case PBLOCK_CLASS_INTEGER:
335 *((int *)value) = pb->pb_values[i].pv_integer;
337 case PBLOCK_CLASS_LONG_INTEGER:
338 *((long *)value) = pb->pb_values[i].pv_long_integer;
340 case PBLOCK_CLASS_POINTER:
341 *value = pb->pb_values[i].pv_pointer;
343 case PBLOCK_CLASS_FUNCTION_POINTER:
344 *value = pb->pb_values[i].pv_function_pointer;
353 return PBLOCK_SUCCESS;
357 pblock_get_authtype( AuthorizationInformation *authz, int is_tls )
361 switch ( authz->sai_method ) {
363 authType = SLAPD_AUTH_SASL;
365 case LDAP_AUTH_SIMPLE:
366 authType = SLAPD_AUTH_SIMPLE;
369 authType = SLAPD_AUTH_NONE;
376 if ( is_tls && authType == NULL ) {
377 authType = SLAPD_AUTH_SSL;
384 pblock_set_default( Slapi_PBlock *pb, int param, void *value )
386 slapi_pblock_class_t pbClass;
389 pbClass = pblock_get_param_class( param );
390 if ( pbClass == PBLOCK_CLASS_INVALID ) {
394 if ( pb->pb_nParams == PBLOCK_MAX_PARAMS ) {
398 for ( i = 0; i < pb->pb_nParams; i++ ) {
399 if ( pb->pb_params[i] == param )
402 if ( i >= pb->pb_nParams ) {
403 pb->pb_params[i] = param;
408 case PBLOCK_CLASS_INTEGER:
409 pb->pb_values[i].pv_integer = (*((int *)value));
411 case PBLOCK_CLASS_LONG_INTEGER:
412 pb->pb_values[i].pv_long_integer = (*((long *)value));
414 case PBLOCK_CLASS_POINTER:
415 pb->pb_values[i].pv_pointer = value;
417 case PBLOCK_CLASS_FUNCTION_POINTER:
418 pb->pb_values[i].pv_function_pointer = value;
424 return PBLOCK_SUCCESS;
428 pblock_be_call( Slapi_PBlock *pb, int (*bep)(Operation *) )
434 PBLOCK_ASSERT_OP( pb, 0 );
438 op->o_bd = select_backend( &op->o_req_ndn, 0, 0 );
446 pblock_get( Slapi_PBlock *pb, int param, void **value )
448 int rc = PBLOCK_SUCCESS;
453 case SLAPI_OPERATION:
456 case SLAPI_OPINITIATED_TIME:
457 PBLOCK_ASSERT_OP( pb, 0 );
458 *((long *)value) = pb->pb_op->o_time;
460 case SLAPI_OPERATION_ID:
461 PBLOCK_ASSERT_OP( pb, 0 );
462 *((long *)value) = pb->pb_op->o_opid;
464 case SLAPI_OPERATION_TYPE:
465 PBLOCK_ASSERT_OP( pb, 0 );
466 *((ber_tag_t *)value) = pb->pb_op->o_tag;
468 case SLAPI_X_OPERATION_DELETE_GLUE_PARENT:
469 PBLOCK_ASSERT_OP( pb, 0 );
470 *((ber_tag_t *)value) = pb->pb_op->o_delete_glue_parent;
472 case SLAPI_X_OPERATION_NO_SCHEMA_CHECK:
473 PBLOCK_ASSERT_OP( pb, 0 );
474 *((int *)value) = get_no_schema_check( pb->pb_op );
476 case SLAPI_X_ADD_STRUCTURAL_CLASS:
477 PBLOCK_ASSERT_OP( pb, 0 );
479 if ( pb->pb_op->o_tag == LDAP_REQ_ADD ) {
480 struct berval tmpval = BER_BVNULL;
482 rc = mods_structural_class( pb->pb_op->ora_modlist,
483 &tmpval, &pb->pb_rs->sr_text,
484 pb->pb_textbuf, sizeof( pb->pb_textbuf ));
485 *((char **)value) = tmpval.bv_val;
490 case SLAPI_REQCONTROLS:
491 PBLOCK_ASSERT_OP( pb, 0 );
492 *((LDAPControl ***)value) = pb->pb_op->o_ctrls;
494 case SLAPI_REQUESTOR_DN:
495 PBLOCK_ASSERT_OP( pb, 0 );
496 *((char **)value) = pb->pb_op->o_dn.bv_val;
498 case SLAPI_MANAGEDSAIT:
499 PBLOCK_ASSERT_OP( pb, 0 );
500 *((int *)value) = get_manageDSAit( pb->pb_op );
502 case SLAPI_X_MANAGEDIT:
503 PBLOCK_ASSERT_OP( pb, 0 );
504 *((int *)value) = get_manageDIT( pb->pb_op );
507 PBLOCK_ASSERT_OP( pb, 0 );
508 *((BackendDB **)value) = select_backend( &pb->pb_op->o_req_ndn, 0, 0 );
511 PBLOCK_ASSERT_OP( pb, 0 );
512 if ( pb->pb_op->o_bd != NULL )
513 *((char **)value) = pb->pb_op->o_bd->bd_info->bi_type;
517 case SLAPI_CONNECTION:
518 *value = pb->pb_conn;
520 case SLAPI_X_CONN_SSF:
521 PBLOCK_ASSERT_OP( pb, 0 );
522 *((slap_ssf_t *)value) = pb->pb_conn->c_ssf;
524 case SLAPI_X_CONN_SASL_CONTEXT:
525 PBLOCK_ASSERT_CONN( pb );
526 if ( pb->pb_conn->c_sasl_authctx != NULL )
527 *value = pb->pb_conn->c_sasl_authctx;
529 *value = pb->pb_conn->c_sasl_sockctx;
531 case SLAPI_TARGET_DN:
532 PBLOCK_ASSERT_OP( pb, 0 );
533 *((char **)value) = pb->pb_op->o_req_dn.bv_val;
535 case SLAPI_REQUESTOR_ISROOT:
536 *((int *)value) = pblock_be_call( pb, be_isroot );
538 case SLAPI_IS_REPLICATED_OPERATION:
539 *((int *)value) = pblock_be_call( pb, be_slurp_update );
541 case SLAPI_CONN_AUTHTYPE:
542 case SLAPI_CONN_AUTHMETHOD: /* XXX should return SASL mech */
543 PBLOCK_ASSERT_CONN( pb );
544 *((char **)value) = pblock_get_authtype( &pb->pb_conn->c_authz,
546 pb->pb_conn->c_is_tls
552 case SLAPI_X_CONN_IS_UDP:
553 PBLOCK_ASSERT_CONN( pb );
554 #ifdef LDAP_CONNECTIONLESS
555 *((int *)value) = pb->pb_conn->c_is_udp;
561 PBLOCK_ASSERT_CONN( pb );
562 *((long *)value) = pb->pb_conn->c_connid;
565 PBLOCK_ASSERT_CONN( pb );
566 *((char **)value) = pb->pb_conn->c_dn.bv_val;
568 case SLAPI_CONN_CLIENTIP:
569 PBLOCK_ASSERT_CONN( pb );
570 if ( strncmp( pb->pb_conn->c_peer_name.bv_val, "IP=", 3 ) == 0 )
571 *((char **)value) = &pb->pb_conn->c_peer_name.bv_val[3];
575 case SLAPI_X_CONN_CLIENTPATH:
576 PBLOCK_ASSERT_CONN( pb );
577 if ( strncmp( pb->pb_conn->c_peer_name.bv_val, "PATH=", 3 ) == 0 )
578 *((char **)value) = &pb->pb_conn->c_peer_name.bv_val[5];
582 case SLAPI_CONN_SERVERIP:
583 PBLOCK_ASSERT_CONN( pb );
584 if ( strncmp( pb->pb_conn->c_peer_name.bv_val, "IP=", 3 ) == 0 )
585 *((char **)value) = &pb->pb_conn->c_sock_name.bv_val[3];
589 case SLAPI_X_CONN_SERVERPATH:
590 PBLOCK_ASSERT_CONN( pb );
591 if ( strncmp( pb->pb_conn->c_peer_name.bv_val, "PATH=", 3 ) == 0 )
592 *((char **)value) = &pb->pb_conn->c_sock_name.bv_val[5];
596 case SLAPI_RESULT_CODE:
597 case SLAPI_PLUGIN_INTOP_RESULT:
598 PBLOCK_ASSERT_OP( pb, 0 );
599 *((int *)value) = pb->pb_rs->sr_err;
601 case SLAPI_RESULT_TEXT:
602 PBLOCK_ASSERT_OP( pb, 0 );
603 *((const char **)value) = pb->pb_rs->sr_text;
605 case SLAPI_RESULT_MATCHED:
606 PBLOCK_ASSERT_OP( pb, 0 );
607 *((const char **)value) = pb->pb_rs->sr_matched;
609 case SLAPI_ADD_ENTRY:
610 PBLOCK_ASSERT_OP( pb, 0 );
611 if ( pb->pb_op->o_tag == LDAP_REQ_ADD )
612 *((Slapi_Entry **)value) = pb->pb_op->ora_e;
616 case SLAPI_MODIFY_MODS: {
617 LDAPMod **mods = NULL;
620 pblock_get_default( pb, param, (void **)&mods );
621 if ( mods == NULL && pb->pb_intop == 0 ) {
622 switch ( pb->pb_op->o_tag ) {
623 case LDAP_REQ_MODIFY:
624 ml = pb->pb_op->orm_modlist;
626 case LDAP_REQ_MODRDN:
627 ml = pb->pb_op->orr_modlist;
633 mods = slapi_int_modifications2ldapmods( ml );
634 pblock_set_default( pb, param, (void *)mods );
636 *((LDAPMod ***)value) = mods;
639 case SLAPI_MODRDN_NEWRDN:
640 PBLOCK_ASSERT_OP( pb, 0 );
641 if ( pb->pb_op->o_tag == LDAP_REQ_MODRDN )
642 *((char **)value) = pb->pb_op->orr_newrdn.bv_val;
646 case SLAPI_MODRDN_NEWSUPERIOR:
647 PBLOCK_ASSERT_OP( pb, 0 );
648 if ( pb->pb_op->o_tag == LDAP_REQ_MODRDN && pb->pb_op->orr_newSup != NULL )
649 *((char **)value) = pb->pb_op->orr_newSup->bv_val;
653 case SLAPI_MODRDN_DELOLDRDN:
654 PBLOCK_ASSERT_OP( pb, 0 );
655 if ( pb->pb_op->o_tag == LDAP_REQ_MODRDN )
656 *((int *)value) = pb->pb_op->orr_deleteoldrdn;
660 case SLAPI_SEARCH_SCOPE:
661 PBLOCK_ASSERT_OP( pb, 0 );
662 if ( pb->pb_op->o_tag == LDAP_REQ_SEARCH )
663 *((int *)value) = pb->pb_op->ors_scope;
667 case SLAPI_SEARCH_DEREF:
668 PBLOCK_ASSERT_OP( pb, 0 );
669 if ( pb->pb_op->o_tag == LDAP_REQ_SEARCH )
670 *((int *)value) = pb->pb_op->ors_deref;
674 case SLAPI_SEARCH_SIZELIMIT:
675 PBLOCK_ASSERT_OP( pb, 0 );
676 if ( pb->pb_op->o_tag == LDAP_REQ_SEARCH )
677 *((int *)value) = pb->pb_op->ors_slimit;
681 case SLAPI_SEARCH_TIMELIMIT:
682 PBLOCK_ASSERT_OP( pb, 0 );
683 if ( pb->pb_op->o_tag == LDAP_REQ_SEARCH )
684 *((int *)value) = pb->pb_op->ors_tlimit;
688 case SLAPI_SEARCH_FILTER:
689 PBLOCK_ASSERT_OP( pb, 0 );
690 if ( pb->pb_op->o_tag == LDAP_REQ_SEARCH )
691 *((Slapi_Filter **)value) = pb->pb_op->ors_filter;
693 *((Slapi_Filter **)value) = NULL;
695 case SLAPI_SEARCH_STRFILTER:
696 PBLOCK_ASSERT_OP( pb, 0 );
697 if ( pb->pb_op->o_tag == LDAP_REQ_SEARCH )
698 *((char **)value) = pb->pb_op->ors_filterstr.bv_val;
700 *((char **)value) = NULL;
702 case SLAPI_SEARCH_ATTRS: {
705 PBLOCK_ASSERT_OP( pb, 0 );
706 if ( pb->pb_op->o_tag != LDAP_REQ_SEARCH ) {
710 pblock_get_default( pb, param, (void **)&attrs );
711 if ( attrs == NULL && pb->pb_intop == 0 ) {
712 attrs = anlist2charray_x( pb->pb_op->ors_attrs, 0, pb->pb_op->o_tmpmemctx );
713 pblock_set_default( pb, param, (void *)attrs );
715 *((char ***)value) = attrs;
718 case SLAPI_SEARCH_ATTRSONLY:
719 PBLOCK_ASSERT_OP( pb, 0 );
720 if ( pb->pb_op->o_tag == LDAP_REQ_SEARCH )
721 *((int *)value) = pb->pb_op->ors_attrsonly;
725 case SLAPI_SEARCH_RESULT_ENTRY:
726 PBLOCK_ASSERT_OP( pb, 0 );
727 *((Slapi_Entry **)value) = pb->pb_rs->sr_entry;
729 case SLAPI_BIND_RET_SASLCREDS:
730 PBLOCK_ASSERT_OP( pb, 0 );
731 *((struct berval **)value) = pb->pb_rs->sr_sasldata;
733 case SLAPI_EXT_OP_REQ_OID:
734 *((const char **)value) = pb->pb_op->ore_reqoid.bv_val;
736 case SLAPI_EXT_OP_REQ_VALUE:
737 *((struct berval **)value) = pb->pb_op->ore_reqdata;
739 case SLAPI_EXT_OP_RET_OID:
740 PBLOCK_ASSERT_OP( pb, 0 );
741 *((const char **)value) = pb->pb_rs->sr_rspoid;
743 case SLAPI_EXT_OP_RET_VALUE:
744 PBLOCK_ASSERT_OP( pb, 0 );
745 *((struct berval **)value) = pb->pb_rs->sr_rspdata;
747 case SLAPI_BIND_METHOD:
748 if ( pb->pb_op->o_tag == LDAP_REQ_BIND )
749 *((int *)value) = pb->pb_op->orb_method;
753 case SLAPI_BIND_CREDENTIALS:
754 if ( pb->pb_op->o_tag == LDAP_REQ_BIND )
755 *((struct berval **)value) = &pb->pb_op->orb_cred;
759 case SLAPI_COMPARE_TYPE:
760 if ( pb->pb_op->o_tag == LDAP_REQ_COMPARE )
761 *((char **)value) = pb->pb_op->orc_ava->aa_desc->ad_cname.bv_val;
765 case SLAPI_COMPARE_VALUE:
766 if ( pb->pb_op->o_tag == LDAP_REQ_COMPARE )
767 *((struct berval **)value) = &pb->pb_op->orc_ava->aa_value;
771 case SLAPI_ABANDON_MSGID:
772 if ( pb->pb_op->o_tag == LDAP_REQ_ABANDON )
773 *((int *)value) = pb->pb_op->orn_msgid;
778 rc = pblock_get_default( pb, param, value );
788 pblock_add_control( Slapi_PBlock *pb, LDAPControl *control )
790 LDAPControl **controls = NULL;
793 pblock_get_default( pb, SLAPI_RESCONTROLS, (void **)&controls );
795 if ( controls != NULL ) {
796 for ( i = 0; controls[i] != NULL; i++ )
802 controls = (LDAPControl **)slapi_ch_realloc( (char *)controls,
803 ( i + 2 ) * sizeof(LDAPControl *));
804 controls[i++] = slapi_dup_control( control );
807 return pblock_set_default( pb, SLAPI_RESCONTROLS, (void *)controls );
811 pblock_set_dn( void *value, struct berval *dn, struct berval *ndn, void *memctx )
815 if ( !BER_BVISNULL( dn )) {
816 slap_sl_free( dn->bv_val, memctx );
819 if ( !BER_BVISNULL( ndn )) {
820 slap_sl_free( ndn->bv_val, memctx );
824 bv.bv_val = (char *)value;
825 bv.bv_len = ( value != NULL ) ? strlen( bv.bv_val ) : 0;
827 return dnPrettyNormal( NULL, &bv, dn, ndn, memctx );
831 pblock_set( Slapi_PBlock *pb, int param, void *value )
833 int rc = PBLOCK_SUCCESS;
838 case SLAPI_OPERATION:
839 pb->pb_op = (Operation *)value;
841 case SLAPI_OPINITIATED_TIME:
842 PBLOCK_ASSERT_OP( pb, 0 );
843 pb->pb_op->o_time = *((long *)value);
845 case SLAPI_OPERATION_ID:
846 PBLOCK_ASSERT_OP( pb, 0 );
847 pb->pb_op->o_opid = *((long *)value);
849 case SLAPI_OPERATION_TYPE:
850 PBLOCK_ASSERT_OP( pb, 0 );
851 pb->pb_op->o_tag = *((ber_tag_t *)value);
853 case SLAPI_X_OPERATION_DELETE_GLUE_PARENT:
854 PBLOCK_ASSERT_OP( pb, 0 );
855 pb->pb_op->o_delete_glue_parent = *((int *)value);
857 case SLAPI_X_OPERATION_NO_SCHEMA_CHECK:
858 PBLOCK_ASSERT_OP( pb, 0 );
859 pb->pb_op->o_no_schema_check = *((int *)value);
861 case SLAPI_REQCONTROLS:
862 PBLOCK_ASSERT_OP( pb, 0 );
863 pb->pb_op->o_ctrls = (LDAPControl **)value;
865 case SLAPI_RESCONTROLS: {
866 LDAPControl **ctrls = NULL;
868 pblock_get_default( pb, param, (void **)&ctrls );
869 if ( ctrls != NULL ) {
870 /* free old ones first */
871 ldap_controls_free( ctrls );
873 rc = pblock_set_default( pb, param, value );
876 case SLAPI_ADD_RESCONTROL:
877 PBLOCK_ASSERT_OP( pb, 0 );
878 rc = pblock_add_control( pb, (LDAPControl *)value );
880 case SLAPI_REQUESTOR_DN:
881 PBLOCK_ASSERT_OP( pb, 0 );
882 rc = pblock_set_dn( value, &pb->pb_op->o_dn, &pb->pb_op->o_ndn, pb->pb_op->o_tmpmemctx );
884 case SLAPI_MANAGEDSAIT:
885 PBLOCK_ASSERT_OP( pb, 0 );
886 pb->pb_op->o_managedsait = *((int *)value);
888 case SLAPI_X_MANAGEDIT:
889 PBLOCK_ASSERT_OP( pb, 0 );
890 pb->pb_op->o_managedit = *((int *)value);
893 PBLOCK_ASSERT_OP( pb, 0 );
894 pb->pb_op->o_bd = (BackendDB *)value;
896 case SLAPI_CONNECTION:
897 pb->pb_conn = (Connection *)value;
899 case SLAPI_X_CONN_SSF:
900 PBLOCK_ASSERT_CONN( pb );
901 PBLOCK_LOCK_CONN( pb );
902 pb->pb_conn->c_ssf = (slap_ssf_t)(long)value;
903 PBLOCK_UNLOCK_CONN( pb );
905 case SLAPI_X_CONN_SASL_CONTEXT:
906 PBLOCK_ASSERT_CONN( pb );
907 PBLOCK_LOCK_CONN( pb );
908 pb->pb_conn->c_sasl_authctx = value;
909 PBLOCK_UNLOCK_CONN( pb );
911 case SLAPI_TARGET_DN:
912 PBLOCK_ASSERT_OP( pb, 0 );
913 rc = pblock_set_dn( value, &pb->pb_op->o_req_dn, &pb->pb_op->o_req_ndn, pb->pb_op->o_tmpmemctx );
916 PBLOCK_ASSERT_CONN( pb );
917 PBLOCK_LOCK_CONN( pb );
918 pb->pb_conn->c_connid = *((long *)value);
919 PBLOCK_UNLOCK_CONN( pb );
922 PBLOCK_ASSERT_CONN( pb );
923 PBLOCK_LOCK_CONN( pb );
924 rc = pblock_set_dn( value, &pb->pb_conn->c_dn, &pb->pb_conn->c_ndn, NULL );
925 PBLOCK_UNLOCK_CONN( pb );
927 case SLAPI_RESULT_CODE:
928 case SLAPI_PLUGIN_INTOP_RESULT:
929 PBLOCK_ASSERT_OP( pb, 0 );
930 pb->pb_rs->sr_err = *((int *)value);
932 case SLAPI_RESULT_TEXT:
933 PBLOCK_ASSERT_OP( pb, 0 );
934 snprintf( pb->pb_textbuf, sizeof( pb->pb_textbuf ), "%s", (char *)value );
935 pb->pb_rs->sr_text = pb->pb_textbuf;
937 case SLAPI_RESULT_MATCHED:
938 PBLOCK_ASSERT_OP( pb, 0 );
939 pb->pb_rs->sr_matched = (char *)value; /* XXX should dup? */
941 case SLAPI_ADD_ENTRY:
942 PBLOCK_ASSERT_OP( pb, 0 );
943 if ( pb->pb_op->o_tag == LDAP_REQ_ADD )
944 pb->pb_op->ora_e = (Slapi_Entry *)value;
948 case SLAPI_MODIFY_MODS: {
950 Modifications *newmods;
952 PBLOCK_ASSERT_OP( pb, 0 );
953 rc = pblock_set_default( pb, param, value );
954 if ( rc != PBLOCK_SUCCESS ) {
958 if ( pb->pb_op->o_tag == LDAP_REQ_MODIFY ) {
959 mlp = &pb->pb_op->orm_modlist;
960 } else if ( pb->pb_op->o_tag == LDAP_REQ_ADD ) {
961 mlp = &pb->pb_op->ora_modlist;
962 } else if ( pb->pb_op->o_tag == LDAP_REQ_MODRDN ) {
963 mlp = &pb->pb_op->orr_modlist;
968 newmods = slapi_int_ldapmods2modifications( (LDAPMod **)value );
969 if ( newmods != NULL ) {
970 slap_mods_free( *mlp, 1 );
975 case SLAPI_MODRDN_NEWRDN:
976 PBLOCK_ASSERT_OP( pb, 0 );
977 PBLOCK_VALIDATE_IS_INTOP( pb );
978 if ( pb->pb_op->o_tag == LDAP_REQ_MODRDN ) {
979 rc = pblock_set_dn( value, &pb->pb_op->orr_newrdn, &pb->pb_op->orr_nnewrdn, pb->pb_op->o_tmpmemctx );
980 if ( rc == LDAP_SUCCESS )
981 rc = rdn_validate( &pb->pb_op->orr_nnewrdn );
986 case SLAPI_MODRDN_NEWSUPERIOR:
987 PBLOCK_ASSERT_OP( pb, 0 );
988 PBLOCK_VALIDATE_IS_INTOP( pb );
989 if ( pb->pb_op->o_tag == LDAP_REQ_MODRDN ) {
990 if ( value == NULL ) {
991 if ( pb->pb_op->orr_newSup != NULL ) {
992 pb->pb_op->o_tmpfree( pb->pb_op->orr_newSup, pb->pb_op->o_tmpmemctx );
993 BER_BVZERO( pb->pb_op->orr_newSup );
994 pb->pb_op->orr_newSup = NULL;
996 if ( pb->pb_op->orr_newSup != NULL ) {
997 pb->pb_op->o_tmpfree( pb->pb_op->orr_nnewSup, pb->pb_op->o_tmpmemctx );
998 BER_BVZERO( pb->pb_op->orr_nnewSup );
999 pb->pb_op->orr_nnewSup = NULL;
1002 if ( pb->pb_op->orr_newSup == NULL ) {
1003 pb->pb_op->orr_newSup = (struct berval *)pb->pb_op->o_tmpalloc(
1004 sizeof(struct berval), pb->pb_op->o_tmpmemctx );
1005 BER_BVZERO( pb->pb_op->orr_newSup );
1007 if ( pb->pb_op->orr_nnewSup == NULL ) {
1008 pb->pb_op->orr_nnewSup = (struct berval *)pb->pb_op->o_tmpalloc(
1009 sizeof(struct berval), pb->pb_op->o_tmpmemctx );
1010 BER_BVZERO( pb->pb_op->orr_nnewSup );
1012 rc = pblock_set_dn( value, pb->pb_op->orr_newSup, pb->pb_op->orr_nnewSup, pb->pb_op->o_tmpmemctx );
1018 case SLAPI_MODRDN_DELOLDRDN:
1019 PBLOCK_ASSERT_OP( pb, 0 );
1020 PBLOCK_VALIDATE_IS_INTOP( pb );
1021 if ( pb->pb_op->o_tag == LDAP_REQ_MODRDN )
1022 pb->pb_op->orr_deleteoldrdn = *((int *)value);
1026 case SLAPI_SEARCH_SCOPE: {
1027 int scope = *((int *)value);
1029 PBLOCK_ASSERT_OP( pb, 0 );
1030 if ( pb->pb_op->o_tag == LDAP_REQ_SEARCH ) {
1031 switch ( *((int *)value) ) {
1032 case LDAP_SCOPE_BASE:
1033 case LDAP_SCOPE_ONELEVEL:
1034 case LDAP_SCOPE_SUBTREE:
1035 case LDAP_SCOPE_SUBORDINATE:
1036 pb->pb_op->ors_scope = scope;
1047 case SLAPI_SEARCH_DEREF:
1048 PBLOCK_ASSERT_OP( pb, 0 );
1049 if ( pb->pb_op->o_tag == LDAP_REQ_SEARCH )
1050 pb->pb_op->ors_deref = *((int *)value);
1054 case SLAPI_SEARCH_SIZELIMIT:
1055 PBLOCK_ASSERT_OP( pb, 0 );
1056 if ( pb->pb_op->o_tag == LDAP_REQ_SEARCH )
1057 pb->pb_op->ors_slimit = *((int *)value);
1061 case SLAPI_SEARCH_TIMELIMIT:
1062 PBLOCK_ASSERT_OP( pb, 0 );
1063 if ( pb->pb_op->o_tag == LDAP_REQ_SEARCH )
1064 pb->pb_op->ors_tlimit = *((int *)value);
1068 case SLAPI_SEARCH_FILTER:
1069 PBLOCK_ASSERT_OP( pb, 0 );
1070 if ( pb->pb_op->o_tag == LDAP_REQ_SEARCH )
1071 pb->pb_op->ors_filter = (Slapi_Filter *)value;
1075 case SLAPI_SEARCH_STRFILTER:
1076 PBLOCK_ASSERT_OP( pb, 0 );
1077 if ( pb->pb_op->o_tag == LDAP_REQ_SEARCH ) {
1078 pb->pb_op->ors_filterstr.bv_val = (char *)value;
1079 pb->pb_op->ors_filterstr.bv_len = strlen((char *)value);
1084 case SLAPI_SEARCH_ATTRS: {
1085 AttributeName *an = NULL;
1087 char **attrs = (char **)value;
1089 PBLOCK_ASSERT_OP( pb, 0 );
1090 PBLOCK_VALIDATE_IS_INTOP( pb );
1092 if ( pb->pb_op->o_tag != LDAP_REQ_SEARCH ) {
1096 /* also set mapped attrs */
1097 rc = pblock_set_default( pb, param, value );
1098 if ( rc != PBLOCK_SUCCESS ) {
1101 if ( pb->pb_op->ors_attrs != NULL ) {
1102 pb->pb_op->o_tmpfree( pb->pb_op->ors_attrs, pb->pb_op->o_tmpmemctx );
1103 pb->pb_op->ors_attrs = NULL;
1105 if ( attrs != NULL ) {
1106 for ( i = 0; attrs[i] != NULL; i++ )
1110 an = (AttributeName *)pb->pb_op->o_tmpalloc( (i + 1) *
1111 sizeof(AttributeName), pb->pb_op->o_tmpmemctx );
1112 for ( i = 0; attrs[i] != NULL; i++ ) {
1113 an[i].an_desc = NULL;
1115 an[i].an_oc_exclude = 0;
1116 an[i].an_name.bv_val = attrs[i];
1117 an[i].an_name.bv_len = strlen( attrs[i] );
1118 slap_bv2ad( &an[i].an_name, &an[i].an_desc, &pb->pb_rs->sr_text );
1120 an[i].an_name.bv_val = NULL;
1121 an[i].an_name.bv_len = 0;
1123 pb->pb_op->ors_attrs = an;
1126 case SLAPI_SEARCH_ATTRSONLY:
1127 PBLOCK_ASSERT_OP( pb, 0 );
1128 PBLOCK_VALIDATE_IS_INTOP( pb );
1130 if ( pb->pb_op->o_tag == LDAP_REQ_SEARCH )
1131 pb->pb_op->ors_attrsonly = *((int *)value);
1135 case SLAPI_SEARCH_RESULT_ENTRY:
1136 PBLOCK_ASSERT_OP( pb, 0 );
1137 pb->pb_rs->sr_entry = (Slapi_Entry *)value;
1139 case SLAPI_BIND_RET_SASLCREDS:
1140 PBLOCK_ASSERT_OP( pb, 0 );
1141 pb->pb_rs->sr_sasldata = (struct berval *)value;
1143 case SLAPI_EXT_OP_REQ_OID:
1144 PBLOCK_ASSERT_OP( pb, 0 );
1145 PBLOCK_VALIDATE_IS_INTOP( pb );
1147 if ( pb->pb_op->o_tag == LDAP_REQ_EXTENDED ) {
1148 pb->pb_op->ore_reqoid.bv_val = (char *)value;
1149 pb->pb_op->ore_reqoid.bv_len = strlen((char *)value);
1154 case SLAPI_EXT_OP_REQ_VALUE:
1155 PBLOCK_ASSERT_OP( pb, 0 );
1156 PBLOCK_VALIDATE_IS_INTOP( pb );
1158 if ( pb->pb_op->o_tag == LDAP_REQ_EXTENDED )
1159 pb->pb_op->ore_reqdata = (struct berval *)value;
1163 case SLAPI_EXT_OP_RET_OID:
1164 PBLOCK_ASSERT_OP( pb, 0 );
1165 pb->pb_rs->sr_rspoid = (char *)value;
1167 case SLAPI_EXT_OP_RET_VALUE:
1168 PBLOCK_ASSERT_OP( pb, 0 );
1169 pb->pb_rs->sr_rspdata = (struct berval *)value;
1171 case SLAPI_BIND_METHOD:
1172 PBLOCK_ASSERT_OP( pb, 0 );
1173 PBLOCK_VALIDATE_IS_INTOP( pb );
1175 if ( pb->pb_op->o_tag == LDAP_REQ_BIND )
1176 pb->pb_op->orb_method = *((int *)value);
1180 case SLAPI_BIND_CREDENTIALS:
1181 PBLOCK_ASSERT_OP( pb, 0 );
1182 PBLOCK_VALIDATE_IS_INTOP( pb );
1184 if ( pb->pb_op->o_tag == LDAP_REQ_BIND )
1185 pb->pb_op->orb_cred = *((struct berval *)value);
1189 case SLAPI_COMPARE_TYPE:
1190 PBLOCK_ASSERT_OP( pb, 0 );
1191 PBLOCK_VALIDATE_IS_INTOP( pb );
1193 if ( pb->pb_op->o_tag == LDAP_REQ_COMPARE ) {
1196 pb->pb_op->orc_ava->aa_desc = NULL;
1197 rc = slap_str2ad( (char *)value, &pb->pb_op->orc_ava->aa_desc, &text );
1202 case SLAPI_COMPARE_VALUE:
1203 PBLOCK_ASSERT_OP( pb, 0 );
1204 PBLOCK_VALIDATE_IS_INTOP( pb );
1206 if ( pb->pb_op->o_tag == LDAP_REQ_COMPARE )
1207 pb->pb_op->orc_ava->aa_value = *((struct berval *)value);
1211 case SLAPI_ABANDON_MSGID:
1212 PBLOCK_ASSERT_OP( pb, 0 );
1213 PBLOCK_VALIDATE_IS_INTOP( pb );
1215 if ( pb->pb_op->o_tag == LDAP_REQ_ABANDON)
1216 pb->pb_op->orn_msgid = *((int *)value);
1220 case SLAPI_REQUESTOR_ISROOT:
1221 case SLAPI_IS_REPLICATED_OPERATION:
1222 case SLAPI_CONN_AUTHTYPE:
1223 case SLAPI_CONN_AUTHMETHOD:
1224 case SLAPI_X_CONN_IS_UDP:
1225 case SLAPI_CONN_CLIENTIP:
1226 case SLAPI_X_CONN_CLIENTPATH:
1227 case SLAPI_CONN_SERVERIP:
1228 case SLAPI_X_CONN_SERVERPATH:
1229 case SLAPI_X_ADD_STRUCTURAL_CLASS:
1230 /* These parameters cannot be set */
1234 rc = pblock_set_default( pb, param, value );
1238 pblock_unlock( pb );
1244 pblock_clear( Slapi_PBlock *pb )
1250 pblock_delete_param( Slapi_PBlock *p, int param )
1256 for ( i = 0; i < p->pb_nParams; i++ ) {
1257 if ( p->pb_params[i] == param ) {
1262 if (i >= p->pb_nParams ) {
1264 return PBLOCK_ERROR;
1267 /* move last parameter to index of deleted parameter */
1268 if ( p->pb_nParams > 1 ) {
1269 p->pb_params[i] = p->pb_params[p->pb_nParams - 1];
1270 p->pb_values[i] = p->pb_values[p->pb_nParams - 1];
1276 return PBLOCK_SUCCESS;
1280 slapi_pblock_new(void)
1284 pb = (Slapi_PBlock *) ch_calloc( 1, sizeof(Slapi_PBlock) );
1286 ldap_pvt_thread_mutex_init( &pb->pb_mutex );
1288 pb->pb_params[0] = SLAPI_IBM_PBLOCK;
1289 pb->pb_values[0].pv_pointer = NULL;
1300 pblock_destroy( Slapi_PBlock *pb )
1302 LDAPControl **controls = NULL;
1303 LDAPMod **mods = NULL;
1304 char **attrs = NULL;
1306 assert( pb != NULL );
1308 pblock_get_default( pb, SLAPI_RESCONTROLS, (void **)&controls );
1309 if ( controls != NULL ) {
1310 ldap_controls_free( controls );
1313 if ( pb->pb_intop ) {
1314 slapi_int_connection_done_pb( pb );
1316 pblock_get_default( pb, SLAPI_MODIFY_MODS, (void **)&mods );
1317 ldap_mods_free( mods, 1 );
1319 pblock_get_default( pb, SLAPI_SEARCH_ATTRS, (void **)&attrs );
1320 if ( attrs != NULL )
1321 pb->pb_op->o_tmpfree( attrs, pb->pb_op->o_tmpmemctx );
1324 ldap_pvt_thread_mutex_destroy( &pb->pb_mutex );
1325 slapi_ch_free( (void **)&pb );
1329 slapi_pblock_destroy( Slapi_PBlock *pb )
1332 pblock_destroy( pb );
1337 slapi_pblock_get( Slapi_PBlock *pb, int arg, void *value )
1339 return pblock_get( pb, arg, (void **)value );
1343 slapi_pblock_set( Slapi_PBlock *pb, int arg, void *value )
1345 return pblock_set( pb, arg, value );
1349 slapi_pblock_clear( Slapi_PBlock *pb )
1355 slapi_pblock_delete_param( Slapi_PBlock *p, int param )
1357 return pblock_delete_param( p, param );
1361 * OpenLDAP extension
1364 slapi_int_pblock_get_first( Backend *be, Slapi_PBlock **pb )
1366 assert( pb != NULL );
1367 *pb = SLAPI_BACKEND_PBLOCK( be );
1368 return (*pb == NULL ? LDAP_OTHER : LDAP_SUCCESS);
1372 * OpenLDAP extension
1375 slapi_int_pblock_get_next( Slapi_PBlock **pb )
1377 assert( pb != NULL );
1378 return slapi_pblock_get( *pb, SLAPI_IBM_PBLOCK, pb );
1381 #endif /* LDAP_SLAPI */