tdb: add -e option to tdbdump (and docment it).
authorRusty Russell <rusty@rustcorp.com.au>
Wed, 3 Oct 2012 23:34:23 +0000 (09:04 +0930)
committerRusty Russell <rusty@rustcorp.com.au>
Thu, 4 Oct 2012 01:16:06 +0000 (03:16 +0200)
This allows for an emergency best-effort dump.  It's a little better than
strings(1).

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Autobuild-User(master): Rusty Russell <rusty@rustcorp.com.au>
Autobuild-Date(master): Thu Oct  4 03:16:06 CEST 2012 on sn-devel-104

lib/tdb/manpages/tdbdump.8.xml
lib/tdb/tools/tdbdump.c

index 90465e53e87e77320dda27ca2465e47fbc04ab4f..34201932434c3c0dad9cf83b7b8fcaffbc483ed8 100644 (file)
@@ -19,6 +19,9 @@
 <refsynopsisdiv>
        <cmdsynopsis>
                <command>tdbdump</command>
+               <arg choice="opt">-k <replaceable>keyname</replaceable></arg>
+               <arg choice="opt">-e</arg>
+               <arg choice="opt">-h</arg>
                <arg choice="req">filename</arg>
        </cmdsynopsis>
 </refsynopsisdiv>
        </para>
 </refsect1>
 
+<refsect1>
+       <title>OPTIONS</title>
+
+       <variablelist>
+
+               <varlistentry>
+               <term>-h</term>
+               <listitem><para>
+               Get help information.
+               </para></listitem>
+               </varlistentry>
+
+               <varlistentry>
+               <term>-k <replaceable>keyname</replaceable></term>
+               <listitem><para>
+               The <command>-k</command> option restricts dumping to a single key, if found.
+               </para> </listitem>
+               </varlistentry>
+
+               <varlistentry>
+               <term>-e</term>
+               <listitem><para>
+               The <command>-e</command> tries to dump out from a corrupt database.  Naturally, such a dump is unreliable, at best.
+               </para></listitem>
+               </varlistentry>
+
+       </variablelist>
+</refsect1>
 
 <refsect1>
        <title>VERSION</title>
index bb11200ec4a305f2d9dcd669575e3bb5940cd0d4..bcd395fd5afe0633f12308a6bdca17d054050356 100644 (file)
@@ -86,7 +86,18 @@ static void log_stderr(struct tdb_context *tdb, enum tdb_debug_level level,
        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;
@@ -98,6 +109,9 @@ static int dump_tdb(const char *fname, const char *keyname)
                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 {
@@ -120,11 +134,13 @@ 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");
+       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) {
@@ -132,7 +148,7 @@ static void usage( void)
                exit(1);
        }
 
-       while ((c = getopt( argc, argv, "hk:")) != -1) {
+       while ((c = getopt( argc, argv, "hk:e")) != -1) {
                switch (c) {
                case 'h':
                        usage();
@@ -140,6 +156,9 @@ static void usage( void)
                case 'k':
                        keyname = optarg;
                        break;
+               case 'e':
+                       emergency = true;
+                       break;
                default:
                        usage();
                        exit( 1);
@@ -148,5 +167,5 @@ static void usage( void)
 
        fname = argv[optind];
 
-       return dump_tdb(fname, keyname);
+       return dump_tdb(fname, keyname, emergency);
 }