2 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
4 * Copyright 2002-2005 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:
27 static slapi_pblock_class_t
28 getPBlockClass( int param )
31 case SLAPI_PLUGIN_TYPE:
32 case SLAPI_PLUGIN_ARGC:
33 case SLAPI_PLUGIN_VERSION:
34 case SLAPI_PLUGIN_OPRETURN:
35 case SLAPI_PLUGIN_INTOP_RESULT:
36 case SLAPI_CONFIG_LINENO:
37 case SLAPI_CONFIG_ARGC:
38 case SLAPI_BIND_METHOD:
39 case SLAPI_MODRDN_DELOLDRDN:
40 case SLAPI_SEARCH_SCOPE:
41 case SLAPI_SEARCH_DEREF:
42 case SLAPI_SEARCH_SIZELIMIT:
43 case SLAPI_SEARCH_TIMELIMIT:
44 case SLAPI_SEARCH_ATTRSONLY:
46 case SLAPI_CHANGENUMBER:
48 case SLAPI_REQUESTOR_ISROOT:
49 case SLAPI_BE_READONLY:
50 case SLAPI_BE_LASTMOD:
51 case SLAPI_DB2LDIF_PRINTKEY:
52 case SLAPI_LDIF2DB_REMOVEDUPVALS:
53 case SLAPI_MANAGEDSAIT:
54 case SLAPI_IBM_BROADCAST_BE:
55 case SLAPI_IBM_REPLICATE:
56 case SLAPI_IBM_CL_MAX_ENTRIES:
57 case SLAPI_IBM_CL_FIRST_ENTRY:
58 case SLAPI_IBM_CL_LAST_ENTRY:
59 case SLAPI_IBM_EVENT_ENABLED:
60 case SLAPI_IBM_EVENT_MAXREG:
61 case SLAPI_IBM_EVENT_REGPERCONN:
62 case SLAPI_REQUESTOR_ISUPDATEDN:
63 case SLAPI_X_CONN_IS_UDP:
64 case SLAPI_X_CONN_SSF:
65 case SLAPI_RESULT_CODE:
66 return PBLOCK_CLASS_INTEGER;
70 case SLAPI_OPERATION_ID:
71 case SLAPI_OPINITIATED_TIME:
72 case SLAPI_ABANDON_MSGID:
73 return PBLOCK_CLASS_LONG_INTEGER;
76 case SLAPI_PLUGIN_DB_INIT_FN:
77 case SLAPI_PLUGIN_DESTROY_FN:
78 case SLAPI_PLUGIN_DB_BIND_FN:
79 case SLAPI_PLUGIN_DB_UNBIND_FN:
80 case SLAPI_PLUGIN_DB_SEARCH_FN:
81 case SLAPI_PLUGIN_DB_COMPARE_FN:
82 case SLAPI_PLUGIN_DB_MODIFY_FN:
83 case SLAPI_PLUGIN_DB_MODRDN_FN:
84 case SLAPI_PLUGIN_DB_ADD_FN:
85 case SLAPI_PLUGIN_DB_DELETE_FN:
86 case SLAPI_PLUGIN_DB_ABANDON_FN:
87 case SLAPI_PLUGIN_DB_CONFIG_FN:
88 case SLAPI_PLUGIN_CLOSE_FN:
89 case SLAPI_PLUGIN_DB_FLUSH_FN:
90 case SLAPI_PLUGIN_START_FN:
91 case SLAPI_PLUGIN_DB_SEQ_FN:
92 case SLAPI_PLUGIN_DB_ENTRY_FN:
93 case SLAPI_PLUGIN_DB_REFERRAL_FN:
94 case SLAPI_PLUGIN_DB_RESULT_FN:
95 case SLAPI_PLUGIN_DB_LDIF2DB_FN:
96 case SLAPI_PLUGIN_DB_DB2LDIF_FN:
97 case SLAPI_PLUGIN_DB_BEGIN_FN:
98 case SLAPI_PLUGIN_DB_COMMIT_FN:
99 case SLAPI_PLUGIN_DB_ABORT_FN:
100 case SLAPI_PLUGIN_DB_ARCHIVE2DB_FN:
101 case SLAPI_PLUGIN_DB_DB2ARCHIVE_FN:
102 case SLAPI_PLUGIN_DB_NEXT_SEARCH_ENTRY_FN:
103 case SLAPI_PLUGIN_DB_FREE_RESULT_SET_FN:
104 case SLAPI_PLUGIN_DB_SIZE_FN:
105 case SLAPI_PLUGIN_DB_TEST_FN:
106 case SLAPI_PLUGIN_DB_NO_ACL:
107 case SLAPI_PLUGIN_EXT_OP_FN:
108 case SLAPI_PLUGIN_EXT_OP_OIDLIST:
109 case SLAPI_PLUGIN_PRE_BIND_FN:
110 case SLAPI_PLUGIN_PRE_UNBIND_FN:
111 case SLAPI_PLUGIN_PRE_SEARCH_FN:
112 case SLAPI_PLUGIN_PRE_COMPARE_FN:
113 case SLAPI_PLUGIN_PRE_MODIFY_FN:
114 case SLAPI_PLUGIN_PRE_MODRDN_FN:
115 case SLAPI_PLUGIN_PRE_ADD_FN:
116 case SLAPI_PLUGIN_PRE_DELETE_FN:
117 case SLAPI_PLUGIN_PRE_ABANDON_FN:
118 case SLAPI_PLUGIN_PRE_ENTRY_FN:
119 case SLAPI_PLUGIN_PRE_REFERRAL_FN:
120 case SLAPI_PLUGIN_PRE_RESULT_FN:
121 case SLAPI_PLUGIN_POST_BIND_FN:
122 case SLAPI_PLUGIN_POST_UNBIND_FN:
123 case SLAPI_PLUGIN_POST_SEARCH_FN:
124 case SLAPI_PLUGIN_POST_COMPARE_FN:
125 case SLAPI_PLUGIN_POST_MODIFY_FN:
126 case SLAPI_PLUGIN_POST_MODRDN_FN:
127 case SLAPI_PLUGIN_POST_ADD_FN:
128 case SLAPI_PLUGIN_POST_DELETE_FN:
129 case SLAPI_PLUGIN_POST_ABANDON_FN:
130 case SLAPI_PLUGIN_POST_ENTRY_FN:
131 case SLAPI_PLUGIN_POST_REFERRAL_FN:
132 case SLAPI_PLUGIN_POST_RESULT_FN:
133 case SLAPI_PLUGIN_MR_FILTER_CREATE_FN:
134 case SLAPI_PLUGIN_MR_INDEXER_CREATE_FN:
135 case SLAPI_PLUGIN_MR_FILTER_MATCH_FN:
136 case SLAPI_PLUGIN_MR_FILTER_INDEX_FN:
137 case SLAPI_PLUGIN_MR_FILTER_RESET_FN:
138 case SLAPI_PLUGIN_MR_INDEX_FN:
139 case SLAPI_PLUGIN_COMPUTE_EVALUATOR_FN:
140 case SLAPI_PLUGIN_COMPUTE_SEARCH_REWRITER_FN:
141 case SLAPI_PLUGIN_ACL_ALLOW_ACCESS:
142 case SLAPI_X_PLUGIN_PRE_GROUP_FN:
143 case SLAPI_X_PLUGIN_POST_GROUP_FN:
144 case SLAPI_PLUGIN_AUDIT_FN:
145 return PBLOCK_CLASS_FUNCTION_POINTER;
149 case SLAPI_CONNECTION:
150 case SLAPI_OPERATION:
151 case SLAPI_OPERATION_PARAMETERS:
152 case SLAPI_OPERATION_TYPE:
153 case SLAPI_OPERATION_AUTHTYPE:
154 case SLAPI_BE_MONITORDN:
156 case SLAPI_REQUESTOR_DN:
158 case SLAPI_CONN_CLIENTIP:
159 case SLAPI_CONN_SERVERIP:
160 case SLAPI_CONN_AUTHTYPE:
161 case SLAPI_CONN_AUTHMETHOD:
162 case SLAPI_CONN_CERT:
163 case SLAPI_X_CONN_CLIENTPATH:
164 case SLAPI_X_CONN_SERVERPATH:
165 case SLAPI_X_CONN_SASL_CONTEXT:
166 case SLAPI_X_CONFIG_ARGV:
167 case SLAPI_X_INTOP_FLAGS:
168 case SLAPI_X_INTOP_RESULT_CALLBACK:
169 case SLAPI_X_INTOP_SEARCH_ENTRY_CALLBACK:
170 case SLAPI_X_INTOP_REFERRAL_ENTRY_CALLBACK:
171 case SLAPI_X_INTOP_CALLBACK_DATA:
172 case SLAPI_IBM_CONN_DN_ALT:
173 case SLAPI_IBM_CONN_DN_ORIG:
174 case SLAPI_IBM_GSSAPI_CONTEXT:
175 case SLAPI_PLUGIN_MR_OID:
176 case SLAPI_PLUGIN_MR_TYPE:
177 case SLAPI_PLUGIN_MR_VALUE:
178 case SLAPI_PLUGIN_MR_VALUES:
179 case SLAPI_PLUGIN_MR_KEYS:
181 case SLAPI_PLUGIN_PRIVATE:
182 case SLAPI_PLUGIN_ARGV:
183 case SLAPI_PLUGIN_OBJECT:
184 case SLAPI_PLUGIN_DESCRIPTION:
185 case SLAPI_PLUGIN_IDENTITY:
186 case SLAPI_PLUGIN_INTOP_SEARCH_ENTRIES:
187 case SLAPI_PLUGIN_INTOP_SEARCH_REFERRALS:
188 case SLAPI_PLUGIN_MR_FILTER_REUSABLE:
189 case SLAPI_PLUGIN_MR_QUERY_OPERATOR:
190 case SLAPI_PLUGIN_MR_USAGE:
192 case SLAPI_OP_LESS_OR_EQUAL:
193 case SLAPI_PLUGIN_MR_USAGE_INDEX:
194 case SLAPI_PLUGIN_SYNTAX_FILTER_AVA:
195 case SLAPI_PLUGIN_SYNTAX_FILTER_SUB:
196 case SLAPI_PLUGIN_SYNTAX_VALUES2KEYS:
197 case SLAPI_PLUGIN_SYNTAX_ASSERTION2KEYS_AVA:
198 case SLAPI_PLUGIN_SYNTAX_ASSERTION2KEYS_SUB:
199 case SLAPI_PLUGIN_SYNTAX_NAMES:
200 case SLAPI_PLUGIN_SYNTAX_OID:
201 case SLAPI_PLUGIN_SYNTAX_FLAGS:
202 case SLAPI_PLUGIN_SYNTAX_COMPARE:
203 case SLAPI_CONFIG_FILENAME:
204 case SLAPI_CONFIG_ARGV:
205 case SLAPI_TARGET_ADDRESS:
206 case SLAPI_TARGET_UNIQUEID:
207 case SLAPI_TARGET_DN:
208 case SLAPI_REQCONTROLS:
209 case SLAPI_ENTRY_PRE_OP:
210 case SLAPI_ENTRY_POST_OP:
211 case SLAPI_RESCONTROLS:
212 case SLAPI_ADD_RESCONTROL:
213 case SLAPI_ADD_ENTRY:
214 case SLAPI_ADD_EXISTING_DN_ENTRY:
215 case SLAPI_ADD_PARENT_ENTRY:
216 case SLAPI_ADD_PARENT_UNIQUEID:
217 case SLAPI_ADD_EXISTING_UNIQUEID_ENTRY:
218 case SLAPI_BIND_CREDENTIALS:
219 case SLAPI_BIND_SASLMECHANISM:
220 case SLAPI_BIND_RET_SASLCREDS:
221 case SLAPI_COMPARE_TYPE:
222 case SLAPI_COMPARE_VALUE:
223 case SLAPI_MODIFY_MODS:
224 case SLAPI_MODRDN_NEWRDN:
225 case SLAPI_MODRDN_NEWSUPERIOR:
226 case SLAPI_MODRDN_PARENT_ENTRY:
227 case SLAPI_MODRDN_NEWPARENT_ENTRY:
228 case SLAPI_MODRDN_TARGET_ENTRY:
229 case SLAPI_MODRDN_NEWSUPERIOR_ADDRESS:
230 case SLAPI_SEARCH_FILTER:
231 case SLAPI_SEARCH_STRFILTER:
232 case SLAPI_SEARCH_ATTRS:
234 case SLAPI_SEQ_ATTRNAME:
236 case SLAPI_EXT_OP_REQ_OID:
237 case SLAPI_EXT_OP_REQ_VALUE:
238 case SLAPI_EXT_OP_RET_OID:
239 case SLAPI_EXT_OP_RET_VALUE:
240 case SLAPI_MR_FILTER_ENTRY:
241 case SLAPI_MR_FILTER_TYPE:
242 case SLAPI_MR_FILTER_VALUE:
243 case SLAPI_MR_FILTER_OID:
244 case SLAPI_MR_FILTER_DNATTRS:
245 case SLAPI_LDIF2DB_FILE:
246 case SLAPI_PARENT_TXN:
248 case SLAPI_SEARCH_RESULT_SET:
249 case SLAPI_SEARCH_RESULT_ENTRY:
250 case SLAPI_SEARCH_REFERRALS:
251 case SLAPI_LOG_OPERATION:
252 case SLAPI_RESULT_TEXT:
253 case SLAPI_RESULT_MATCHED:
254 case SLAPI_X_GROUP_ENTRY:
255 case SLAPI_X_GROUP_ATTRIBUTE:
256 case SLAPI_X_GROUP_OPERATION_DN:
257 case SLAPI_X_GROUP_TARGET_ENTRY:
258 case SLAPI_PLUGIN_AUDIT_DATA:
259 case SLAPI_IBM_PBLOCK:
260 return PBLOCK_CLASS_POINTER;
266 return PBLOCK_CLASS_INVALID;
270 Lock( Slapi_PBlock *pb )
272 ldap_pvt_thread_mutex_lock(&pb->pblockMutex);
276 unLock( Slapi_PBlock *pb )
278 ldap_pvt_thread_mutex_unlock(&pb->pblockMutex);
282 get( Slapi_PBlock *pb, int param, void **val )
285 slapi_pblock_class_t pbClass;
287 pbClass = getPBlockClass( param );
288 if ( pbClass == PBLOCK_CLASS_INVALID ) {
295 case PBLOCK_CLASS_INTEGER:
298 case PBLOCK_CLASS_LONG_INTEGER:
301 case PBLOCK_CLASS_POINTER:
302 case PBLOCK_CLASS_FUNCTION_POINTER:
307 for ( i = 0; i < pb->numParams; i++ ) {
308 if ( pb->curParams[i] == param ) {
310 case PBLOCK_CLASS_INTEGER:
311 *((int *)val) = (int)pb->curVals[i];
313 case PBLOCK_CLASS_LONG_INTEGER:
314 *((long *)val) = (long)pb->curVals[i];
316 case PBLOCK_CLASS_POINTER:
317 case PBLOCK_CLASS_FUNCTION_POINTER:
318 *val = pb->curVals[i];
327 return PBLOCK_SUCCESS;
331 set( Slapi_PBlock *pb, int param, void *val )
333 #if defined(LDAP_SLAPI)
336 slapi_pblock_class_t pbClass;
338 pbClass = getPBlockClass( param );
339 if ( pbClass == PBLOCK_CLASS_INVALID ) {
345 if ( pb->numParams == PBLOCK_MAX_PARAMS ) {
350 if ( param == SLAPI_ADD_RESCONTROL ) {
352 param = SLAPI_RES_CONTROLS;
357 case SLAPI_CONN_AUTHMETHOD:
358 case SLAPI_IBM_CONN_DN_ALT:
359 case SLAPI_IBM_CONN_DN_ORIG:
360 case SLAPI_RESULT_TEXT:
361 case SLAPI_RESULT_MATCHED:
368 for( i = 0; i < pb->numParams; i++ ) {
369 if ( pb->curParams[i] == param ) {
374 if ( i >= pb->numParams ) {
375 pb->curParams[i] = param;
379 LDAPControl **ctrls = pb->curVals[i];
383 for (j=0; ctrls[j]; j++);
384 ctrls = ch_realloc( ctrls, (j+2)*sizeof(LDAPControl *) );
386 ctrls = ch_malloc( 2 * sizeof(LDAPControl *) );
391 pb->curVals[i] = ctrls;
393 if ( freeit ) ch_free( pb->curVals[i] );
394 pb->curVals[i] = val;
398 return PBLOCK_SUCCESS;
399 #endif /* LDAP_SLAPI */
404 clearPB( Slapi_PBlock *pb )
410 checkParams( Slapi_PBlock *pb, int flag )
416 deleteParam( Slapi_PBlock *p, int param )
421 for ( i = 0; i < p->numParams; i++ ) {
422 if ( p->curParams[i] == param ) {
427 if (i >= p->numParams ) {
431 if ( p->numParams > 1 ) {
432 p->curParams[i] = p->curParams[p->numParams];
433 p->curVals[i] = p->curVals[p->numParams];
437 return PBLOCK_SUCCESS;
443 #if defined(LDAP_SLAPI)
446 pb = (Slapi_PBlock *) ch_malloc(sizeof(Slapi_PBlock));
449 ldap_pvt_thread_mutex_init( &pb->pblockMutex );
450 memset( pb->curParams, 0, sizeof(pb->curParams) );
451 memset( pb->curVals, 0, sizeof(pb->curVals) );
452 pb->curParams[0] = SLAPI_IBM_PBLOCK;
453 pb->curVals[0] = NULL;
457 #endif /* LDAP_SLAPI */
462 slapi_pblock_destroy( Slapi_PBlock* pb )
464 #if defined(LDAP_SLAPI)
466 LDAPControl **rescontrols = NULL;
468 get( pb, SLAPI_CONN_DN,(void **)&str );
474 get( pb, SLAPI_CONN_AUTHMETHOD, (void **)&str );
480 get( pb, SLAPI_IBM_CONN_DN_ALT, (void **)&str );
486 get( pb, SLAPI_IBM_CONN_DN_ORIG, (void **)&str );
491 get( pb, SLAPI_RESULT_TEXT, (void **)&str );
497 get( pb, SLAPI_RESULT_MATCHED, (void **)&str );
503 get( pb, SLAPI_RESCONTROLS, (void **)&rescontrols );
504 if ( rescontrols != NULL ) {
505 ldap_controls_free( rescontrols );
509 ldap_pvt_thread_mutex_destroy( &pb->pblockMutex );
512 #endif /* LDAP_SLAPI */
516 slapi_pblock_get( Slapi_PBlock *pb, int arg, void *value )
518 #if defined(LDAP_SLAPI)
519 return get( pb, arg, (void **)value );
520 #endif /* LDAP_SLAPI */
525 slapi_pblock_set( Slapi_PBlock *pb, int arg, void *value )
527 #if defined(LDAP_SLAPI)
532 case SLAPI_CONN_AUTHMETHOD:
533 case SLAPI_IBM_CONN_DN_ALT:
534 case SLAPI_IBM_CONN_DN_ORIG:
535 case SLAPI_RESULT_TEXT:
536 case SLAPI_RESULT_MATCHED:
537 if ( value != NULL ) {
538 pTmp = (void *)slapi_ch_strdup((char *)value);
539 if ( pTmp == NULL ) {
540 return LDAP_NO_MEMORY;
548 return set( pb, arg, pTmp );
549 #endif /* LDAP_SLAPI */
550 return LDAP_NO_MEMORY;
554 slapi_pblock_clear( Slapi_PBlock *pb )
556 #if defined(LDAP_SLAPI)
558 #endif /* LDAP_SLAPI */
562 slapi_pblock_delete_param( Slapi_PBlock *p, int param )
564 #if defined(LDAP_SLAPI)
565 return deleteParam( p, param );
566 #endif /* LDAP_SLAPI */
571 slapi_pblock_check_params( Slapi_PBlock *pb, int flag )
573 #if defined(LDAP_SLAPI)
574 checkParams( pb, flag );
575 #endif /* LDAP_SLAPI */
582 slapi_int_pblock_get_first( Backend *be, Slapi_PBlock **pb )
584 #if defined(LDAP_SLAPI)
585 assert( pb != NULL );
586 *pb = SLAPI_BACKEND_PBLOCK( be );
587 return (*pb == NULL ? LDAP_OTHER : LDAP_SUCCESS);
588 #else /* LDAP_SLAPI */
590 #endif /* LDAP_SLAPI */
597 slapi_int_pblock_get_next( Slapi_PBlock **pb )
599 #if defined(LDAP_SLAPI)
600 assert( pb != NULL );
601 return slapi_pblock_get( *pb, SLAPI_IBM_PBLOCK, pb );
602 #else /* LDAP_SLAPI */
604 #endif /* LDAP_SLAPI */