From: Howard Chu Date: Thu, 25 Nov 2004 22:59:00 +0000 (+0000) Subject: Split Operation into Opheader and op X-Git-Tag: OPENLDAP_REL_ENG_2_3_0ALPHA~222 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=90cc4093255c3f0506df9d1d6064db4002861bc1;p=openldap Split Operation into Opheader and op --- diff --git a/servers/slapd/acl.c b/servers/slapd/acl.c index fbcdf3a599..2be75b5128 100644 --- a/servers/slapd/acl.c +++ b/servers/slapd/acl.c @@ -2025,21 +2025,13 @@ aci_set_gather( SetCookie *cookie, struct berval *name, AttributeDescription *de p.cookie = cookie; + op2.o_hdr = cp->op->o_hdr; op2.o_tag = LDAP_REQ_SEARCH; - op2.o_protocol = LDAP_VERSION3; op2.o_ndn = op2.o_bd->be_rootndn; op2.o_callback = &cb; op2.o_time = slap_get_time(); op2.o_do_not_cache = 1; op2.o_is_auth_check = 0; - op2.o_threadctx = cp->op->o_threadctx; - op2.o_tmpmemctx = cp->op->o_tmpmemctx; - op2.o_tmpmfuncs = cp->op->o_tmpmfuncs; -#ifdef LDAP_SLAPI - op2.o_pb = cp->op->o_pb; -#endif - op2.o_conn = cp->op->o_conn; - op2.o_connid = cp->op->o_connid; ber_dupbv_x( &op2.o_req_dn, &op2.o_req_ndn, cp->op->o_tmpmemctx ); op2.ors_slimit = SLAP_NO_LIMIT; op2.ors_tlimit = SLAP_NO_LIMIT; diff --git a/servers/slapd/back-monitor/init.c b/servers/slapd/back-monitor/init.c index 03a233ad7a..496d5e9ce8 100644 --- a/servers/slapd/back-monitor/init.c +++ b/servers/slapd/back-monitor/init.c @@ -374,6 +374,7 @@ monitor_filter2ndn( struct berval *base, int scope, struct berval *filter, { Connection conn = { 0 }; Operation op = { 0 }; + Opheader ohdr = { 0 }; SlapReply rs = { 0 }; slap_callback cb = { NULL, monitor_filter2ndn_cb, NULL, NULL }; AttributeName anlist[ 2 ]; @@ -385,7 +386,7 @@ monitor_filter2ndn( struct berval *base, int scope, struct berval *filter, return -1; } - connection_fake_init( &conn, &op, &conn ); + connection_fake_init( &conn, &op, &ohdr, &conn ); op.o_tag = LDAP_REQ_SEARCH; diff --git a/servers/slapd/connection.c b/servers/slapd/connection.c index abb470fac9..19143d5daa 100644 --- a/servers/slapd/connection.c +++ b/servers/slapd/connection.c @@ -1695,6 +1695,7 @@ void connection_fake_init( Connection *conn, Operation *op, + Opheader *ohdr, void *ctx ) { conn->c_connid = -1; @@ -1705,6 +1706,7 @@ connection_fake_init( conn->c_peer_domain = slap_empty_bv; conn->c_peer_name = slap_empty_bv; + op->o_hdr = ohdr; /* set memory context */ op->o_tmpmemctx = slap_sl_mem_create(SLAP_SLAB_SIZE, SLAP_SLAB_STACK, ctx); op->o_tmpmfuncs = &slap_sl_mfuncs; diff --git a/servers/slapd/filter.c b/servers/slapd/filter.c index d1cc7da88f..df96a225f4 100644 --- a/servers/slapd/filter.c +++ b/servers/slapd/filter.c @@ -541,7 +541,9 @@ void filter_free( Filter *f ) { Operation op; + Opheader ohdr; + op.o_hdr = &ohdr; op.o_tmpmemctx = slap_sl_context( f ); op.o_tmpmfuncs = &slap_sl_mfuncs; filter_free_x( &op, f ); @@ -776,6 +778,9 @@ void filter2bv( Filter *f, struct berval *fstr ) { Operation op; + Opheader ohdr; + + op.o_hdr = &ohdr; op.o_tmpmemctx = NULL; op.o_tmpmfuncs = &ch_mfuncs; diff --git a/servers/slapd/operation.c b/servers/slapd/operation.c index 68d8a75821..d50d89b247 100644 --- a/servers/slapd/operation.c +++ b/servers/slapd/operation.c @@ -53,7 +53,6 @@ void slap_op_destroy(void) while ( (o = LDAP_STAILQ_FIRST( &slap_free_ops )) != NULL) { LDAP_STAILQ_REMOVE_HEAD( &slap_free_ops, o_next ); LDAP_STAILQ_NEXT(o, o_next) = NULL; - ch_free( o->o_controls ); ch_free( o ); } ldap_pvt_thread_mutex_destroy( &slap_op_mutex ); @@ -63,7 +62,6 @@ void slap_op_free( Operation *op ) { struct berval slap_empty_bv_dup; - void **controls; assert( LDAP_STAILQ_NEXT(op, o_next) == NULL ); @@ -106,10 +104,9 @@ slap_op_free( Operation *op ) #endif /* defined( LDAP_SLAPI ) */ - controls = op->o_controls; - memset( controls, 0, sizeof(void *) * SLAP_MAX_CIDS ); - memset( op, 0, sizeof(Operation) ); - op->o_controls = controls; + memset( op, 0, sizeof(Operation) + sizeof(Opheader) + SLAP_MAX_CIDS * sizeof(void *) ); + op->o_hdr = (Opheader *)(op+1); + op->o_controls = (void **)(op->o_hdr+1); #if 0 slap_sync_cookie_free( &op->o_sync_state, 0 ); @@ -144,8 +141,10 @@ slap_op_alloc( ldap_pvt_thread_mutex_unlock( &slap_op_mutex ); if (!op) { - op = (Operation *) ch_calloc( 1, sizeof(Operation) ); - op->o_controls = (void **) ch_calloc( SLAP_MAX_CIDS, sizeof( void *)); + op = (Operation *) ch_calloc( 1, sizeof(Operation) + + sizeof(Opheader) + SLAP_MAX_CIDS * sizeof(void *) ); + op->o_hdr = (Opheader *)(op + 1); + op->o_controls = (void **)(op->o_hdr+1); } op->o_ber = ber; diff --git a/servers/slapd/overlays/pcache.c b/servers/slapd/overlays/pcache.c index ff3110726e..e4135b9822 100644 --- a/servers/slapd/overlays/pcache.c +++ b/servers/slapd/overlays/pcache.c @@ -1411,6 +1411,7 @@ consistency_check( cache_manager *cm = on->on_bi.bi_private; query_manager *qm = cm->qm; Operation op = {0}; + Opheader ohdr = {0}; Connection conn = {0}; SlapReply rs = {REP_RESULT}; @@ -1418,7 +1419,7 @@ consistency_check( int i, return_val, pause = 1; QueryTemplate* templ; - connection_fake_init( &conn, &op, ctx ); + connection_fake_init( &conn, &op, &ohdr, ctx ); op.o_bd = &cm->db; op.o_dn = cm->db.be_rootdn; diff --git a/servers/slapd/overlays/syncprov.c b/servers/slapd/overlays/syncprov.c index 33d14c5285..5e67191fba 100644 --- a/servers/slapd/overlays/syncprov.c +++ b/servers/slapd/overlays/syncprov.c @@ -19,8 +19,6 @@ #include "portable.h" -#define SLAPD_OVER_SYNCPROV SLAPD_MOD_DYNAMIC - #ifdef SLAPD_OVER_SYNCPROV #include @@ -394,8 +392,11 @@ syncprov_sendresp( Operation *op, opcookie *opc, syncops *so, Entry *e, int mode Entry e_uuid = {0}; Attribute a_uuid = {0}; Operation sop = *so->s_op; + Opheader ohdr; syncrepl_state *srs = sop.o_controls[sync_cid]; + ohdr = *sop.o_hdr; + sop.o_hdr = &ohdr; sop.o_tmpmemctx = op->o_tmpmemctx; ctrls[1] = NULL; @@ -789,7 +790,7 @@ syncprov_op_search( Operation *op, SlapReply *rs ) Filter *fand, *fava; syncops *sop = NULL; searchstate *ss; - syncrepl_state *srs = op->o_controls[sync_cid]; + syncrepl_state *srs; if ( !(op->o_sync_mode & SLAP_SYNC_REFRESH) ) return SLAP_CB_CONTINUE; @@ -798,6 +799,8 @@ syncprov_op_search( Operation *op, SlapReply *rs ) return rs->sr_err; } + srs = op->o_controls[sync_cid]; + /* If this is a persistent search, set it up right away */ if ( op->o_sync_mode & SLAP_SYNC_PERSIST ) { syncops so; diff --git a/servers/slapd/passwd.c b/servers/slapd/passwd.c index d848e7a6cc..a39abcb29a 100644 --- a/servers/slapd/passwd.c +++ b/servers/slapd/passwd.c @@ -202,7 +202,7 @@ int passwd_extop( rs->sr_err = LDAP_OTHER; } else { - op2 = *op; + op2.o_hdr = op->o_hdr; op2.o_tag = LDAP_REQ_MODIFY; op2.o_callback = &cb2; op2.orm_modlist = qpw->rs_mods; diff --git a/servers/slapd/proto-slap.h b/servers/slapd/proto-slap.h index d0c3f93b37..06698a1f6f 100644 --- a/servers/slapd/proto-slap.h +++ b/servers/slapd/proto-slap.h @@ -448,6 +448,7 @@ LDAP_SLAPD_F (void) connection2anonymous LDAP_P((Connection *)); LDAP_SLAPD_F (void) connection_fake_init LDAP_P(( Connection *conn, Operation *op, + Opheader *ohdr, void *threadctx )); LDAP_SLAPD_F (void) connection_assign_nextid LDAP_P((Connection *)); diff --git a/servers/slapd/sasl.c b/servers/slapd/sasl.c index fb6ef138fc..61c003ac32 100644 --- a/servers/slapd/sasl.c +++ b/servers/slapd/sasl.c @@ -398,18 +398,13 @@ slap_auxprop_lookup( if ( op.o_bd && op.o_bd->be_search ) { SlapReply rs = {REP_RESULT}; + op.o_hdr = conn->c_sasl_bindop->o_hdr; op.o_tag = LDAP_REQ_SEARCH; - op.o_protocol = LDAP_VERSION3; op.o_ndn = conn->c_ndn; op.o_callback = &cb; op.o_time = slap_get_time(); op.o_do_not_cache = 1; op.o_is_auth_check = 1; - op.o_threadctx = conn->c_sasl_bindop->o_threadctx; - op.o_tmpmemctx = conn->c_sasl_bindop->o_tmpmemctx; - op.o_tmpmfuncs = conn->c_sasl_bindop->o_tmpmfuncs; - op.o_conn = conn; - op.o_connid = conn->c_connid; op.o_req_dn = op.o_req_ndn; op.ors_scope = LDAP_SCOPE_BASE; op.ors_deref = LDAP_DEREF_NEVER; @@ -504,18 +499,13 @@ slap_auxprop_store( } if ( rc == LDAP_SUCCESS ) { + op.o_hdr = conn->c_sasl_bindop->o_hdr; op.o_tag = LDAP_REQ_MODIFY; - op.o_protocol = LDAP_VERSION3; op.o_ndn = op.o_req_ndn; op.o_callback = &cb; op.o_time = slap_get_time(); op.o_do_not_cache = 1; op.o_is_auth_check = 1; - op.o_threadctx = conn->c_sasl_bindop->o_threadctx; - op.o_tmpmemctx = conn->c_sasl_bindop->o_tmpmemctx; - op.o_tmpmfuncs = conn->c_sasl_bindop->o_tmpmfuncs; - op.o_conn = conn; - op.o_connid = conn->c_connid; op.o_req_dn = op.o_req_ndn; op.orm_modlist = modlist; diff --git a/servers/slapd/saslauthz.c b/servers/slapd/saslauthz.c index 3faedc8ff1..52d928f512 100644 --- a/servers/slapd/saslauthz.c +++ b/servers/slapd/saslauthz.c @@ -992,21 +992,13 @@ exact_match: goto CONCLUDED; } + op.o_hdr = opx->o_hdr; op.o_tag = LDAP_REQ_SEARCH; - op.o_protocol = LDAP_VERSION3; op.o_ndn = *authc; op.o_callback = &cb; op.o_time = slap_get_time(); op.o_do_not_cache = 1; op.o_is_auth_check = 1; - op.o_threadctx = opx->o_threadctx; - op.o_tmpmemctx = opx->o_tmpmemctx; - op.o_tmpmfuncs = opx->o_tmpmfuncs; -#ifdef LDAP_SLAPI - op.o_pb = opx->o_pb; -#endif - op.o_conn = opx->o_conn; - op.o_connid = opx->o_connid; /* use req_ndn as req_dn instead of non-pretty base of uri */ if( !BER_BVISNULL( &base ) ) { ch_free( base.bv_val ); @@ -1163,21 +1155,13 @@ void slap_sasl2dn( Operation *opx, goto FINISHED; } - op.o_conn = opx->o_conn; - op.o_connid = opx->o_connid; + op.o_hdr = opx->o_hdr; op.o_tag = LDAP_REQ_SEARCH; - op.o_protocol = LDAP_VERSION3; op.o_ndn = opx->o_conn->c_ndn; op.o_callback = &cb; op.o_time = slap_get_time(); op.o_do_not_cache = 1; op.o_is_auth_check = 1; - op.o_threadctx = opx->o_threadctx; - op.o_tmpmemctx = opx->o_tmpmemctx; - op.o_tmpmfuncs = opx->o_tmpmfuncs; -#ifdef LDAP_SLAPI - op.o_pb = opx->o_pb; -#endif op.ors_deref = LDAP_DEREF_NEVER; op.ors_slimit = 1; op.ors_tlimit = SLAP_NO_LIMIT; diff --git a/servers/slapd/slap.h b/servers/slapd/slap.h index c8152611dd..c5ec701d55 100644 --- a/servers/slapd/slap.h +++ b/servers/slapd/slap.h @@ -2139,18 +2139,57 @@ typedef struct syncrepl_state { /* * represents an operation pending from an ldap client */ +typedef struct slap_op_header { + unsigned long oh_opid; /* id of this operation */ + unsigned long oh_connid; /* id of conn initiating this op */ + struct slap_conn *oh_conn; /* connection spawning this op */ + + ber_int_t oh_msgid; /* msgid of the request */ + ber_int_t oh_protocol; /* version of the LDAP protocol used by client */ + + ldap_pvt_thread_t oh_tid; /* thread handling this op */ + + void *oh_threadctx; /* thread pool thread context */ + void *oh_tmpmemctx; /* slab malloc context */ + BerMemoryFunctions *oh_tmpmfuncs; + + char oh_log_prefix[sizeof("conn=18446744073709551615 op=18446744073709551615")]; + +#ifdef LDAP_SLAPI + void *oh_pb; /* NS-SLAPI plugin */ + void *oh_extensions; /* NS-SLAPI plugin */ +#endif +} Opheader; + typedef struct slap_op { - unsigned long o_opid; /* id of this operation */ - unsigned long o_connid; /* id of conn initiating this op */ - char o_log_prefix[sizeof("conn=18446744073709551615 op=18446744073709551615")]; - struct slap_conn *o_conn; /* connection spawning this op */ - BackendDB *o_bd; /* backend DB processing this op */ + Opheader *o_hdr; + +#define o_opid o_hdr->oh_opid +#define o_connid o_hdr->oh_connid +#define o_conn o_hdr->oh_conn +#define o_msgid o_hdr->oh_msgid +#define o_protocol o_hdr->oh_protocol +#define o_tid o_hdr->oh_tid +#define o_threadctx o_hdr->oh_threadctx +#define o_tmpmemctx o_hdr->oh_tmpmemctx +#define o_tmpmfuncs o_hdr->oh_tmpmfuncs + +#define o_tmpalloc o_tmpmfuncs->bmf_malloc +#define o_tmpcalloc o_tmpmfuncs->bmf_calloc +#define o_tmprealloc o_tmpmfuncs->bmf_realloc +#define o_tmpfree o_tmpmfuncs->bmf_free + +#define o_log_prefix o_hdr->oh_log_prefix + +#ifdef LDAP_SLAPI +#define o_pb o_hdr->oh_pb +#define o_extensions o_hdr->oh_extensions +#endif - ber_int_t o_msgid; /* msgid of the request */ - ber_int_t o_protocol; /* version of the LDAP protocol used by client */ ber_tag_t o_tag; /* tag of the request */ time_t o_time; /* time op was initiated */ + BackendDB *o_bd; /* backend DB processing this op */ struct berval o_req_dn; /* DN of target of request */ struct berval o_req_ndn; @@ -2213,9 +2252,6 @@ typedef struct slap_op { #define ore_reqoid oq_extended.rs_reqoid #define ore_flags oq_extended.rs_flags #define ore_reqdata oq_extended.rs_reqdata - - ldap_pvt_thread_t o_tid; /* thread handling this op */ - volatile sig_atomic_t o_abandon; /* abandon flag */ volatile sig_atomic_t o_cancel; /* cancel flag */ #define SLAP_CANCEL_NONE 0x00 @@ -2337,26 +2373,13 @@ typedef struct slap_op { slap_callback *o_callback; /* callback pointers */ LDAPControl **o_ctrls; /* controls */ - void *o_threadctx; /* thread pool thread context */ - void *o_tmpmemctx; /* slab malloc context */ - BerMemoryFunctions *o_tmpmfuncs; -#define o_tmpalloc o_tmpmfuncs->bmf_malloc -#define o_tmpcalloc o_tmpmfuncs->bmf_calloc -#define o_tmprealloc o_tmpmfuncs->bmf_realloc -#define o_tmpfree o_tmpmfuncs->bmf_free void *o_private; /* anything the backend needs */ LDAP_STAILQ_ENTRY(slap_op) o_next; /* next operation in list */ - int o_nocaching; int o_delete_glue_parent; -#ifdef LDAP_SLAPI - void *o_pb; /* NS-SLAPI plugin */ - void *o_extensions; /* NS-SLAPI plugin */ -#endif - } Operation; #define send_ldap_error( op, rs, err, text ) do { \ diff --git a/servers/slapd/slapacl.c b/servers/slapd/slapacl.c index 391bb62444..b7d1928706 100644 --- a/servers/slapd/slapacl.c +++ b/servers/slapd/slapacl.c @@ -39,8 +39,9 @@ slapacl( int argc, char **argv ) { int rc = EXIT_SUCCESS; const char *progname = "slapacl"; - Connection conn; - Operation op; + Connection conn = {0}; + Operation op = {0}; + Opheader ohdr = {0}; Entry e = { 0 }; char *attr = NULL; @@ -49,10 +50,7 @@ slapacl( int argc, char **argv ) argv = &argv[ optind ]; argc -= optind; - memset( &conn, 0, sizeof( Connection ) ); - memset( &op, 0, sizeof( Operation ) ); - - connection_fake_init( &conn, &op, &conn ); + connection_fake_init( &conn, &op, &ohdr, &conn ); if ( !BER_BVISNULL( &authcID ) ) { rc = slap_sasl_getdn( &conn, &op, &authcID, NULL, diff --git a/servers/slapd/slapauth.c b/servers/slapd/slapauth.c index 8952c935b1..06dd27709d 100644 --- a/servers/slapd/slapauth.c +++ b/servers/slapd/slapauth.c @@ -79,18 +79,16 @@ slapauth( int argc, char **argv ) { int rc = EXIT_SUCCESS; const char *progname = "slapauth"; - Connection conn; - Operation op; + Connection conn = {0}; + Operation op = {0}; + Opheader ohdr = {0}; slap_tool_init( progname, SLAPAUTH, argc, argv ); argv = &argv[ optind ]; argc -= optind; - memset( &conn, 0, sizeof( Connection ) ); - memset( &op, 0, sizeof( Operation ) ); - - connection_fake_init( &conn, &op, &conn ); + connection_fake_init( &conn, &op, &ohdr, &conn ); if ( !BER_BVISNULL( &authzID ) ) { struct berval authzdn; diff --git a/servers/slapd/syncrepl.c b/servers/slapd/syncrepl.c index f5d028d1f4..d9f01d29de 100644 --- a/servers/slapd/syncrepl.c +++ b/servers/slapd/syncrepl.c @@ -890,6 +890,7 @@ do_syncrepl( syncinfo_t *si = ( syncinfo_t * ) rtask->arg; Connection conn = {0}; Operation op = {0}; + Opheader ohdr = {0}; int rc = LDAP_SUCCESS; int first = 0; int dostop = 0; @@ -918,7 +919,7 @@ do_syncrepl( return NULL; } - connection_fake_init( &conn, &op, ctx ); + connection_fake_init( &conn, &op, &ohdr, ctx ); /* use global malloc for now */ op.o_tmpmemctx = NULL;