mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-01-30 13:30:57 +08:00
Exop support
At the moment, no exops are processed internally, all are passed on unchanged.
This commit is contained in:
parent
7cd531c069
commit
11f474385a
@ -23,7 +23,7 @@ NT_OBJS = nt_svc.o ../../libraries/liblutil/slapdmsg.res
|
||||
|
||||
SRCS = main.c globals.c backend.c bind.c config.c connection.c client.c \
|
||||
daemon.c ch_malloc.c init.c operation.c user.c sl_malloc.c \
|
||||
upstream.c value.c libevent_support.c \
|
||||
upstream.c value.c libevent_support.c extended.c \
|
||||
$(@PLAT@_SRCS)
|
||||
|
||||
OBJS = $(patsubst %.c,%.o,$(SRCS)) $(@PLAT@_OBJS)
|
||||
|
@ -65,6 +65,9 @@ handle_one_request( Connection *c )
|
||||
* ExOps (esp. Cancel) will be different */
|
||||
handler = request_abandon;
|
||||
break;
|
||||
case LDAP_REQ_EXTENDED:
|
||||
handler = request_extended;
|
||||
break;
|
||||
default:
|
||||
if ( c->c_state == SLAP_C_BINDING ) {
|
||||
return operation_send_reject_locked(
|
||||
|
107
servers/lloadd/extended.c
Normal file
107
servers/lloadd/extended.c
Normal file
@ -0,0 +1,107 @@
|
||||
/* $OpenLDAP$ */
|
||||
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
|
||||
*
|
||||
* Copyright 1998-2020 The OpenLDAP Foundation.
|
||||
* 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>.
|
||||
*/
|
||||
|
||||
#include "portable.h"
|
||||
|
||||
#include <ac/string.h>
|
||||
|
||||
#include "lutil.h"
|
||||
#include "slap.h"
|
||||
|
||||
Avlnode *lload_exop_handlers = NULL;
|
||||
|
||||
int
|
||||
request_extended( Connection *c, Operation *op )
|
||||
{
|
||||
ExopHandler *handler, needle = {};
|
||||
BerElement *copy;
|
||||
struct berval bv;
|
||||
ber_tag_t tag;
|
||||
|
||||
if ( (copy = ber_alloc()) == NULL ) {
|
||||
if ( operation_send_reject_locked(
|
||||
op, LDAP_OTHER, "internal error", 0 ) == LDAP_SUCCESS ) {
|
||||
CONNECTION_DESTROY(c);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
ber_init2( copy, &op->o_request, 0 );
|
||||
|
||||
tag = ber_skip_element( copy, &bv );
|
||||
if ( tag != LDAP_TAG_EXOP_REQ_OID ) {
|
||||
Debug( LDAP_DEBUG_STATS, "request_extended: "
|
||||
"no OID present in extended request\n" );
|
||||
return operation_send_reject_locked(
|
||||
op, LDAP_PROTOCOL_ERROR, "decoding error", 0 );
|
||||
}
|
||||
|
||||
needle.oid = bv;
|
||||
|
||||
handler = avl_find( lload_exop_handlers, &needle, exop_handler_cmp );
|
||||
if ( handler ) {
|
||||
Debug( LDAP_DEBUG_TRACE, "request_extended: "
|
||||
"handling exop OID %.*s internally\n",
|
||||
(int)bv.bv_len, bv.bv_val );
|
||||
ber_free( copy, 0 );
|
||||
return handler->func( c, op );
|
||||
}
|
||||
ber_free( copy, 0 );
|
||||
|
||||
if ( c->c_state == SLAP_C_BINDING ) {
|
||||
return operation_send_reject_locked(
|
||||
op, LDAP_PROTOCOL_ERROR, "bind in progress", 0 );
|
||||
}
|
||||
return request_process( c, op );
|
||||
}
|
||||
|
||||
ExopHandler lload_exops[] = { { BER_BVNULL }
|
||||
};
|
||||
|
||||
int
|
||||
exop_handler_cmp( const void *left, const void *right )
|
||||
{
|
||||
const struct lload_exop_handlers_t *l = left, *r = right;
|
||||
return ber_bvcmp( &l->oid, &r->oid );
|
||||
}
|
||||
|
||||
int
|
||||
lload_register_exop_handlers( struct lload_exop_handlers_t *handler )
|
||||
{
|
||||
for ( ; !BER_BVISNULL( &handler->oid ); handler++ ) {
|
||||
Debug( LDAP_DEBUG_TRACE, "lload_register_exop_handlers: "
|
||||
"registering handler for exop oid=%s\n",
|
||||
handler->oid.bv_val );
|
||||
if ( avl_insert( &lload_exop_handlers, handler, exop_handler_cmp,
|
||||
avl_dup_error ) ) {
|
||||
Debug( LDAP_DEBUG_ANY, "lload_register_exop_handlers: "
|
||||
"failed to register handler for exop oid=%s\n",
|
||||
handler->oid.bv_val );
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return LDAP_SUCCESS;
|
||||
}
|
||||
|
||||
int
|
||||
lload_exop_init( void )
|
||||
{
|
||||
if ( lload_register_exop_handlers( lload_exops ) ) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return LDAP_SUCCESS;
|
||||
}
|
@ -101,6 +101,8 @@ slap_init( int mode, const char *name )
|
||||
ldap_pvt_thread_mutex_init( &backend_mutex );
|
||||
ldap_pvt_thread_mutex_init( &clients_mutex );
|
||||
|
||||
lload_exop_init();
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -121,6 +121,14 @@ LDAP_SLAPD_V (int) slapd_tcp_wmem;
|
||||
( ( (bv1)->bv_len == (bv2)->bv_len ) && \
|
||||
( memcmp( (bv1)->bv_val, (bv2)->bv_val, (bv1)->bv_len ) == 0 ) )
|
||||
|
||||
/*
|
||||
* extended.c
|
||||
*/
|
||||
LDAP_SLAPD_V (Avlnode *) lload_exop_handlers;
|
||||
LDAP_SLAPD_F (int) exop_handler_cmp( const void *l, const void *r );
|
||||
LDAP_SLAPD_F (int) request_extended( Connection *c, Operation *op );
|
||||
LDAP_SLAPD_F (int) lload_exop_init( void );
|
||||
|
||||
/*
|
||||
* globals.c
|
||||
*/
|
||||
|
@ -282,6 +282,10 @@ struct Backend {
|
||||
|
||||
typedef int (*OperationHandler)( Operation *op, BerElement *ber );
|
||||
typedef int (*RequestHandler)( Connection *c, Operation *op );
|
||||
typedef struct lload_exop_handlers_t {
|
||||
struct berval oid;
|
||||
RequestHandler func;
|
||||
} ExopHandler;
|
||||
|
||||
typedef int (*CONNECTION_PDU_CB)( Connection *c );
|
||||
typedef void (*CONNECTION_DESTROY_CB)( Connection *c );
|
||||
|
Loading…
Reference in New Issue
Block a user