summaryrefslogtreecommitdiff
path: root/source/tdb/tdbdump.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/tdb/tdbdump.c')
-rw-r--r--source/tdb/tdbdump.c46
1 files changed, 41 insertions, 5 deletions
diff --git a/source/tdb/tdbdump.c b/source/tdb/tdbdump.c
index 6cac0bc5ccd..b702fb07355 100644
--- a/source/tdb/tdbdump.c
+++ b/source/tdb/tdbdump.c
@@ -59,9 +59,10 @@ static int traverse_fn(TDB_CONTEXT *tdb, TDB_DATA key, TDB_DATA dbuf, void *stat
return 0;
}
-static int dump_tdb(const char *fname)
+static int dump_tdb(const char *fname, const char *keyname)
{
TDB_CONTEXT *tdb;
+ TDB_DATA key, value;
tdb = tdb_open(fname, 0, 0, O_RDONLY, 0);
if (!tdb) {
@@ -69,20 +70,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 = (char *)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);
}