From ddfe1ece80e6bda6487ad06c4da66203031d5fb4 Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Thu, 18 Aug 2011 21:46:52 -0700 Subject: [PATCH] slapcat partially working --- servers/slapd/back-mdb/dn2id.c | 52 ++++++++++++++++++++++++++++++- servers/slapd/back-mdb/id2entry.c | 5 +++ servers/slapd/back-mdb/tools.c | 6 ++++ 3 files changed, 62 insertions(+), 1 deletion(-) diff --git a/servers/slapd/back-mdb/dn2id.c b/servers/slapd/back-mdb/dn2id.c index b18ab47a45..29445d72ae 100644 --- a/servers/slapd/back-mdb/dn2id.c +++ b/servers/slapd/back-mdb/dn2id.c @@ -448,7 +448,57 @@ mdb_id2name( struct berval *name, struct berval *nname ) { - return 0; + struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private; + MDB_dbi dbi = mdb->mi_dn2id->mdi_dbi; + MDB_val key, data; + MDB_cursor *cursor; + int rc, len, nlen; + char dn[SLAP_LDAPDN_MAXLEN], ndn[SLAP_LDAPDN_MAXLEN], *ptr; + char *dptr, *nptr; + diskNode *d; + + key.mv_size = sizeof(ID); + + rc = mdb_cursor_open( txn, dbi, &cursor ); + if ( rc ) return rc; + + len = 0; + nlen = 0; + dptr = dn; + nptr = ndn; + while (id) { + int nrlen, rlen; + key.mv_data = &id; + rc = mdb_cursor_get( cursor, &key, &data, MDB_SET ); + if ( rc ) break; + ptr = data.mv_data; + ptr += data.mv_size - sizeof(ID); + memcpy( &id, ptr, sizeof(ID) ); + d = data.mv_data; + nrlen = (d->nrdnlen[0] << 8) | d->nrdnlen[1]; + if (nptr > ndn) { + *nptr++ = ','; + *dptr++ = ','; + } + /* copy name and trailing NUL */ + memcpy( nptr, d->nrdn, nrlen+1 ); + rlen = data.mv_size - sizeof(diskNode) - nrlen; + memcpy( dptr, d->nrdn+nrlen+1, rlen+1 ); + nptr += nrlen; + dptr += rlen; + } + if ( rc == 0 ) { + name->bv_len = dptr - dn; + nname->bv_len = nptr - ndn; + name->bv_val = op->o_tmpalloc( name->bv_len + 1, op->o_tmpmemctx ); + nname->bv_val = op->o_tmpalloc( nname->bv_len + 1, op->o_tmpmemctx ); + memcpy( name->bv_val, dn, name->bv_len ); + name->bv_val[name->bv_len] = '\0'; + memcpy( nname->bv_val, ndn, nname->bv_len ); + nname->bv_val[nname->bv_len] = '\0'; + } + mdb_cursor_close( cursor ); + return rc; } #if 0 diff --git a/servers/slapd/back-mdb/id2entry.c b/servers/slapd/back-mdb/id2entry.c index 1a028f39de..2b2e377fe7 100644 --- a/servers/slapd/back-mdb/id2entry.c +++ b/servers/slapd/back-mdb/id2entry.c @@ -109,10 +109,15 @@ int mdb_id2entry( rc = entry_header( &eh ); if ( rc ) return rc; + eh.bv.bv_len = eh.nvals * sizeof( struct berval ); + eh.bv.bv_val = ch_malloc( eh.bv.bv_len ); rc = entry_decode(&eh, e); if( rc == 0 ) { (*e)->e_id = id; + (*e)->e_bv = eh.bv; + } else { + ch_free( eh.bv.bv_val ); } return rc; diff --git a/servers/slapd/back-mdb/tools.c b/servers/slapd/back-mdb/tools.c index 1d8a19379e..cae1555db7 100644 --- a/servers/slapd/back-mdb/tools.c +++ b/servers/slapd/back-mdb/tools.c @@ -194,6 +194,7 @@ next:; } previd = *(ID *)key.mv_data; + id = previd; if ( tool_filter || tool_base ) { static Operation op = {0}; @@ -270,6 +271,8 @@ mdb_tool_entry_get_int( BackendDB *be, ID id, Entry **ep ) } if ( id != previd ) { + key.mv_size = sizeof(ID); + key.mv_data = &id; rc = mdb_cursor_get( cursor, &key, &data, MDB_SET ); if ( rc ) { rc = LDAP_OTHER; @@ -311,12 +314,15 @@ mdb_tool_entry_get_int( BackendDB *be, ID id, Entry **ep ) rc = LDAP_OTHER; goto done; } + eh.bv.bv_len = eh.nvals * sizeof( struct berval ); + eh.bv.bv_val = ch_malloc( eh.bv.bv_len ); rc = entry_decode( &eh, &e ); e->e_id = id; if ( !BER_BVISNULL( &dn )) { e->e_name = dn; e->e_nname = ndn; } + e->e_bv = eh.bv; done: if ( e != NULL ) { -- 2.47.2