]> git.sur5r.net Git - openldap/blob - servers/slapd/slapi/slapi_pblock.c
Fix typo when comparing local sock name
[openldap] / servers / slapd / slapi / slapi_pblock.c
1 /* $OpenLDAP$ */
2 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
3  *
4  * Copyright 2002-2006 The OpenLDAP Foundation.
5  * Portions Copyright 1997,2002-2003 IBM Corporation.
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted only as authorized by the OpenLDAP
10  * Public License.
11  *
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>.
15  */
16 /* ACKNOWLEDGEMENTS:
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:
20  *   Luke Howard
21  */
22
23 #include "portable.h"
24 #include <slap.h>
25 #include <slapi.h>
26
27 #ifdef LDAP_SLAPI
28
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 ); \
32         } while (0)
33
34 #define PBLOCK_UNLOCK_CONN( _pb )       do { \
35                 ldap_pvt_thread_mutex_unlock( &(_pb)->pb_conn->c_mutex ); \
36         } while (0)
37
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 )
40
41 static slapi_pblock_class_t 
42 pblock_get_param_class( int param ) 
43 {
44         switch ( 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:
58         case SLAPI_NENTRIES:
59         case SLAPI_CHANGENUMBER:
60         case SLAPI_DBSIZE:
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         case SLAPI_IS_INTERNAL_OPERATION:
75                 return PBLOCK_CLASS_INTEGER;
76                 break;
77
78         case SLAPI_CONN_ID:
79         case SLAPI_OPERATION_ID:
80         case SLAPI_OPINITIATED_TIME:
81         case SLAPI_ABANDON_MSGID:
82         case SLAPI_X_OPERATION_DELETE_GLUE_PARENT:
83         case SLAPI_OPERATION_MSGID:
84                 return PBLOCK_CLASS_LONG_INTEGER;
85                 break;
86
87         case SLAPI_PLUGIN_DESTROY_FN:
88         case SLAPI_PLUGIN_DB_BIND_FN:
89         case SLAPI_PLUGIN_DB_UNBIND_FN:
90         case SLAPI_PLUGIN_DB_SEARCH_FN:
91         case SLAPI_PLUGIN_DB_COMPARE_FN:
92         case SLAPI_PLUGIN_DB_MODIFY_FN:
93         case SLAPI_PLUGIN_DB_MODRDN_FN:
94         case SLAPI_PLUGIN_DB_ADD_FN:
95         case SLAPI_PLUGIN_DB_DELETE_FN:
96         case SLAPI_PLUGIN_DB_ABANDON_FN:
97         case SLAPI_PLUGIN_DB_CONFIG_FN:
98         case SLAPI_PLUGIN_CLOSE_FN:
99         case SLAPI_PLUGIN_DB_FLUSH_FN:
100         case SLAPI_PLUGIN_START_FN:
101         case SLAPI_PLUGIN_DB_SEQ_FN:
102         case SLAPI_PLUGIN_DB_ENTRY_FN:
103         case SLAPI_PLUGIN_DB_REFERRAL_FN:
104         case SLAPI_PLUGIN_DB_RESULT_FN:
105         case SLAPI_PLUGIN_DB_LDIF2DB_FN:
106         case SLAPI_PLUGIN_DB_DB2LDIF_FN:
107         case SLAPI_PLUGIN_DB_BEGIN_FN:
108         case SLAPI_PLUGIN_DB_COMMIT_FN:
109         case SLAPI_PLUGIN_DB_ABORT_FN:
110         case SLAPI_PLUGIN_DB_ARCHIVE2DB_FN:
111         case SLAPI_PLUGIN_DB_DB2ARCHIVE_FN:
112         case SLAPI_PLUGIN_DB_NEXT_SEARCH_ENTRY_FN:
113         case SLAPI_PLUGIN_DB_FREE_RESULT_SET_FN:
114         case SLAPI_PLUGIN_DB_SIZE_FN:
115         case SLAPI_PLUGIN_DB_TEST_FN:
116         case SLAPI_PLUGIN_DB_NO_ACL:
117         case SLAPI_PLUGIN_EXT_OP_FN:
118         case SLAPI_PLUGIN_EXT_OP_OIDLIST:
119         case SLAPI_PLUGIN_PRE_BIND_FN:
120         case SLAPI_PLUGIN_PRE_UNBIND_FN:
121         case SLAPI_PLUGIN_PRE_SEARCH_FN:
122         case SLAPI_PLUGIN_PRE_COMPARE_FN:
123         case SLAPI_PLUGIN_PRE_MODIFY_FN:
124         case SLAPI_PLUGIN_PRE_MODRDN_FN:
125         case SLAPI_PLUGIN_PRE_ADD_FN:
126         case SLAPI_PLUGIN_PRE_DELETE_FN:
127         case SLAPI_PLUGIN_PRE_ABANDON_FN:
128         case SLAPI_PLUGIN_PRE_ENTRY_FN:
129         case SLAPI_PLUGIN_PRE_REFERRAL_FN:
130         case SLAPI_PLUGIN_PRE_RESULT_FN:
131         case SLAPI_PLUGIN_INTERNAL_PRE_ADD_FN:
132         case SLAPI_PLUGIN_INTERNAL_PRE_MODIFY_FN:
133         case SLAPI_PLUGIN_INTERNAL_PRE_MODRDN_FN:
134         case SLAPI_PLUGIN_INTERNAL_PRE_DELETE_FN:
135         case SLAPI_PLUGIN_BE_PRE_ADD_FN:
136         case SLAPI_PLUGIN_BE_PRE_MODIFY_FN:
137         case SLAPI_PLUGIN_BE_PRE_MODRDN_FN:
138         case SLAPI_PLUGIN_BE_PRE_DELETE_FN:
139         case SLAPI_PLUGIN_POST_BIND_FN:
140         case SLAPI_PLUGIN_POST_UNBIND_FN:
141         case SLAPI_PLUGIN_POST_SEARCH_FN:
142         case SLAPI_PLUGIN_POST_COMPARE_FN:
143         case SLAPI_PLUGIN_POST_MODIFY_FN:
144         case SLAPI_PLUGIN_POST_MODRDN_FN:
145         case SLAPI_PLUGIN_POST_ADD_FN:
146         case SLAPI_PLUGIN_POST_DELETE_FN:
147         case SLAPI_PLUGIN_POST_ABANDON_FN:
148         case SLAPI_PLUGIN_POST_ENTRY_FN:
149         case SLAPI_PLUGIN_POST_REFERRAL_FN:
150         case SLAPI_PLUGIN_POST_RESULT_FN:
151         case SLAPI_PLUGIN_INTERNAL_POST_ADD_FN:
152         case SLAPI_PLUGIN_INTERNAL_POST_MODIFY_FN:
153         case SLAPI_PLUGIN_INTERNAL_POST_MODRDN_FN:
154         case SLAPI_PLUGIN_INTERNAL_POST_DELETE_FN:
155         case SLAPI_PLUGIN_BE_POST_ADD_FN:
156         case SLAPI_PLUGIN_BE_POST_MODIFY_FN:
157         case SLAPI_PLUGIN_BE_POST_MODRDN_FN:
158         case SLAPI_PLUGIN_BE_POST_DELETE_FN:
159         case SLAPI_PLUGIN_MR_FILTER_CREATE_FN:
160         case SLAPI_PLUGIN_MR_INDEXER_CREATE_FN:
161         case SLAPI_PLUGIN_MR_FILTER_MATCH_FN:
162         case SLAPI_PLUGIN_MR_FILTER_INDEX_FN:
163         case SLAPI_PLUGIN_MR_FILTER_RESET_FN:
164         case SLAPI_PLUGIN_MR_INDEX_FN:
165         case SLAPI_PLUGIN_COMPUTE_EVALUATOR_FN:
166         case SLAPI_PLUGIN_COMPUTE_SEARCH_REWRITER_FN:
167         case SLAPI_PLUGIN_ACL_ALLOW_ACCESS:
168         case SLAPI_X_PLUGIN_PRE_GROUP_FN:
169         case SLAPI_X_PLUGIN_POST_GROUP_FN:
170         case SLAPI_PLUGIN_AUDIT_FN:
171                 return PBLOCK_CLASS_FUNCTION_POINTER;
172                 break;
173
174         case SLAPI_BACKEND:
175         case SLAPI_CONNECTION:
176         case SLAPI_OPERATION:
177         case SLAPI_OPERATION_PARAMETERS:
178         case SLAPI_OPERATION_TYPE:
179         case SLAPI_OPERATION_AUTHTYPE:
180         case SLAPI_BE_MONITORDN:
181         case SLAPI_BE_TYPE:
182         case SLAPI_REQUESTOR_DN:
183         case SLAPI_CONN_DN:
184         case SLAPI_CONN_CLIENTIP:
185         case SLAPI_CONN_SERVERIP:
186         case SLAPI_CONN_AUTHTYPE:
187         case SLAPI_CONN_AUTHMETHOD:
188         case SLAPI_CONN_CERT:
189         case SLAPI_X_CONN_CLIENTPATH:
190         case SLAPI_X_CONN_SERVERPATH:
191         case SLAPI_X_CONN_SASL_CONTEXT:
192         case SLAPI_X_CONFIG_ARGV:
193         case SLAPI_X_INTOP_FLAGS:
194         case SLAPI_X_INTOP_RESULT_CALLBACK:
195         case SLAPI_X_INTOP_SEARCH_ENTRY_CALLBACK:
196         case SLAPI_X_INTOP_REFERRAL_ENTRY_CALLBACK:
197         case SLAPI_X_INTOP_CALLBACK_DATA:
198         case SLAPI_PLUGIN_MR_OID:
199         case SLAPI_PLUGIN_MR_TYPE:
200         case SLAPI_PLUGIN_MR_VALUE:
201         case SLAPI_PLUGIN_MR_VALUES:
202         case SLAPI_PLUGIN_MR_KEYS:
203         case SLAPI_PLUGIN:
204         case SLAPI_PLUGIN_PRIVATE:
205         case SLAPI_PLUGIN_ARGV:
206         case SLAPI_PLUGIN_OBJECT:
207         case SLAPI_PLUGIN_DESCRIPTION:
208         case SLAPI_PLUGIN_IDENTITY:
209         case SLAPI_PLUGIN_INTOP_SEARCH_ENTRIES:
210         case SLAPI_PLUGIN_INTOP_SEARCH_REFERRALS:
211         case SLAPI_PLUGIN_MR_FILTER_REUSABLE:
212         case SLAPI_PLUGIN_MR_QUERY_OPERATOR:
213         case SLAPI_PLUGIN_MR_USAGE:
214         case SLAPI_OP_LESS:
215         case SLAPI_OP_LESS_OR_EQUAL:
216         case SLAPI_PLUGIN_MR_USAGE_INDEX:
217         case SLAPI_PLUGIN_SYNTAX_FILTER_AVA:
218         case SLAPI_PLUGIN_SYNTAX_FILTER_SUB:
219         case SLAPI_PLUGIN_SYNTAX_VALUES2KEYS:
220         case SLAPI_PLUGIN_SYNTAX_ASSERTION2KEYS_AVA:
221         case SLAPI_PLUGIN_SYNTAX_ASSERTION2KEYS_SUB:
222         case SLAPI_PLUGIN_SYNTAX_NAMES:
223         case SLAPI_PLUGIN_SYNTAX_OID:
224         case SLAPI_PLUGIN_SYNTAX_FLAGS:
225         case SLAPI_PLUGIN_SYNTAX_COMPARE:
226         case SLAPI_CONFIG_FILENAME:
227         case SLAPI_CONFIG_ARGV:
228         case SLAPI_TARGET_ADDRESS:
229         case SLAPI_TARGET_UNIQUEID:
230         case SLAPI_TARGET_DN:
231         case SLAPI_REQCONTROLS:
232         case SLAPI_ENTRY_PRE_OP:
233         case SLAPI_ENTRY_POST_OP:
234         case SLAPI_RESCONTROLS:
235         case SLAPI_X_OLD_RESCONTROLS:
236         case SLAPI_ADD_RESCONTROL:
237         case SLAPI_CONTROLS_ARG:
238         case SLAPI_ADD_ENTRY:
239         case SLAPI_ADD_EXISTING_DN_ENTRY:
240         case SLAPI_ADD_PARENT_ENTRY:
241         case SLAPI_ADD_PARENT_UNIQUEID:
242         case SLAPI_ADD_EXISTING_UNIQUEID_ENTRY:
243         case SLAPI_BIND_CREDENTIALS:
244         case SLAPI_BIND_SASLMECHANISM:
245         case SLAPI_BIND_RET_SASLCREDS:
246         case SLAPI_COMPARE_TYPE:
247         case SLAPI_COMPARE_VALUE:
248         case SLAPI_MODIFY_MODS:
249         case SLAPI_MODRDN_NEWRDN:
250         case SLAPI_MODRDN_NEWSUPERIOR:
251         case SLAPI_MODRDN_PARENT_ENTRY:
252         case SLAPI_MODRDN_NEWPARENT_ENTRY:
253         case SLAPI_MODRDN_TARGET_ENTRY:
254         case SLAPI_MODRDN_NEWSUPERIOR_ADDRESS:
255         case SLAPI_SEARCH_FILTER:
256         case SLAPI_SEARCH_STRFILTER:
257         case SLAPI_SEARCH_ATTRS:
258         case SLAPI_SEQ_TYPE:
259         case SLAPI_SEQ_ATTRNAME:
260         case SLAPI_SEQ_VAL:
261         case SLAPI_EXT_OP_REQ_OID:
262         case SLAPI_EXT_OP_REQ_VALUE:
263         case SLAPI_EXT_OP_RET_OID:
264         case SLAPI_EXT_OP_RET_VALUE:
265         case SLAPI_MR_FILTER_ENTRY:
266         case SLAPI_MR_FILTER_TYPE:
267         case SLAPI_MR_FILTER_VALUE:
268         case SLAPI_MR_FILTER_OID:
269         case SLAPI_MR_FILTER_DNATTRS:
270         case SLAPI_LDIF2DB_FILE:
271         case SLAPI_PARENT_TXN:
272         case SLAPI_TXN:
273         case SLAPI_SEARCH_RESULT_SET:
274         case SLAPI_SEARCH_RESULT_ENTRY:
275         case SLAPI_SEARCH_REFERRALS:
276         case SLAPI_RESULT_TEXT:
277         case SLAPI_RESULT_MATCHED:
278         case SLAPI_X_GROUP_ENTRY:
279         case SLAPI_X_GROUP_ATTRIBUTE:
280         case SLAPI_X_GROUP_OPERATION_DN:
281         case SLAPI_X_GROUP_TARGET_ENTRY:
282         case SLAPI_X_ADD_STRUCTURAL_CLASS:
283         case SLAPI_PLUGIN_AUDIT_DATA:
284         case SLAPI_IBM_PBLOCK:
285         case SLAPI_PLUGIN_VERSION:
286                 return PBLOCK_CLASS_POINTER;
287                 break;
288         default:
289                 break;
290         }
291
292         return PBLOCK_CLASS_INVALID;
293 }
294
295 static void
296 pblock_lock( Slapi_PBlock *pb )
297 {
298         ldap_pvt_thread_mutex_lock( &pb->pb_mutex );
299 }
300
301 static void
302 pblock_unlock( Slapi_PBlock *pb )
303 {
304         ldap_pvt_thread_mutex_unlock( &pb->pb_mutex );
305 }
306
307 static int 
308 pblock_get_default( Slapi_PBlock *pb, int param, void **value ) 
309 {       
310         int i;
311         slapi_pblock_class_t pbClass;
312
313         pbClass = pblock_get_param_class( param );
314         if ( pbClass == PBLOCK_CLASS_INVALID ) {
315                 return PBLOCK_ERROR;
316         }
317         
318         switch ( pbClass ) {
319         case PBLOCK_CLASS_INTEGER:
320                 *((int *)value) = 0;
321                 break;
322         case PBLOCK_CLASS_LONG_INTEGER:
323                 *((long *)value) = 0L;
324                 break;
325         case PBLOCK_CLASS_POINTER:
326         case PBLOCK_CLASS_FUNCTION_POINTER:
327                 *value = NULL;
328                 break;
329         case PBLOCK_CLASS_INVALID:
330                 return PBLOCK_ERROR;
331         }
332
333         for ( i = 0; i < pb->pb_nParams; i++ ) {
334                 if ( pb->pb_params[i] == param ) {
335                         switch ( pbClass ) {
336                         case PBLOCK_CLASS_INTEGER:
337                                 *((int *)value) = pb->pb_values[i].pv_integer;
338                                 break;
339                         case PBLOCK_CLASS_LONG_INTEGER:
340                                 *((long *)value) = pb->pb_values[i].pv_long_integer;
341                                 break;
342                         case PBLOCK_CLASS_POINTER:
343                                 *value = pb->pb_values[i].pv_pointer;
344                                 break;
345                         case PBLOCK_CLASS_FUNCTION_POINTER:
346                                 *value = pb->pb_values[i].pv_function_pointer;
347                                 break;
348                         default:
349                                 break;
350                         }
351                         break;
352                 }
353         }
354
355         return PBLOCK_SUCCESS;
356 }
357
358 static char *
359 pblock_get_authtype( AuthorizationInformation *authz, int is_tls )
360 {
361         char *authType;
362
363         switch ( authz->sai_method ) {
364         case LDAP_AUTH_SASL:
365                 authType = SLAPD_AUTH_SASL;
366                 break;
367         case LDAP_AUTH_SIMPLE:
368                 authType = SLAPD_AUTH_SIMPLE;
369                 break;
370         case LDAP_AUTH_NONE:
371                 authType = SLAPD_AUTH_NONE;
372                 break;
373         default:
374                 authType = NULL;
375                 break;
376         }
377
378         if ( is_tls && authType == NULL ) {
379                 authType = SLAPD_AUTH_SSL;
380         }
381
382         return authType;
383 }
384
385 static int 
386 pblock_set_default( Slapi_PBlock *pb, int param, void *value ) 
387 {
388         slapi_pblock_class_t pbClass;
389         size_t i;
390
391         pbClass = pblock_get_param_class( param );
392         if ( pbClass == PBLOCK_CLASS_INVALID ) {
393                 return PBLOCK_ERROR;
394         }
395
396         if ( pb->pb_nParams == PBLOCK_MAX_PARAMS ) {
397                 return PBLOCK_ERROR;
398         }
399
400         for ( i = 0; i < pb->pb_nParams; i++ ) {
401                 if ( pb->pb_params[i] == param )
402                         break;
403         }
404         if ( i >= pb->pb_nParams ) {
405                 pb->pb_params[i] = param;
406                 pb->pb_nParams++;
407         }
408
409         switch ( pbClass ) {
410         case PBLOCK_CLASS_INTEGER:
411                 pb->pb_values[i].pv_integer = (*((int *)value));
412                 break;
413         case PBLOCK_CLASS_LONG_INTEGER:
414                 pb->pb_values[i].pv_long_integer = (*((long *)value));
415                 break;
416         case PBLOCK_CLASS_POINTER:
417                 pb->pb_values[i].pv_pointer = value;
418                 break;
419         case PBLOCK_CLASS_FUNCTION_POINTER:
420                 pb->pb_values[i].pv_function_pointer = value;
421                 break;
422         default:
423                 break;
424         }
425
426         return PBLOCK_SUCCESS;
427 }
428
429 static int
430 pblock_be_call( Slapi_PBlock *pb, int (*bep)(Operation *) )
431 {
432         BackendDB *be_orig;
433         Operation *op;
434         int rc;
435
436         PBLOCK_ASSERT_OP( pb, 0 );
437         op = pb->pb_op;
438
439         be_orig = op->o_bd;
440         op->o_bd = select_backend( &op->o_req_ndn, 0, 0 );
441         rc = (*bep)( op );
442         op->o_bd = be_orig;
443
444         return rc;
445 }
446
447 static int 
448 pblock_get( Slapi_PBlock *pb, int param, void **value ) 
449 {
450         int rc = PBLOCK_SUCCESS;
451
452         pblock_lock( pb );
453
454         switch ( param ) {
455         case SLAPI_OPERATION:
456                 *value = pb->pb_op;
457                 break;
458         case SLAPI_OPINITIATED_TIME:
459                 PBLOCK_ASSERT_OP( pb, 0 );
460                 *((long *)value) = pb->pb_op->o_time;
461                 break;
462         case SLAPI_OPERATION_ID:
463                 PBLOCK_ASSERT_OP( pb, 0 );
464                 *((long *)value) = pb->pb_op->o_opid;
465                 break;
466         case SLAPI_OPERATION_TYPE:
467                 PBLOCK_ASSERT_OP( pb, 0 );
468                 *((ber_tag_t *)value) = pb->pb_op->o_tag;
469                 break;
470         case SLAPI_OPERATION_MSGID:
471                 PBLOCK_ASSERT_OP( pb, 0 );
472                 *((long *)value) = pb->pb_op->o_msgid;
473                 break;
474         case SLAPI_X_OPERATION_DELETE_GLUE_PARENT:
475                 PBLOCK_ASSERT_OP( pb, 0 );
476                 *((ber_tag_t *)value) = pb->pb_op->o_delete_glue_parent;
477                 break;
478         case SLAPI_X_OPERATION_NO_SCHEMA_CHECK:
479                 PBLOCK_ASSERT_OP( pb, 0 );
480                 *((int *)value) = get_no_schema_check( pb->pb_op );
481                 break;
482         case SLAPI_X_ADD_STRUCTURAL_CLASS:
483                 PBLOCK_ASSERT_OP( pb, 0 );
484
485                 if ( pb->pb_op->o_tag == LDAP_REQ_ADD ) {
486                         struct berval tmpval = BER_BVNULL;
487
488                         rc = mods_structural_class( pb->pb_op->ora_modlist,
489                                 &tmpval, &pb->pb_rs->sr_text,
490                                 pb->pb_textbuf, sizeof( pb->pb_textbuf ));
491                         *((char **)value) = tmpval.bv_val;
492                 } else {
493                         rc = PBLOCK_ERROR;
494                 }
495                 break;
496         case SLAPI_REQCONTROLS:
497                 PBLOCK_ASSERT_OP( pb, 0 );
498                 *((LDAPControl ***)value) = pb->pb_op->o_ctrls;
499                 break;
500         case SLAPI_REQUESTOR_DN:
501                 PBLOCK_ASSERT_OP( pb, 0 );
502                 *((char **)value) = pb->pb_op->o_dn.bv_val;
503                 break;
504         case SLAPI_MANAGEDSAIT:
505                 PBLOCK_ASSERT_OP( pb, 0 );
506                 *((int *)value) = get_manageDSAit( pb->pb_op );
507                 break;
508         case SLAPI_X_MANAGEDIT:
509                 PBLOCK_ASSERT_OP( pb, 0 );
510                 *((int *)value) = get_manageDIT( pb->pb_op );
511                 break;
512         case SLAPI_BACKEND:
513                 PBLOCK_ASSERT_OP( pb, 0 );
514                 *((BackendDB **)value) = select_backend( &pb->pb_op->o_req_ndn, 0, 0 );
515                 break;
516         case SLAPI_BE_TYPE:
517                 PBLOCK_ASSERT_OP( pb, 0 );
518                 if ( pb->pb_op->o_bd != NULL )
519                         *((char **)value) = pb->pb_op->o_bd->bd_info->bi_type;
520                 else
521                         *value = NULL;
522                 break;
523         case SLAPI_CONNECTION:
524                 *value = pb->pb_conn;
525                 break;
526         case SLAPI_X_CONN_SSF:
527                 PBLOCK_ASSERT_OP( pb, 0 );
528                 *((slap_ssf_t *)value) = pb->pb_conn->c_ssf;
529                 break;
530         case SLAPI_X_CONN_SASL_CONTEXT:
531                 PBLOCK_ASSERT_CONN( pb );
532                 if ( pb->pb_conn->c_sasl_authctx != NULL )
533                         *value = pb->pb_conn->c_sasl_authctx;
534                 else
535                         *value = pb->pb_conn->c_sasl_sockctx;
536                 break;
537         case SLAPI_TARGET_DN:
538                 PBLOCK_ASSERT_OP( pb, 0 );
539                 *((char **)value) = pb->pb_op->o_req_dn.bv_val;
540                 break;
541         case SLAPI_REQUESTOR_ISROOT:
542                 *((int *)value) = pblock_be_call( pb, be_isroot );
543                 break;
544         case SLAPI_IS_REPLICATED_OPERATION:
545                 *((int *)value) = pblock_be_call( pb, be_slurp_update );
546                 break;
547         case SLAPI_CONN_AUTHTYPE:
548         case SLAPI_CONN_AUTHMETHOD: /* XXX should return SASL mech */
549                 PBLOCK_ASSERT_CONN( pb );
550                 *((char **)value) = pblock_get_authtype( &pb->pb_conn->c_authz,
551 #ifdef HAVE_TLS
552                                                          pb->pb_conn->c_is_tls
553 #else
554                                                          0
555 #endif
556                                                          );
557                 break;
558         case SLAPI_IS_INTERNAL_OPERATION:
559                 *((int *)value) = pb->pb_intop;
560                 break;
561         case SLAPI_X_CONN_IS_UDP:
562                 PBLOCK_ASSERT_CONN( pb );
563 #ifdef LDAP_CONNECTIONLESS
564                 *((int *)value) = pb->pb_conn->c_is_udp;
565 #else
566                 *((int *)value) = 0;
567 #endif
568                 break;
569         case SLAPI_CONN_ID:
570                 PBLOCK_ASSERT_CONN( pb );
571                 *((long *)value) = pb->pb_conn->c_connid;
572                 break;
573         case SLAPI_CONN_DN:
574                 PBLOCK_ASSERT_CONN( pb );
575                 *((char **)value) = pb->pb_conn->c_dn.bv_val;
576                 break;
577         case SLAPI_CONN_CLIENTIP:
578                 PBLOCK_ASSERT_CONN( pb );
579                 if ( strncmp( pb->pb_conn->c_peer_name.bv_val, "IP=", 3 ) == 0 )
580                         *((char **)value) = &pb->pb_conn->c_peer_name.bv_val[3];
581                 else
582                         *value = NULL;
583                 break;
584         case SLAPI_X_CONN_CLIENTPATH:
585                 PBLOCK_ASSERT_CONN( pb );
586                 if ( strncmp( pb->pb_conn->c_peer_name.bv_val, "PATH=", 3 ) == 0 )
587                         *((char **)value) = &pb->pb_conn->c_peer_name.bv_val[5];
588                 else
589                         *value = NULL;
590                 break;
591         case SLAPI_CONN_SERVERIP:
592                 PBLOCK_ASSERT_CONN( pb );
593                 if ( strncmp( pb->pb_conn->c_sock_name.bv_val, "IP=", 3 ) == 0 )
594                         *((char **)value) = &pb->pb_conn->c_sock_name.bv_val[3];
595                 else
596                         *value = NULL;
597                 break;
598         case SLAPI_X_CONN_SERVERPATH:
599                 PBLOCK_ASSERT_CONN( pb );
600                 if ( strncmp( pb->pb_conn->c_sock_name.bv_val, "PATH=", 3 ) == 0 )
601                         *((char **)value) = &pb->pb_conn->c_sock_name.bv_val[5];
602                 else
603                         *value = NULL;
604                 break;
605         case SLAPI_RESULT_CODE:
606         case SLAPI_PLUGIN_INTOP_RESULT:
607                 PBLOCK_ASSERT_OP( pb, 0 );
608                 *((int *)value) = pb->pb_rs->sr_err;
609                 break;
610         case SLAPI_RESULT_TEXT:
611                 PBLOCK_ASSERT_OP( pb, 0 );
612                 *((const char **)value) = pb->pb_rs->sr_text;
613                 break;
614         case SLAPI_RESULT_MATCHED:
615                 PBLOCK_ASSERT_OP( pb, 0 );
616                 *((const char **)value) = pb->pb_rs->sr_matched;
617                 break;
618         case SLAPI_ADD_ENTRY:
619                 PBLOCK_ASSERT_OP( pb, 0 );
620                 if ( pb->pb_op->o_tag == LDAP_REQ_ADD )
621                         *((Slapi_Entry **)value) = pb->pb_op->ora_e;
622                 else
623                         *value = NULL;
624                 break;
625         case SLAPI_MODIFY_MODS: {
626                 LDAPMod **mods = NULL;
627                 Modifications *ml = NULL;
628
629                 pblock_get_default( pb, param, (void **)&mods );
630                 if ( mods == NULL && pb->pb_intop == 0 ) {
631                         switch ( pb->pb_op->o_tag ) {
632                         case LDAP_REQ_MODIFY:
633                                 ml = pb->pb_op->orm_modlist;
634                                 break;
635                         case LDAP_REQ_MODRDN:
636                                 ml = pb->pb_op->orr_modlist;
637                                 break;
638                         default:
639                                 rc = PBLOCK_ERROR;
640                                 break;
641                         }
642                         if ( rc != PBLOCK_ERROR ) {
643                                 mods = slapi_int_modifications2ldapmods( ml );
644                                 pblock_set_default( pb, param, (void *)mods );
645                         }
646                 }
647                 *((LDAPMod ***)value) = mods;
648                 break;
649         }
650         case SLAPI_MODRDN_NEWRDN:
651                 PBLOCK_ASSERT_OP( pb, 0 );
652                 if ( pb->pb_op->o_tag == LDAP_REQ_MODRDN )
653                         *((char **)value) = pb->pb_op->orr_newrdn.bv_val;
654                 else
655                         *value = NULL;
656                 break;
657         case SLAPI_MODRDN_NEWSUPERIOR:
658                 PBLOCK_ASSERT_OP( pb, 0 );
659                 if ( pb->pb_op->o_tag == LDAP_REQ_MODRDN && pb->pb_op->orr_newSup != NULL )
660                         *((char **)value) = pb->pb_op->orr_newSup->bv_val;
661                 else
662                         *value = NULL;
663                 break;
664         case SLAPI_MODRDN_DELOLDRDN:
665                 PBLOCK_ASSERT_OP( pb, 0 );
666                 if ( pb->pb_op->o_tag == LDAP_REQ_MODRDN )
667                         *((int *)value) = pb->pb_op->orr_deleteoldrdn;
668                 else
669                         *((int *)value) = 0;
670                 break;
671         case SLAPI_SEARCH_SCOPE:
672                 PBLOCK_ASSERT_OP( pb, 0 );
673                 if ( pb->pb_op->o_tag == LDAP_REQ_SEARCH )
674                         *((int *)value) = pb->pb_op->ors_scope;
675                 else
676                         *((int *)value) = 0;
677                 break;
678         case SLAPI_SEARCH_DEREF:
679                 PBLOCK_ASSERT_OP( pb, 0 );
680                 if ( pb->pb_op->o_tag == LDAP_REQ_SEARCH )
681                         *((int *)value) = pb->pb_op->ors_deref;
682                 else
683                         *((int *)value) = 0;
684                 break;
685         case SLAPI_SEARCH_SIZELIMIT:
686                 PBLOCK_ASSERT_OP( pb, 0 );
687                 if ( pb->pb_op->o_tag == LDAP_REQ_SEARCH )
688                         *((int *)value) = pb->pb_op->ors_slimit;
689                 else
690                         *((int *)value) = 0;
691                 break;
692         case SLAPI_SEARCH_TIMELIMIT:
693                 PBLOCK_ASSERT_OP( pb, 0 );
694                 if ( pb->pb_op->o_tag == LDAP_REQ_SEARCH )
695                         *((int *)value) = pb->pb_op->ors_tlimit;
696                 else
697                         *((int *)value) = 0;
698                 break;
699         case SLAPI_SEARCH_FILTER:
700                 PBLOCK_ASSERT_OP( pb, 0 );
701                 if ( pb->pb_op->o_tag == LDAP_REQ_SEARCH )
702                         *((Slapi_Filter **)value) = pb->pb_op->ors_filter;
703                 else
704                         *((Slapi_Filter **)value) = NULL;
705                 break;
706         case SLAPI_SEARCH_STRFILTER:
707                 PBLOCK_ASSERT_OP( pb, 0 );
708                 if ( pb->pb_op->o_tag == LDAP_REQ_SEARCH )
709                         *((char **)value) = pb->pb_op->ors_filterstr.bv_val;
710                 else
711                         *((char **)value) = NULL;
712                 break;
713         case SLAPI_SEARCH_ATTRS: {
714                 char **attrs = NULL;
715
716                 PBLOCK_ASSERT_OP( pb, 0 );
717                 if ( pb->pb_op->o_tag != LDAP_REQ_SEARCH ) {
718                         rc = PBLOCK_ERROR;
719                         break;
720                 }
721                 pblock_get_default( pb, param, (void **)&attrs );
722                 if ( attrs == NULL && pb->pb_intop == 0 ) {
723                         attrs = anlist2charray_x( pb->pb_op->ors_attrs, 0, pb->pb_op->o_tmpmemctx );
724                         pblock_set_default( pb, param, (void *)attrs );
725                 }
726                 *((char ***)value) = attrs;
727                 break;
728         }
729         case SLAPI_SEARCH_ATTRSONLY:
730                 PBLOCK_ASSERT_OP( pb, 0 );
731                 if ( pb->pb_op->o_tag == LDAP_REQ_SEARCH )
732                         *((int *)value) = pb->pb_op->ors_attrsonly;
733                 else
734                         *((int *)value) = 0;
735                 break;
736         case SLAPI_SEARCH_RESULT_ENTRY:
737                 PBLOCK_ASSERT_OP( pb, 0 );
738                 *((Slapi_Entry **)value) = pb->pb_rs->sr_entry;
739                 break;
740         case SLAPI_BIND_RET_SASLCREDS:
741                 PBLOCK_ASSERT_OP( pb, 0 );
742                 *((struct berval **)value) = pb->pb_rs->sr_sasldata;
743                 break;
744         case SLAPI_EXT_OP_REQ_OID:
745                 *((const char **)value) = pb->pb_op->ore_reqoid.bv_val;
746                 break;
747         case SLAPI_EXT_OP_REQ_VALUE:
748                 *((struct berval **)value) = pb->pb_op->ore_reqdata;
749                 break;
750         case SLAPI_EXT_OP_RET_OID:
751                 PBLOCK_ASSERT_OP( pb, 0 );
752                 *((const char **)value) = pb->pb_rs->sr_rspoid;
753                 break;
754         case SLAPI_EXT_OP_RET_VALUE:
755                 PBLOCK_ASSERT_OP( pb, 0 );
756                 *((struct berval **)value) = pb->pb_rs->sr_rspdata;
757                 break;
758         case SLAPI_BIND_METHOD:
759                 if ( pb->pb_op->o_tag == LDAP_REQ_BIND )
760                         *((int *)value) = pb->pb_op->orb_method;
761                 else
762                         *((int *)value) = 0;
763                 break;
764         case SLAPI_BIND_CREDENTIALS:
765                 if ( pb->pb_op->o_tag == LDAP_REQ_BIND )
766                         *((struct berval **)value) = &pb->pb_op->orb_cred;
767                 else
768                         *value = NULL;
769                 break;
770         case SLAPI_COMPARE_TYPE:
771                 if ( pb->pb_op->o_tag == LDAP_REQ_COMPARE )
772                         *((char **)value) = pb->pb_op->orc_ava->aa_desc->ad_cname.bv_val;
773                 else
774                         *value = NULL;
775                 break;
776         case SLAPI_COMPARE_VALUE:
777                 if ( pb->pb_op->o_tag == LDAP_REQ_COMPARE )
778                         *((struct berval **)value) = &pb->pb_op->orc_ava->aa_value;
779                 else
780                         *value = NULL;
781                 break;
782         case SLAPI_ABANDON_MSGID:
783                 if ( pb->pb_op->o_tag == LDAP_REQ_ABANDON )
784                         *((int *)value) = pb->pb_op->orn_msgid;
785                 else
786                         *((int *)value) = 0;
787                 break;
788         default:
789                 rc = pblock_get_default( pb, param, value );
790                 break;
791         }
792
793         pblock_unlock( pb );
794
795         return rc;
796 }
797
798 static int
799 pblock_add_control( Slapi_PBlock *pb, LDAPControl *control )
800 {
801         LDAPControl **controls = NULL;
802         size_t i;
803
804         pblock_get_default( pb, SLAPI_RESCONTROLS, (void **)&controls );
805
806         if ( controls != NULL ) {
807                 for ( i = 0; controls[i] != NULL; i++ )
808                         ;
809         } else {
810                 i = 0;
811         }
812
813         controls = (LDAPControl **)slapi_ch_realloc( (char *)controls,
814                 ( i + 2 ) * sizeof(LDAPControl *));
815         controls[i++] = slapi_dup_control( control );
816         controls[i] = NULL;
817
818         return pblock_set_default( pb, SLAPI_RESCONTROLS, (void *)controls );
819 }
820
821 static int
822 pblock_set_dn( void *value, struct berval *dn, struct berval *ndn, void *memctx )
823 {
824         struct berval bv;
825
826         if ( !BER_BVISNULL( dn )) {
827                 slap_sl_free( dn->bv_val, memctx );
828                 BER_BVZERO( dn );
829         }
830         if ( !BER_BVISNULL( ndn )) {
831                 slap_sl_free( ndn->bv_val, memctx );
832                 BER_BVZERO( ndn );
833         }
834
835         bv.bv_val = (char *)value;
836         bv.bv_len = ( value != NULL ) ? strlen( bv.bv_val ) : 0;
837
838         return dnPrettyNormal( NULL, &bv, dn, ndn, memctx );
839 }
840
841 static int 
842 pblock_set( Slapi_PBlock *pb, int param, void *value ) 
843 {
844         int rc = PBLOCK_SUCCESS;
845
846         pblock_lock( pb );      
847
848         switch ( param ) {
849         case SLAPI_OPERATION:
850                 pb->pb_op = (Operation *)value;
851                 break;
852         case SLAPI_OPINITIATED_TIME:
853                 PBLOCK_ASSERT_OP( pb, 0 );
854                 pb->pb_op->o_time = *((long *)value);
855                 break;
856         case SLAPI_OPERATION_ID:
857                 PBLOCK_ASSERT_OP( pb, 0 );
858                 pb->pb_op->o_opid = *((long *)value);
859                 break;
860         case SLAPI_OPERATION_TYPE:
861                 PBLOCK_ASSERT_OP( pb, 0 );
862                 pb->pb_op->o_tag = *((ber_tag_t *)value);
863                 break;
864         case SLAPI_OPERATION_MSGID:
865                 PBLOCK_ASSERT_OP( pb, 0 );
866                 pb->pb_op->o_msgid = *((long *)value);
867                 break;
868         case SLAPI_X_OPERATION_DELETE_GLUE_PARENT:
869                 PBLOCK_ASSERT_OP( pb, 0 );
870                 pb->pb_op->o_delete_glue_parent = *((int *)value);
871                 break;
872         case SLAPI_X_OPERATION_NO_SCHEMA_CHECK:
873                 PBLOCK_ASSERT_OP( pb, 0 );
874                 pb->pb_op->o_no_schema_check = *((int *)value);
875                 break;
876         case SLAPI_REQCONTROLS:
877                 PBLOCK_ASSERT_OP( pb, 0 );
878                 pb->pb_op->o_ctrls = (LDAPControl **)value;
879                 break;
880         case SLAPI_RESCONTROLS: {
881                 LDAPControl **ctrls = NULL;
882
883                 pblock_get_default( pb, param, (void **)&ctrls );
884                 if ( ctrls != NULL ) {
885                         /* free old ones first */
886                         ldap_controls_free( ctrls );
887                 }
888                 rc = pblock_set_default( pb, param, value );
889                 break;
890         }
891         case SLAPI_ADD_RESCONTROL:
892                 PBLOCK_ASSERT_OP( pb, 0 );
893                 rc = pblock_add_control( pb, (LDAPControl *)value );
894                 break;
895         case SLAPI_REQUESTOR_DN:
896                 PBLOCK_ASSERT_OP( pb, 0 );
897                 rc = pblock_set_dn( value, &pb->pb_op->o_dn, &pb->pb_op->o_ndn, pb->pb_op->o_tmpmemctx );
898                 break;
899         case SLAPI_MANAGEDSAIT:
900                 PBLOCK_ASSERT_OP( pb, 0 );
901                 pb->pb_op->o_managedsait = *((int *)value);
902                 break;
903         case SLAPI_X_MANAGEDIT:
904                 PBLOCK_ASSERT_OP( pb, 0 );
905                 pb->pb_op->o_managedit = *((int *)value);
906                 break;
907         case SLAPI_BACKEND:
908                 PBLOCK_ASSERT_OP( pb, 0 );
909                 pb->pb_op->o_bd = (BackendDB *)value;
910                 break;
911         case SLAPI_CONNECTION:
912                 pb->pb_conn = (Connection *)value;
913                 break;
914         case SLAPI_X_CONN_SSF:
915                 PBLOCK_ASSERT_CONN( pb );
916                 PBLOCK_LOCK_CONN( pb );
917                 pb->pb_conn->c_ssf = (slap_ssf_t)(long)value;
918                 PBLOCK_UNLOCK_CONN( pb );
919                 break;
920         case SLAPI_X_CONN_SASL_CONTEXT:
921                 PBLOCK_ASSERT_CONN( pb );
922                 PBLOCK_LOCK_CONN( pb );
923                 pb->pb_conn->c_sasl_authctx = value;
924                 PBLOCK_UNLOCK_CONN( pb );
925                 break;
926         case SLAPI_TARGET_DN:
927                 PBLOCK_ASSERT_OP( pb, 0 );
928                 rc = pblock_set_dn( value, &pb->pb_op->o_req_dn, &pb->pb_op->o_req_ndn, pb->pb_op->o_tmpmemctx );
929                 break;
930         case SLAPI_CONN_ID:
931                 PBLOCK_ASSERT_CONN( pb );
932                 PBLOCK_LOCK_CONN( pb );
933                 pb->pb_conn->c_connid = *((long *)value);
934                 PBLOCK_UNLOCK_CONN( pb );
935                 break;
936         case SLAPI_CONN_DN:
937                 PBLOCK_ASSERT_CONN( pb );
938                 PBLOCK_LOCK_CONN( pb );
939                 rc = pblock_set_dn( value, &pb->pb_conn->c_dn, &pb->pb_conn->c_ndn, NULL );
940                 PBLOCK_UNLOCK_CONN( pb );
941                 break;
942         case SLAPI_RESULT_CODE:
943         case SLAPI_PLUGIN_INTOP_RESULT:
944                 PBLOCK_ASSERT_OP( pb, 0 );
945                 pb->pb_rs->sr_err = *((int *)value);
946                 break;
947         case SLAPI_RESULT_TEXT:
948                 PBLOCK_ASSERT_OP( pb, 0 );
949                 snprintf( pb->pb_textbuf, sizeof( pb->pb_textbuf ), "%s", (char *)value );
950                 pb->pb_rs->sr_text = pb->pb_textbuf;
951                 break;
952         case SLAPI_RESULT_MATCHED:
953                 PBLOCK_ASSERT_OP( pb, 0 );
954                 pb->pb_rs->sr_matched = (char *)value; /* XXX should dup? */
955                 break;
956         case SLAPI_ADD_ENTRY:
957                 PBLOCK_ASSERT_OP( pb, 0 );
958                 if ( pb->pb_op->o_tag == LDAP_REQ_ADD )
959                         pb->pb_op->ora_e = (Slapi_Entry *)value;
960                 else
961                         rc = PBLOCK_ERROR;
962                 break;
963         case SLAPI_MODIFY_MODS: {
964                 Modifications **mlp;
965                 Modifications *newmods;
966
967                 PBLOCK_ASSERT_OP( pb, 0 );
968                 rc = pblock_set_default( pb, param, value );
969                 if ( rc != PBLOCK_SUCCESS ) {
970                         break;
971                 }
972
973                 if ( pb->pb_op->o_tag == LDAP_REQ_MODIFY ) {
974                         mlp = &pb->pb_op->orm_modlist;
975                 } else if ( pb->pb_op->o_tag == LDAP_REQ_ADD ) {
976                         mlp = &pb->pb_op->ora_modlist;
977                 } else if ( pb->pb_op->o_tag == LDAP_REQ_MODRDN ) {
978                         mlp = &pb->pb_op->orr_modlist;
979                 } else {
980                         break;
981                 }
982
983                 newmods = slapi_int_ldapmods2modifications( (LDAPMod **)value );
984                 if ( newmods != NULL ) {
985                         slap_mods_free( *mlp, 1 );
986                         *mlp = newmods;
987                 }
988                 break;
989         }
990         case SLAPI_MODRDN_NEWRDN:
991                 PBLOCK_ASSERT_OP( pb, 0 );
992                 PBLOCK_VALIDATE_IS_INTOP( pb );
993                 if ( pb->pb_op->o_tag == LDAP_REQ_MODRDN ) {
994                         rc = pblock_set_dn( value, &pb->pb_op->orr_newrdn, &pb->pb_op->orr_nnewrdn, pb->pb_op->o_tmpmemctx );
995                         if ( rc == LDAP_SUCCESS )
996                                 rc = rdn_validate( &pb->pb_op->orr_nnewrdn );
997                 } else {
998                         rc = PBLOCK_ERROR;
999                 }
1000                 break;
1001         case SLAPI_MODRDN_NEWSUPERIOR:
1002                 PBLOCK_ASSERT_OP( pb, 0 );
1003                 PBLOCK_VALIDATE_IS_INTOP( pb );
1004                 if ( pb->pb_op->o_tag == LDAP_REQ_MODRDN ) {
1005                         if ( value == NULL ) {
1006                                 if ( pb->pb_op->orr_newSup != NULL ) {
1007                                         pb->pb_op->o_tmpfree( pb->pb_op->orr_newSup, pb->pb_op->o_tmpmemctx );
1008                                         BER_BVZERO( pb->pb_op->orr_newSup );
1009                                         pb->pb_op->orr_newSup = NULL;
1010                                 }
1011                                 if ( pb->pb_op->orr_newSup != NULL ) {
1012                                         pb->pb_op->o_tmpfree( pb->pb_op->orr_nnewSup, pb->pb_op->o_tmpmemctx );
1013                                         BER_BVZERO( pb->pb_op->orr_nnewSup );
1014                                         pb->pb_op->orr_nnewSup = NULL;
1015                                 }
1016                         } else {
1017                                 if ( pb->pb_op->orr_newSup == NULL ) {
1018                                         pb->pb_op->orr_newSup = (struct berval *)pb->pb_op->o_tmpalloc(
1019                                                 sizeof(struct berval), pb->pb_op->o_tmpmemctx );
1020                                         BER_BVZERO( pb->pb_op->orr_newSup );
1021                                 }
1022                                 if ( pb->pb_op->orr_nnewSup == NULL ) {
1023                                         pb->pb_op->orr_nnewSup = (struct berval *)pb->pb_op->o_tmpalloc(
1024                                                 sizeof(struct berval), pb->pb_op->o_tmpmemctx );
1025                                         BER_BVZERO( pb->pb_op->orr_nnewSup );
1026                                 }
1027                                 rc = pblock_set_dn( value, pb->pb_op->orr_newSup, pb->pb_op->orr_nnewSup, pb->pb_op->o_tmpmemctx );
1028                         }
1029                 } else {
1030                         rc = PBLOCK_ERROR;
1031                 }
1032                 break;
1033         case SLAPI_MODRDN_DELOLDRDN:
1034                 PBLOCK_ASSERT_OP( pb, 0 );
1035                 PBLOCK_VALIDATE_IS_INTOP( pb );
1036                 if ( pb->pb_op->o_tag == LDAP_REQ_MODRDN )
1037                         pb->pb_op->orr_deleteoldrdn = *((int *)value);
1038                 else
1039                         rc = PBLOCK_ERROR;
1040                 break;
1041         case SLAPI_SEARCH_SCOPE: {
1042                 int scope = *((int *)value);
1043
1044                 PBLOCK_ASSERT_OP( pb, 0 );
1045                 if ( pb->pb_op->o_tag == LDAP_REQ_SEARCH ) {
1046                         switch ( *((int *)value) ) {
1047                         case LDAP_SCOPE_BASE:
1048                         case LDAP_SCOPE_ONELEVEL:
1049                         case LDAP_SCOPE_SUBTREE:
1050                         case LDAP_SCOPE_SUBORDINATE:
1051                                 pb->pb_op->ors_scope = scope;
1052                                 break;
1053                         default:
1054                                 rc = PBLOCK_ERROR;
1055                                 break;
1056                         }
1057                 } else {
1058                         rc = PBLOCK_ERROR;
1059                 }
1060                 break;
1061         }
1062         case SLAPI_SEARCH_DEREF:
1063                 PBLOCK_ASSERT_OP( pb, 0 );
1064                 if ( pb->pb_op->o_tag == LDAP_REQ_SEARCH )
1065                         pb->pb_op->ors_deref = *((int *)value);
1066                 else
1067                         rc = PBLOCK_ERROR;
1068                 break;
1069         case SLAPI_SEARCH_SIZELIMIT:
1070                 PBLOCK_ASSERT_OP( pb, 0 );
1071                 if ( pb->pb_op->o_tag == LDAP_REQ_SEARCH )
1072                         pb->pb_op->ors_slimit = *((int *)value);
1073                 else
1074                         rc = PBLOCK_ERROR;
1075                 break;
1076         case SLAPI_SEARCH_TIMELIMIT:
1077                 PBLOCK_ASSERT_OP( pb, 0 );
1078                 if ( pb->pb_op->o_tag == LDAP_REQ_SEARCH )
1079                         pb->pb_op->ors_tlimit = *((int *)value);
1080                 else
1081                         rc = PBLOCK_ERROR;
1082                 break;
1083         case SLAPI_SEARCH_FILTER:
1084                 PBLOCK_ASSERT_OP( pb, 0 );
1085                 if ( pb->pb_op->o_tag == LDAP_REQ_SEARCH )
1086                         pb->pb_op->ors_filter = (Slapi_Filter *)value;
1087                 else
1088                         rc = PBLOCK_ERROR;
1089                 break;
1090         case SLAPI_SEARCH_STRFILTER:
1091                 PBLOCK_ASSERT_OP( pb, 0 );
1092                 if ( pb->pb_op->o_tag == LDAP_REQ_SEARCH ) {
1093                         pb->pb_op->ors_filterstr.bv_val = (char *)value;
1094                         pb->pb_op->ors_filterstr.bv_len = strlen((char *)value);
1095                 } else {
1096                         rc = PBLOCK_ERROR;
1097                 }
1098                 break;
1099         case SLAPI_SEARCH_ATTRS: {
1100                 AttributeName *an = NULL;
1101                 size_t i = 0, j = 0;
1102                 char **attrs = (char **)value;
1103
1104                 PBLOCK_ASSERT_OP( pb, 0 );
1105                 PBLOCK_VALIDATE_IS_INTOP( pb );
1106
1107                 if ( pb->pb_op->o_tag != LDAP_REQ_SEARCH ) {
1108                         rc = PBLOCK_ERROR;
1109                         break;
1110                 }
1111                 /* also set mapped attrs */
1112                 rc = pblock_set_default( pb, param, value );
1113                 if ( rc != PBLOCK_SUCCESS ) {
1114                         break;
1115                 }
1116                 if ( pb->pb_op->ors_attrs != NULL ) {
1117                         pb->pb_op->o_tmpfree( pb->pb_op->ors_attrs, pb->pb_op->o_tmpmemctx );
1118                         pb->pb_op->ors_attrs = NULL;
1119                 }
1120                 if ( attrs != NULL ) {
1121                         for ( i = 0; attrs[i] != NULL; i++ )
1122                                 ;
1123                 }
1124                 if ( i ) {
1125                         an = (AttributeName *)pb->pb_op->o_tmpcalloc( i + 1,
1126                                 sizeof(AttributeName), pb->pb_op->o_tmpmemctx );
1127                         for ( i = 0; attrs[i] != NULL; i++ ) {
1128                                 an[j].an_desc = NULL;
1129                                 an[j].an_oc = NULL;
1130                                 an[j].an_oc_exclude = 0;
1131                                 an[j].an_name.bv_val = attrs[i];
1132                                 an[j].an_name.bv_len = strlen( attrs[i] );
1133                                 if ( slap_bv2ad( &an[j].an_name, &an[j].an_desc, &pb->pb_rs->sr_text ) == LDAP_SUCCESS ) {
1134                                         j++;
1135                                 }
1136                         }
1137                         an[j].an_name.bv_val = NULL;
1138                         an[j].an_name.bv_len = 0;
1139                 }       
1140                 pb->pb_op->ors_attrs = an;
1141                 break;
1142         }
1143         case SLAPI_SEARCH_ATTRSONLY:
1144                 PBLOCK_ASSERT_OP( pb, 0 );
1145                 PBLOCK_VALIDATE_IS_INTOP( pb );
1146
1147                 if ( pb->pb_op->o_tag == LDAP_REQ_SEARCH )
1148                         pb->pb_op->ors_attrsonly = *((int *)value);
1149                 else
1150                         rc = PBLOCK_ERROR;
1151                 break;
1152         case SLAPI_SEARCH_RESULT_ENTRY:
1153                 PBLOCK_ASSERT_OP( pb, 0 );
1154                 pb->pb_rs->sr_entry = (Slapi_Entry *)value;
1155                 break;
1156         case SLAPI_BIND_RET_SASLCREDS:
1157                 PBLOCK_ASSERT_OP( pb, 0 );
1158                 pb->pb_rs->sr_sasldata = (struct berval *)value;
1159                 break;
1160         case SLAPI_EXT_OP_REQ_OID:
1161                 PBLOCK_ASSERT_OP( pb, 0 );
1162                 PBLOCK_VALIDATE_IS_INTOP( pb );
1163
1164                 if ( pb->pb_op->o_tag == LDAP_REQ_EXTENDED ) {
1165                         pb->pb_op->ore_reqoid.bv_val = (char *)value;
1166                         pb->pb_op->ore_reqoid.bv_len = strlen((char *)value);
1167                 } else {
1168                         rc = PBLOCK_ERROR;
1169                 }
1170                 break;
1171         case SLAPI_EXT_OP_REQ_VALUE:
1172                 PBLOCK_ASSERT_OP( pb, 0 );
1173                 PBLOCK_VALIDATE_IS_INTOP( pb );
1174
1175                 if ( pb->pb_op->o_tag == LDAP_REQ_EXTENDED )
1176                         pb->pb_op->ore_reqdata = (struct berval *)value;
1177                 else
1178                         rc = PBLOCK_ERROR;
1179                 break;
1180         case SLAPI_EXT_OP_RET_OID:
1181                 PBLOCK_ASSERT_OP( pb, 0 );
1182                 pb->pb_rs->sr_rspoid = (char *)value;
1183                 break;
1184         case SLAPI_EXT_OP_RET_VALUE:
1185                 PBLOCK_ASSERT_OP( pb, 0 );
1186                 pb->pb_rs->sr_rspdata = (struct berval *)value;
1187                 break;
1188         case SLAPI_BIND_METHOD:
1189                 PBLOCK_ASSERT_OP( pb, 0 );
1190                 PBLOCK_VALIDATE_IS_INTOP( pb );
1191
1192                 if ( pb->pb_op->o_tag == LDAP_REQ_BIND )
1193                         pb->pb_op->orb_method = *((int *)value);
1194                 else
1195                         rc = PBLOCK_ERROR;
1196                 break;
1197         case SLAPI_BIND_CREDENTIALS:
1198                 PBLOCK_ASSERT_OP( pb, 0 );
1199                 PBLOCK_VALIDATE_IS_INTOP( pb );
1200
1201                 if ( pb->pb_op->o_tag == LDAP_REQ_BIND )
1202                         pb->pb_op->orb_cred = *((struct berval *)value);
1203                 else
1204                         rc = PBLOCK_ERROR;
1205                 break;
1206         case SLAPI_COMPARE_TYPE:
1207                 PBLOCK_ASSERT_OP( pb, 0 );
1208                 PBLOCK_VALIDATE_IS_INTOP( pb );
1209
1210                 if ( pb->pb_op->o_tag == LDAP_REQ_COMPARE ) {
1211                         const char *text;
1212
1213                         pb->pb_op->orc_ava->aa_desc = NULL;
1214                         rc = slap_str2ad( (char *)value, &pb->pb_op->orc_ava->aa_desc, &text );
1215                 } else {
1216                         rc = PBLOCK_ERROR;
1217                 }
1218                 break;
1219         case SLAPI_COMPARE_VALUE:
1220                 PBLOCK_ASSERT_OP( pb, 0 );
1221                 PBLOCK_VALIDATE_IS_INTOP( pb );
1222
1223                 if ( pb->pb_op->o_tag == LDAP_REQ_COMPARE )
1224                         pb->pb_op->orc_ava->aa_value = *((struct berval *)value);
1225                 else
1226                         rc = PBLOCK_ERROR;
1227                 break;
1228         case SLAPI_ABANDON_MSGID:
1229                 PBLOCK_ASSERT_OP( pb, 0 );
1230                 PBLOCK_VALIDATE_IS_INTOP( pb );
1231
1232                 if ( pb->pb_op->o_tag == LDAP_REQ_ABANDON)
1233                         pb->pb_op->orn_msgid = *((int *)value);
1234                 else
1235                         rc = PBLOCK_ERROR;
1236                 break;
1237         case SLAPI_REQUESTOR_ISROOT:
1238         case SLAPI_IS_REPLICATED_OPERATION:
1239         case SLAPI_CONN_AUTHTYPE:
1240         case SLAPI_CONN_AUTHMETHOD:
1241         case SLAPI_IS_INTERNAL_OPERATION:
1242         case SLAPI_X_CONN_IS_UDP:
1243         case SLAPI_CONN_CLIENTIP:
1244         case SLAPI_X_CONN_CLIENTPATH:
1245         case SLAPI_CONN_SERVERIP:
1246         case SLAPI_X_CONN_SERVERPATH:
1247         case SLAPI_X_ADD_STRUCTURAL_CLASS:
1248                 /* These parameters cannot be set */
1249                 rc = PBLOCK_ERROR;
1250                 break;
1251         default:
1252                 rc = pblock_set_default( pb, param, value );
1253                 break;
1254         }
1255
1256         pblock_unlock( pb );
1257
1258         return rc;
1259 }
1260
1261 static void
1262 pblock_clear( Slapi_PBlock *pb ) 
1263 {
1264         pb->pb_nParams = 1;
1265 }
1266
1267 static int
1268 pblock_delete_param( Slapi_PBlock *p, int param ) 
1269 {
1270         int i;
1271
1272         pblock_lock(p);
1273
1274         for ( i = 0; i < p->pb_nParams; i++ ) { 
1275                 if ( p->pb_params[i] == param ) {
1276                         break;
1277                 }
1278         }
1279     
1280         if (i >= p->pb_nParams ) {
1281                 pblock_unlock( p );
1282                 return PBLOCK_ERROR;
1283         }
1284
1285         /* move last parameter to index of deleted parameter */
1286         if ( p->pb_nParams > 1 ) {
1287                 p->pb_params[i] = p->pb_params[p->pb_nParams - 1];
1288                 p->pb_values[i] = p->pb_values[p->pb_nParams - 1];
1289         }
1290         p->pb_nParams--;
1291
1292         pblock_unlock( p );     
1293
1294         return PBLOCK_SUCCESS;
1295 }
1296
1297 Slapi_PBlock *
1298 slapi_pblock_new(void) 
1299 {
1300         Slapi_PBlock *pb;
1301
1302         pb = (Slapi_PBlock *) ch_calloc( 1, sizeof(Slapi_PBlock) );
1303         if ( pb != NULL ) {
1304                 ldap_pvt_thread_mutex_init( &pb->pb_mutex );
1305
1306                 pb->pb_params[0] = SLAPI_IBM_PBLOCK;
1307                 pb->pb_values[0].pv_pointer = NULL;
1308                 pb->pb_nParams = 1;
1309                 pb->pb_conn = NULL;
1310                 pb->pb_op = NULL;
1311                 pb->pb_rs = NULL;
1312                 pb->pb_intop = 0;
1313         }
1314         return pb;
1315 }
1316
1317 static void
1318 pblock_destroy( Slapi_PBlock *pb )
1319 {
1320         LDAPControl **controls = NULL;
1321         LDAPMod **mods = NULL;
1322         char **attrs = NULL;
1323
1324         assert( pb != NULL );
1325
1326         pblock_get_default( pb, SLAPI_RESCONTROLS, (void **)&controls );
1327         if ( controls != NULL ) {
1328                 ldap_controls_free( controls );
1329         }
1330
1331         if ( pb->pb_intop ) {
1332                 slapi_int_connection_done_pb( pb );
1333         } else {
1334                 pblock_get_default( pb, SLAPI_MODIFY_MODS, (void **)&mods );
1335                 ldap_mods_free( mods, 1 );
1336
1337                 pblock_get_default( pb, SLAPI_SEARCH_ATTRS, (void **)&attrs );
1338                 if ( attrs != NULL )
1339                         pb->pb_op->o_tmpfree( attrs, pb->pb_op->o_tmpmemctx );
1340         }
1341
1342         ldap_pvt_thread_mutex_destroy( &pb->pb_mutex );
1343         slapi_ch_free( (void **)&pb ); 
1344 }
1345
1346 void 
1347 slapi_pblock_destroy( Slapi_PBlock *pb ) 
1348 {
1349         if ( pb != NULL ) {
1350                 pblock_destroy( pb );
1351         }
1352 }
1353
1354 int 
1355 slapi_pblock_get( Slapi_PBlock *pb, int arg, void *value ) 
1356 {
1357         return pblock_get( pb, arg, (void **)value );
1358 }
1359
1360 int 
1361 slapi_pblock_set( Slapi_PBlock *pb, int arg, void *value ) 
1362 {
1363         return pblock_set( pb, arg, value );
1364 }
1365
1366 void
1367 slapi_pblock_clear( Slapi_PBlock *pb ) 
1368 {
1369         pblock_clear( pb );
1370 }
1371
1372 int 
1373 slapi_pblock_delete_param( Slapi_PBlock *p, int param ) 
1374 {
1375         return pblock_delete_param( p, param );
1376 }
1377
1378 /*
1379  * OpenLDAP extension
1380  */
1381 int
1382 slapi_int_pblock_get_first( Backend *be, Slapi_PBlock **pb )
1383 {
1384         assert( pb != NULL );
1385         *pb = SLAPI_BACKEND_PBLOCK( be );
1386         return (*pb == NULL ? LDAP_OTHER : LDAP_SUCCESS);
1387 }
1388
1389 /*
1390  * OpenLDAP extension
1391  */
1392 int
1393 slapi_int_pblock_get_next( Slapi_PBlock **pb )
1394 {
1395         assert( pb != NULL );
1396         return slapi_pblock_get( *pb, SLAPI_IBM_PBLOCK, pb );
1397 }
1398
1399 #endif /* LDAP_SLAPI */
1400