]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/overlays/accesslog.c
Improved bignum detection/use
[openldap] / servers / slapd / overlays / accesslog.c
index a6470e57a49efc56e324847f86fe3eacbdc69745..bd61096dbbb9f8e01c5e267438b588eca0bc0c43 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2005 The OpenLDAP Foundation.
+ * Copyright 2005-2006 The OpenLDAP Foundation.
  * Portions copyright 2004-2005 Symas Corporation.
  * All rights reserved.
  *
@@ -237,14 +237,14 @@ static struct {
                "SINGLE-VALUE )", &ad_reqAssertion },
        { "( " LOG_SCHEMA_AT ".16 NAME 'reqMod' "
                "DESC 'Modifications of request' "
-               "SYNTAX OMsDirectoryString "
-               "EQUALITY caseIgnoreMatch "
-               "SUBSTR caseIgnoreSubstringsMatch )", &ad_reqMod },
+               "EQUALITY octetStringMatch "
+               "SUBSTR octetStringSubstringsMatch "
+               "SYNTAX OMsOctetString )", &ad_reqMod },
        { "( " LOG_SCHEMA_AT ".17 NAME 'reqOld' "
                "DESC 'Old values of entry before request completed' "
-               "EQUALITY caseIgnoreMatch "
-               "SUBSTR caseIgnoreSubstringsMatch "
-               "SYNTAX OMsDirectoryString )", &ad_reqOld },
+               "EQUALITY octetStringMatch "
+               "SUBSTR octetStringSubstringsMatch "
+               "SYNTAX OMsOctetString )", &ad_reqOld },
        { "( " LOG_SCHEMA_AT ".18 NAME 'reqNewRDN' "
                "DESC 'New RDN of request' "
                "EQUALITY distinguishedNameMatch "
@@ -990,7 +990,9 @@ static int accesslog_response(Operation *op, SlapReply *rs) {
 
                bv.bv_len = sprintf( bv.bv_val, "%d", op->ors_tlimit );
                attr_merge_one( e, ad_reqTimeLimit, &bv, NULL );
-               /* FIXME: slimit was zeroed by the backends */
+
+               bv.bv_len = sprintf( bv.bv_val, "%d", op->ors_slimit );
+               attr_merge_one( e, ad_reqSizeLimit, &bv, NULL );
                break;
 
        case LOG_EN_BIND:
@@ -1110,7 +1112,7 @@ accesslog_unbind( Operation *op, SlapReply *rs )
        slap_overinst *on = (slap_overinst *)op->o_bd->bd_info;
        if ( op->o_conn->c_authz_backend == on->on_info->oi_origdb ) {
                log_info *li = on->on_bi.bi_private;
-               Operation op2;
+               Operation op2 = {0};
                void *cids[SLAP_MAX_CIDS];
                SlapReply rs2 = {REP_RESULT};
                Entry *e;
@@ -1130,7 +1132,6 @@ accesslog_unbind( Operation *op, SlapReply *rs )
                op2.o_callback = &nullsc;
                op2.o_controls = cids;
                memset(cids, 0, sizeof( cids ));
-               memset(op2.o_ctrlflag, 0, sizeof( op2.o_ctrlflag ));
 
                op2.o_bd->be_add( &op2, &rs2 );
                entry_free( e );
@@ -1143,7 +1144,7 @@ accesslog_abandon( Operation *op, SlapReply *rs )
 {
        slap_overinst *on = (slap_overinst *)op->o_bd->bd_info;
        log_info *li = on->on_bi.bi_private;
-       Operation op2;
+       Operation op2 = {0};
        void *cids[SLAP_MAX_CIDS];
        SlapReply rs2 = {REP_RESULT};
        Entry *e;
@@ -1169,7 +1170,6 @@ accesslog_abandon( Operation *op, SlapReply *rs )
        op2.o_callback = &nullsc;
        op2.o_controls = cids;
        memset(cids, 0, sizeof( cids ));
-       memset(op2.o_ctrlflag, 0, sizeof( op2.o_ctrlflag ));
 
        op2.o_bd->be_add( &op2, &rs2 );
        entry_free( e );
@@ -1200,20 +1200,115 @@ accesslog_db_destroy(
 {
        slap_overinst *on = (slap_overinst *)be->bd_info;
        log_info *li = on->on_bi.bi_private;
-       
+
        ldap_pvt_thread_mutex_destroy( &li->li_log_mutex );
        ldap_pvt_thread_mutex_destroy( &li->li_op_mutex );
        free( li );
        return LDAP_SUCCESS;
 }
 
-int accesslog_init()
+static int
+accesslog_db_open(
+       BackendDB *be
+)
+{
+       slap_overinst *on = (slap_overinst *)be->bd_info;
+       log_info *li = on->on_bi.bi_private;
+
+       Connection conn;
+       OperationBuffer opbuf;
+       Operation *op = (Operation *) &opbuf;
+       Entry *e;
+       int rc;
+       void *thrctx;
+
+       if ( slapMode & SLAP_TOOL_MODE )
+               return 0;
+
+       thrctx = ldap_pvt_thread_pool_context();
+       connection_fake_init( &conn, op, thrctx );
+       op->o_bd = li->li_db;
+       op->o_dn = li->li_db->be_rootdn;
+       op->o_ndn = li->li_db->be_rootndn;
+
+       rc = be_entry_get_rw( op, li->li_db->be_nsuffix, NULL, NULL, 0, &e );
+
+       if ( e ) {
+               be_entry_release_rw( op, e, 0 );
+       } else {
+               SlapReply rs = {REP_RESULT};
+               struct berval rdn, nrdn, attr;
+               char *ptr;
+               AttributeDescription *ad = NULL;
+               const char *text = NULL;
+               Entry *e_ctx;
+
+               e = ch_calloc( 1, sizeof( Entry ));
+               e->e_name = *li->li_db->be_suffix;
+               e->e_nname = *li->li_db->be_nsuffix;
+
+               attr_merge_one( e, slap_schema.si_ad_objectClass,
+                       &log_container->soc_cname, NULL );
+
+               dnRdn( &e->e_name, &rdn );
+               dnRdn( &e->e_nname, &nrdn );
+               ptr = ber_bvchr( &rdn, '=' );
+
+               assert( ptr != NULL );
+
+               attr.bv_val = rdn.bv_val;
+               attr.bv_len = ptr - rdn.bv_val;
+
+               slap_bv2ad( &attr, &ad, &text );
+
+               rdn.bv_val = ptr+1;
+               rdn.bv_len -= attr.bv_len + 1;
+               ptr = ber_bvchr( &nrdn, '=' );
+               nrdn.bv_len -= ptr - nrdn.bv_val + 1;
+               nrdn.bv_val = ptr+1;
+               attr_merge_one( e, ad, &rdn, &nrdn );
+
+               /* Get contextCSN from main DB */
+               op->o_bd = be;
+               op->o_bd->bd_info = on->on_info->oi_orig;
+               rc = be_entry_get_rw( op, be->be_nsuffix, NULL,
+                       slap_schema.si_ad_contextCSN, 0, &e_ctx );
+
+               if ( e_ctx ) {
+                       Attribute *a;
+
+                       a = attr_find( e_ctx->e_attrs, slap_schema.si_ad_contextCSN );
+                       if ( a ) {
+                               attr_merge( e, slap_schema.si_ad_entryCSN, a->a_vals, NULL );
+                               attr_merge( e, a->a_desc, a->a_vals, NULL );
+                       }
+                       be_entry_release_rw( op, e_ctx, 0 );
+               }
+               op->o_bd->bd_info = (BackendInfo *)on;
+               op->o_bd = li->li_db;
+
+               op->ora_e = e;
+               op->o_req_dn = e->e_name;
+               op->o_req_ndn = e->e_nname;
+               op->o_callback = &nullsc;
+               SLAP_DBFLAGS( op->o_bd ) |= SLAP_DBFLAG_NOLASTMOD;
+               rc = op->o_bd->be_add( op, &rs );
+               SLAP_DBFLAGS( op->o_bd ) ^= SLAP_DBFLAG_NOLASTMOD;
+               attrs_free( e->e_attrs );
+               ch_free( e );
+       }
+       ldap_pvt_thread_pool_context_reset( thrctx );
+       return rc;
+}
+
+int accesslog_initialize()
 {
        int i, rc;
 
        accesslog.on_bi.bi_type = "accesslog";
        accesslog.on_bi.bi_db_init = accesslog_db_init;
        accesslog.on_bi.bi_db_destroy = accesslog_db_destroy;
+       accesslog.on_bi.bi_db_open = accesslog_db_open;
 
        accesslog.on_bi.bi_op_add = accesslog_op_mod;
        accesslog.on_bi.bi_op_bind = accesslog_op_bind;
@@ -1292,8 +1387,10 @@ int accesslog_init()
 }
 
 #if SLAPD_OVER_ACCESSLOG == SLAPD_MOD_DYNAMIC
-int init_module( int argc, char *argv[]) {
-       return accesslog_init();
+int
+init_module( int argc, char *argv[] )
+{
+       return accesslog_initialize();
 }
 #endif