From 5c16c8842b8a41229f2256cdeb3ed1ce9bd4ad50 Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Wed, 28 Mar 2012 09:20:18 -0700 Subject: [PATCH] Add mfree utility to show the freelist --- libraries/libmdb/Makefile | 1 + libraries/libmdb/mfree.c | 56 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 libraries/libmdb/mfree.c diff --git a/libraries/libmdb/Makefile b/libraries/libmdb/Makefile index 88297078e1..1fde58889c 100644 --- a/libraries/libmdb/Makefile +++ b/libraries/libmdb/Makefile @@ -28,6 +28,7 @@ mtest3: mtest3.o libmdb.a mtest4: mtest4.o libmdb.a mtest5: mtest5.o libmdb.a mtest6: mtest6.o libmdb.a +mfree: mfree.o libmdb.a mdb.o: mdb.c mdb.h midl.h $(CC) $(CFLAGS) -fPIC $(CPPFLAGS) -c mdb.c diff --git a/libraries/libmdb/mfree.c b/libraries/libmdb/mfree.c new file mode 100644 index 0000000000..0833b22f47 --- /dev/null +++ b/libraries/libmdb/mfree.c @@ -0,0 +1,56 @@ +/* mfree.c - memory-mapped database freelist scanner */ +/* + * Copyright 2011 Howard Chu, Symas Corp. + * 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 + * . + */ +#define _XOPEN_SOURCE 500 /* srandom(), random() */ +#include +#include +#include +#include "mdb.h" +#include "midl.h" + +int main(int argc,char * argv[]) +{ + int rc; + MDB_env *env; + MDB_dbi dbi; + MDB_val key, data; + MDB_txn *txn; + MDB_stat mst; + MDB_cursor *cursor; + ID i, j, *iptr; + + if (argc != 2) { + fprintf(stderr, "usage: %s \n", argv[0]); + exit(1); + } + + rc = mdb_env_create(&env); + rc = mdb_env_open(env, argv[1], MDB_RDONLY, 0664); + rc = mdb_txn_begin(env, NULL, MDB_RDONLY, &txn); + dbi = 0; + rc = mdb_cursor_open(txn, dbi, &cursor); + while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) { + printf("key: %p %zu, data: %p\n", + key.mv_data, *(ID *) key.mv_data, + data.mv_data); + iptr = data.mv_data; + j = *iptr++; + for (i=0; i