va_end(ap);
}
-static int dump_tdb(const char *fname, const char *keyname)
+static void emergency_walk(TDB_DATA key, TDB_DATA dbuf, void *keyname)
+{
+ if (keyname) {
+ if (key.dsize != strlen(keyname))
+ return;
+ if (memcmp(key.dptr, keyname, key.dsize) != 0)
+ return;
+ }
+ traverse_fn(NULL, key, dbuf, NULL);
+}
+
+static int dump_tdb(const char *fname, const char *keyname, bool emergency)
{
TDB_CONTEXT *tdb;
TDB_DATA key, value;
return 1;
}
+ if (emergency) {
+ return tdb_rescue(tdb, emergency_walk, keyname) == 0;
+ }
if (!keyname) {
return tdb_traverse(tdb, traverse_fn, NULL) == -1 ? 1 : 0;
} else {
printf( "Usage: tdbdump [options] <filename>\n\n");
printf( " -h this help message\n");
printf( " -k keyname dumps value of keyname\n");
+ printf( " -e emergency dump, for corrupt databases\n");
}
int main(int argc, char *argv[])
{
char *fname, *keyname=NULL;
+ bool emergency = false;
int c;
if (argc < 2) {
exit(1);
}
- while ((c = getopt( argc, argv, "hk:")) != -1) {
+ while ((c = getopt( argc, argv, "hk:e")) != -1) {
switch (c) {
case 'h':
usage();
case 'k':
keyname = optarg;
break;
+ case 'e':
+ emergency = true;
+ break;
default:
usage();
exit( 1);
fname = argv[optind];
- return dump_tdb(fname, keyname);
+ return dump_tdb(fname, keyname, emergency);
}