📄 slapi_pblock.c
字号:
/* $OpenLDAP: pkg/ldap/servers/slapd/slapi/slapi_pblock.c,v 1.27.2.8 2007/01/02 21:44:11 kurt Exp $ *//* This work is part of OpenLDAP Software <http://www.openldap.org/>. * * Copyright 2002-2007 The OpenLDAP Foundation. * Portions Copyright 1997,2002-2003 IBM Corporation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted only as authorized by the OpenLDAP * Public License. * * A copy of this license is available in the file LICENSE in the * top-level directory of the distribution or, alternatively, at * <http://www.OpenLDAP.org/license.html>. *//* ACKNOWLEDGEMENTS: * This work was initially developed by IBM Corporation for use in * IBM products and subsequently ported to OpenLDAP Software by * Steve Omrani. Additional significant contributors include: * Luke Howard */#include "portable.h"#include <slap.h>#include <slapi.h>#ifdef LDAP_SLAPI/* some parameters require a valid connection and operation */#define PBLOCK_LOCK_CONN( _pb ) do { \ ldap_pvt_thread_mutex_lock( &(_pb)->pb_conn->c_mutex ); \ } while (0)#define PBLOCK_UNLOCK_CONN( _pb ) do { \ ldap_pvt_thread_mutex_unlock( &(_pb)->pb_conn->c_mutex ); \ } while (0)/* some parameters are only settable for internal operations */#define PBLOCK_VALIDATE_IS_INTOP( _pb ) do { if ( (_pb)->pb_intop == 0 ) break; } while ( 0 )static slapi_pblock_class_t pblock_get_param_class( int param ) { switch ( param ) { case SLAPI_PLUGIN_TYPE: case SLAPI_PLUGIN_ARGC: case SLAPI_PLUGIN_OPRETURN: case SLAPI_PLUGIN_INTOP_RESULT: case SLAPI_CONFIG_LINENO: case SLAPI_CONFIG_ARGC: case SLAPI_BIND_METHOD: case SLAPI_MODRDN_DELOLDRDN: case SLAPI_SEARCH_SCOPE: case SLAPI_SEARCH_DEREF: case SLAPI_SEARCH_SIZELIMIT: case SLAPI_SEARCH_TIMELIMIT: case SLAPI_SEARCH_ATTRSONLY: case SLAPI_NENTRIES: case SLAPI_CHANGENUMBER: case SLAPI_DBSIZE: case SLAPI_REQUESTOR_ISROOT: case SLAPI_BE_READONLY: case SLAPI_BE_LASTMOD: case SLAPI_DB2LDIF_PRINTKEY: case SLAPI_LDIF2DB_REMOVEDUPVALS: case SLAPI_MANAGEDSAIT: case SLAPI_X_MANAGEDIT: case SLAPI_X_OPERATION_NO_SCHEMA_CHECK: case SLAPI_IS_REPLICATED_OPERATION: case SLAPI_X_CONN_IS_UDP: case SLAPI_X_CONN_SSF: case SLAPI_RESULT_CODE: case SLAPI_LOG_OPERATION: return PBLOCK_CLASS_INTEGER; break; case SLAPI_CONN_ID: case SLAPI_OPERATION_ID: case SLAPI_OPINITIATED_TIME: case SLAPI_ABANDON_MSGID: case SLAPI_X_OPERATION_DELETE_GLUE_PARENT: return PBLOCK_CLASS_LONG_INTEGER; break; case SLAPI_PLUGIN_DESTROY_FN: case SLAPI_PLUGIN_DB_BIND_FN: case SLAPI_PLUGIN_DB_UNBIND_FN: case SLAPI_PLUGIN_DB_SEARCH_FN: case SLAPI_PLUGIN_DB_COMPARE_FN: case SLAPI_PLUGIN_DB_MODIFY_FN: case SLAPI_PLUGIN_DB_MODRDN_FN: case SLAPI_PLUGIN_DB_ADD_FN: case SLAPI_PLUGIN_DB_DELETE_FN: case SLAPI_PLUGIN_DB_ABANDON_FN: case SLAPI_PLUGIN_DB_CONFIG_FN: case SLAPI_PLUGIN_CLOSE_FN: case SLAPI_PLUGIN_DB_FLUSH_FN: case SLAPI_PLUGIN_START_FN: case SLAPI_PLUGIN_DB_SEQ_FN: case SLAPI_PLUGIN_DB_ENTRY_FN: case SLAPI_PLUGIN_DB_REFERRAL_FN: case SLAPI_PLUGIN_DB_RESULT_FN: case SLAPI_PLUGIN_DB_LDIF2DB_FN: case SLAPI_PLUGIN_DB_DB2LDIF_FN: case SLAPI_PLUGIN_DB_BEGIN_FN: case SLAPI_PLUGIN_DB_COMMIT_FN: case SLAPI_PLUGIN_DB_ABORT_FN: case SLAPI_PLUGIN_DB_ARCHIVE2DB_FN: case SLAPI_PLUGIN_DB_DB2ARCHIVE_FN: case SLAPI_PLUGIN_DB_NEXT_SEARCH_ENTRY_FN: case SLAPI_PLUGIN_DB_FREE_RESULT_SET_FN: case SLAPI_PLUGIN_DB_SIZE_FN: case SLAPI_PLUGIN_DB_TEST_FN: case SLAPI_PLUGIN_DB_NO_ACL: case SLAPI_PLUGIN_EXT_OP_FN: case SLAPI_PLUGIN_EXT_OP_OIDLIST: case SLAPI_PLUGIN_PRE_BIND_FN: case SLAPI_PLUGIN_PRE_UNBIND_FN: case SLAPI_PLUGIN_PRE_SEARCH_FN: case SLAPI_PLUGIN_PRE_COMPARE_FN: case SLAPI_PLUGIN_PRE_MODIFY_FN: case SLAPI_PLUGIN_PRE_MODRDN_FN: case SLAPI_PLUGIN_PRE_ADD_FN: case SLAPI_PLUGIN_PRE_DELETE_FN: case SLAPI_PLUGIN_PRE_ABANDON_FN: case SLAPI_PLUGIN_PRE_ENTRY_FN: case SLAPI_PLUGIN_PRE_REFERRAL_FN: case SLAPI_PLUGIN_PRE_RESULT_FN: case SLAPI_PLUGIN_INTERNAL_PRE_ADD_FN: case SLAPI_PLUGIN_INTERNAL_PRE_MODIFY_FN: case SLAPI_PLUGIN_INTERNAL_PRE_MODRDN_FN: case SLAPI_PLUGIN_INTERNAL_PRE_DELETE_FN: case SLAPI_PLUGIN_BE_PRE_ADD_FN: case SLAPI_PLUGIN_BE_PRE_MODIFY_FN: case SLAPI_PLUGIN_BE_PRE_MODRDN_FN: case SLAPI_PLUGIN_BE_PRE_DELETE_FN: case SLAPI_PLUGIN_POST_BIND_FN: case SLAPI_PLUGIN_POST_UNBIND_FN: case SLAPI_PLUGIN_POST_SEARCH_FN: case SLAPI_PLUGIN_POST_COMPARE_FN: case SLAPI_PLUGIN_POST_MODIFY_FN: case SLAPI_PLUGIN_POST_MODRDN_FN: case SLAPI_PLUGIN_POST_ADD_FN: case SLAPI_PLUGIN_POST_DELETE_FN: case SLAPI_PLUGIN_POST_ABANDON_FN: case SLAPI_PLUGIN_POST_ENTRY_FN: case SLAPI_PLUGIN_POST_REFERRAL_FN: case SLAPI_PLUGIN_POST_RESULT_FN: case SLAPI_PLUGIN_INTERNAL_POST_ADD_FN: case SLAPI_PLUGIN_INTERNAL_POST_MODIFY_FN: case SLAPI_PLUGIN_INTERNAL_POST_MODRDN_FN: case SLAPI_PLUGIN_INTERNAL_POST_DELETE_FN: case SLAPI_PLUGIN_BE_POST_ADD_FN: case SLAPI_PLUGIN_BE_POST_MODIFY_FN: case SLAPI_PLUGIN_BE_POST_MODRDN_FN: case SLAPI_PLUGIN_BE_POST_DELETE_FN: case SLAPI_PLUGIN_MR_FILTER_CREATE_FN: case SLAPI_PLUGIN_MR_INDEXER_CREATE_FN: case SLAPI_PLUGIN_MR_FILTER_MATCH_FN: case SLAPI_PLUGIN_MR_FILTER_INDEX_FN: case SLAPI_PLUGIN_MR_FILTER_RESET_FN: case SLAPI_PLUGIN_MR_INDEX_FN: case SLAPI_PLUGIN_COMPUTE_EVALUATOR_FN: case SLAPI_PLUGIN_COMPUTE_SEARCH_REWRITER_FN: case SLAPI_PLUGIN_ACL_ALLOW_ACCESS: case SLAPI_X_PLUGIN_PRE_GROUP_FN: case SLAPI_X_PLUGIN_POST_GROUP_FN: case SLAPI_PLUGIN_AUDIT_FN: return PBLOCK_CLASS_FUNCTION_POINTER; break; case SLAPI_BACKEND: case SLAPI_CONNECTION: case SLAPI_OPERATION: case SLAPI_OPERATION_PARAMETERS: case SLAPI_OPERATION_TYPE: case SLAPI_OPERATION_AUTHTYPE: case SLAPI_BE_MONITORDN: case SLAPI_BE_TYPE: case SLAPI_REQUESTOR_DN: case SLAPI_CONN_DN: case SLAPI_CONN_CLIENTIP: case SLAPI_CONN_SERVERIP: case SLAPI_CONN_AUTHTYPE: case SLAPI_CONN_AUTHMETHOD: case SLAPI_CONN_CERT: case SLAPI_X_CONN_CLIENTPATH: case SLAPI_X_CONN_SERVERPATH: case SLAPI_X_CONN_SASL_CONTEXT: case SLAPI_X_CONFIG_ARGV: case SLAPI_X_INTOP_FLAGS: case SLAPI_X_INTOP_RESULT_CALLBACK: case SLAPI_X_INTOP_SEARCH_ENTRY_CALLBACK: case SLAPI_X_INTOP_REFERRAL_ENTRY_CALLBACK: case SLAPI_X_INTOP_CALLBACK_DATA: case SLAPI_PLUGIN_MR_OID: case SLAPI_PLUGIN_MR_TYPE: case SLAPI_PLUGIN_MR_VALUE: case SLAPI_PLUGIN_MR_VALUES: case SLAPI_PLUGIN_MR_KEYS: case SLAPI_PLUGIN: case SLAPI_PLUGIN_PRIVATE: case SLAPI_PLUGIN_ARGV: case SLAPI_PLUGIN_OBJECT: case SLAPI_PLUGIN_DESCRIPTION: case SLAPI_PLUGIN_IDENTITY: case SLAPI_PLUGIN_INTOP_SEARCH_ENTRIES: case SLAPI_PLUGIN_INTOP_SEARCH_REFERRALS: case SLAPI_PLUGIN_MR_FILTER_REUSABLE: case SLAPI_PLUGIN_MR_QUERY_OPERATOR: case SLAPI_PLUGIN_MR_USAGE: case SLAPI_OP_LESS: case SLAPI_OP_LESS_OR_EQUAL: case SLAPI_PLUGIN_MR_USAGE_INDEX: case SLAPI_PLUGIN_SYNTAX_FILTER_AVA: case SLAPI_PLUGIN_SYNTAX_FILTER_SUB: case SLAPI_PLUGIN_SYNTAX_VALUES2KEYS: case SLAPI_PLUGIN_SYNTAX_ASSERTION2KEYS_AVA: case SLAPI_PLUGIN_SYNTAX_ASSERTION2KEYS_SUB: case SLAPI_PLUGIN_SYNTAX_NAMES: case SLAPI_PLUGIN_SYNTAX_OID: case SLAPI_PLUGIN_SYNTAX_FLAGS: case SLAPI_PLUGIN_SYNTAX_COMPARE: case SLAPI_CONFIG_FILENAME: case SLAPI_CONFIG_ARGV: case SLAPI_TARGET_ADDRESS: case SLAPI_TARGET_UNIQUEID: case SLAPI_TARGET_DN: case SLAPI_REQCONTROLS: case SLAPI_ENTRY_PRE_OP: case SLAPI_ENTRY_POST_OP: case SLAPI_RESCONTROLS: case SLAPI_X_OLD_RESCONTROLS: case SLAPI_ADD_RESCONTROL: case SLAPI_CONTROLS_ARG: case SLAPI_ADD_ENTRY: case SLAPI_ADD_EXISTING_DN_ENTRY: case SLAPI_ADD_PARENT_ENTRY: case SLAPI_ADD_PARENT_UNIQUEID: case SLAPI_ADD_EXISTING_UNIQUEID_ENTRY: case SLAPI_BIND_CREDENTIALS: case SLAPI_BIND_SASLMECHANISM: case SLAPI_BIND_RET_SASLCREDS: case SLAPI_COMPARE_TYPE: case SLAPI_COMPARE_VALUE: case SLAPI_MODIFY_MODS: case SLAPI_MODRDN_NEWRDN: case SLAPI_MODRDN_NEWSUPERIOR: case SLAPI_MODRDN_PARENT_ENTRY: case SLAPI_MODRDN_NEWPARENT_ENTRY: case SLAPI_MODRDN_TARGET_ENTRY: case SLAPI_MODRDN_NEWSUPERIOR_ADDRESS: case SLAPI_SEARCH_FILTER: case SLAPI_SEARCH_STRFILTER: case SLAPI_SEARCH_ATTRS: case SLAPI_SEQ_TYPE: case SLAPI_SEQ_ATTRNAME: case SLAPI_SEQ_VAL: case SLAPI_EXT_OP_REQ_OID: case SLAPI_EXT_OP_REQ_VALUE: case SLAPI_EXT_OP_RET_OID: case SLAPI_EXT_OP_RET_VALUE: case SLAPI_MR_FILTER_ENTRY: case SLAPI_MR_FILTER_TYPE: case SLAPI_MR_FILTER_VALUE: case SLAPI_MR_FILTER_OID: case SLAPI_MR_FILTER_DNATTRS: case SLAPI_LDIF2DB_FILE: case SLAPI_PARENT_TXN: case SLAPI_TXN: case SLAPI_SEARCH_RESULT_SET: case SLAPI_SEARCH_RESULT_ENTRY: case SLAPI_SEARCH_REFERRALS: case SLAPI_RESULT_TEXT: case SLAPI_RESULT_MATCHED: case SLAPI_X_GROUP_ENTRY: case SLAPI_X_GROUP_ATTRIBUTE: case SLAPI_X_GROUP_OPERATION_DN: case SLAPI_X_GROUP_TARGET_ENTRY: case SLAPI_X_ADD_STRUCTURAL_CLASS: case SLAPI_PLUGIN_AUDIT_DATA: case SLAPI_IBM_PBLOCK: case SLAPI_PLUGIN_VERSION: return PBLOCK_CLASS_POINTER; break; default: break; } return PBLOCK_CLASS_INVALID;}static voidpblock_lock( Slapi_PBlock *pb ){ ldap_pvt_thread_mutex_lock( &pb->pb_mutex );}static voidpblock_unlock( Slapi_PBlock *pb ){ ldap_pvt_thread_mutex_unlock( &pb->pb_mutex );}static int pblock_get_default( Slapi_PBlock *pb, int param, void **value ) { int i; slapi_pblock_class_t pbClass; pbClass = pblock_get_param_class( param ); if ( pbClass == PBLOCK_CLASS_INVALID ) { return PBLOCK_ERROR; } switch ( pbClass ) { case PBLOCK_CLASS_INTEGER: *((int *)value) = 0; break; case PBLOCK_CLASS_LONG_INTEGER: *((long *)value) = 0L; break; case PBLOCK_CLASS_POINTER: case PBLOCK_CLASS_FUNCTION_POINTER: *value = NULL; break; case PBLOCK_CLASS_INVALID: return PBLOCK_ERROR; } for ( i = 0; i < pb->pb_nParams; i++ ) { if ( pb->pb_params[i] == param ) { switch ( pbClass ) { case PBLOCK_CLASS_INTEGER: *((int *)value) = pb->pb_values[i].pv_integer; break; case PBLOCK_CLASS_LONG_INTEGER: *((long *)value) = pb->pb_values[i].pv_long_integer; break; case PBLOCK_CLASS_POINTER: *value = pb->pb_values[i].pv_pointer; break; case PBLOCK_CLASS_FUNCTION_POINTER: *value = pb->pb_values[i].pv_function_pointer; break; default: break; } break; } } return PBLOCK_SUCCESS;}static char *pblock_get_authtype( AuthorizationInformation *authz, int is_tls ){ char *authType; switch ( authz->sai_method ) { case LDAP_AUTH_SASL: authType = SLAPD_AUTH_SASL; break; case LDAP_AUTH_SIMPLE: authType = SLAPD_AUTH_SIMPLE; break; case LDAP_AUTH_NONE: authType = SLAPD_AUTH_NONE; break; default: authType = NULL; break; } if ( is_tls && authType == NULL ) { authType = SLAPD_AUTH_SSL; } return authType;}static int pblock_set_default( Slapi_PBlock *pb, int param, void *value ) { slapi_pblock_class_t pbClass; size_t i; pbClass = pblock_get_param_class( param ); if ( pbClass == PBLOCK_CLASS_INVALID ) { return PBLOCK_ERROR; } if ( pb->pb_nParams == PBLOCK_MAX_PARAMS ) { return PBLOCK_ERROR; } for ( i = 0; i < pb->pb_nParams; i++ ) { if ( pb->pb_params[i] == param ) break; } if ( i >= pb->pb_nParams ) { pb->pb_params[i] = param; pb->pb_nParams++; } switch ( pbClass ) { case PBLOCK_CLASS_INTEGER: pb->pb_values[i].pv_integer = (*((int *)value)); break; case PBLOCK_CLASS_LONG_INTEGER: pb->pb_values[i].pv_long_integer = (*((long *)value)); break; case PBLOCK_CLASS_POINTER: pb->pb_values[i].pv_pointer = value; break; case PBLOCK_CLASS_FUNCTION_POINTER: pb->pb_values[i].pv_function_pointer = value; break; default: break; } return PBLOCK_SUCCESS;}static intpblock_be_call( Slapi_PBlock *pb, int (*bep)(Operation *) ){ BackendDB *be_orig; Operation *op; int rc; PBLOCK_ASSERT_OP( pb, 0 ); op = pb->pb_op; be_orig = op->o_bd; op->o_bd = select_backend( &op->o_req_ndn, 0, 0 ); rc = (*bep)( op ); op->o_bd = be_orig; return rc;}static int pblock_get( Slapi_PBlock *pb, int param, void **value ) { int rc = PBLOCK_SUCCESS; pblock_lock( pb ); switch ( param ) { case SLAPI_OPERATION: *value = pb->pb_op; break; case SLAPI_OPINITIATED_TIME: PBLOCK_ASSERT_OP( pb, 0 ); *((long *)value) = pb->pb_op->o_time; break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -