summaryrefslogtreecommitdiff
path: root/source4/lib/tdb/tools/tdbdump.c
diff options
context:
space:
mode:
Diffstat (limited to 'source4/lib/tdb/tools/tdbdump.c')
-rw-r--r--source4/lib/tdb/tools/tdbdump.c57
1 files changed, 47 insertions, 10 deletions
diff --git a/source4/lib/tdb/tools/tdbdump.c b/source4/lib/tdb/tools/tdbdump.c
index 9111b739ab..4ceef2d60c 100644
--- a/source4/lib/tdb/tools/tdbdump.c
+++ b/source4/lib/tdb/tools/tdbdump.c
@@ -19,9 +19,10 @@
*/
#include "replace.h"
-#include "tdb.h"
#include "system/locale.h"
+#include "system/time.h"
#include "system/filesys.h"
+#include "tdb.h"
static void print_data(TDB_DATA d)
{
@@ -37,22 +38,23 @@ static void print_data(TDB_DATA d)
}
}
-static int traverse_fn(struct tdb_context *tdb, TDB_DATA key, TDB_DATA dbuf, void *state)
+static int traverse_fn(TDB_CONTEXT *tdb, TDB_DATA key, TDB_DATA dbuf, void *state)
{
printf("{\n");
- printf("key = \"");
+ printf("key(%d) = \"", (int)key.dsize);
print_data(key);
printf("\"\n");
- printf("data = \"");
+ printf("data(%d) = \"", (int)dbuf.dsize);
print_data(dbuf);
printf("\"\n");
printf("}\n");
return 0;
}
-static int dump_tdb(const char *fname)
+static int dump_tdb(const char *fname, const char *keyname)
{
- struct tdb_context *tdb;
+ TDB_CONTEXT *tdb;
+ TDB_DATA key, value;
tdb = tdb_open(fname, 0, 0, O_RDONLY, 0);
if (!tdb) {
@@ -60,20 +62,55 @@ static int dump_tdb(const char *fname)
return 1;
}
- tdb_traverse(tdb, traverse_fn, NULL);
+ if (!keyname) {
+ tdb_traverse(tdb, traverse_fn, NULL);
+ } else {
+ key.dptr = discard_const_p(uint8_t,keyname);
+ key.dsize = strlen( keyname);
+ value = tdb_fetch(tdb, key);
+ if (!value.dptr) {
+ return 1;
+ } else {
+ print_data(value);
+ free(value.dptr);
+ }
+ }
+
return 0;
}
+static void usage( void)
+{
+ printf( "Usage: tdbdump [options] <filename>\n\n");
+ printf( " -h this help message\n");
+ printf( " -k keyname dumps value of keyname\n");
+}
+
int main(int argc, char *argv[])
{
- char *fname;
+ char *fname, *keyname=NULL;
+ int c;
if (argc < 2) {
printf("Usage: tdbdump <fname>\n");
exit(1);
}
- fname = argv[1];
+ while ((c = getopt( argc, argv, "hk:")) != -1) {
+ switch (c) {
+ case 'h':
+ usage();
+ exit( 0);
+ case 'k':
+ keyname = optarg;
+ break;
+ default:
+ usage();
+ exit( 1);
+ }
+ }
+
+ fname = argv[optind];
- return dump_tdb(fname);
+ return dump_tdb(fname, keyname);
}