diff options
-rw-r--r-- | source3/tdb/tdbdump.c | 46 |
1 files changed, 41 insertions, 5 deletions
diff --git a/source3/tdb/tdbdump.c b/source3/tdb/tdbdump.c index 6cac0bc5cc..b702fb0735 100644 --- a/source3/tdb/tdbdump.c +++ b/source3/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); } |