]> git.sur5r.net Git - openldap/blobdiff - libraries/liblmdb/mdb_dump.c
Silence some clang warnings
[openldap] / libraries / liblmdb / mdb_dump.c
index 5242519ebc82d074ce2359998eca03a77cdbf748..0eb85fd20e676c38f09cbc5ef706bea2730ad961 100644 (file)
 #include <string.h>
 #include <ctype.h>
 #include <unistd.h>
+#include <signal.h>
 #include "lmdb.h"
 
+#ifdef _WIN32
+#define Z      "I"
+#else
+#define Z      "z"
+#endif
+
 #define PRINT  1
 static int mode;
 
@@ -37,6 +44,13 @@ flagbit dbflags[] = {
        { 0, NULL }
 };
 
+static volatile sig_atomic_t gotsig;
+
+static void dumpsig( int sig )
+{
+       gotsig=1;
+}
+
 static const char hexc[] = "0123456789abcdef";
 
 static void hex(unsigned char c)
@@ -83,6 +97,7 @@ static int dumpit(MDB_txn *txn, MDB_dbi dbi, char *name)
        MDB_cursor *mc;
        MDB_stat ms;
        MDB_val key, data;
+       MDB_envinfo info;
        unsigned int flags;
        int rc, i;
 
@@ -92,11 +107,18 @@ static int dumpit(MDB_txn *txn, MDB_dbi dbi, char *name)
        rc = mdb_stat(txn, dbi, &ms);
        if (rc) return rc;
 
+       rc = mdb_env_info(mdb_txn_env(txn), &info);
+       if (rc) return rc;
+
        printf("VERSION=3\n");
        printf("format=%s\n", mode & PRINT ? "print" : "bytevalue");
        if (name)
                printf("database=%s\n", name);
        printf("type=btree\n");
+       printf("mapsize=%" Z "u\n", info.me_mapsize);
+       if (info.me_mapaddr)
+               printf("mapaddr=%p\n", info.me_mapaddr);
+       printf("maxreaders=%u\n", info.me_maxreaders);
 
        if (flags & MDB_DUPSORT)
                printf("duplicates=1\n");
@@ -112,6 +134,10 @@ static int dumpit(MDB_txn *txn, MDB_dbi dbi, char *name)
        if (rc) return rc;
 
        while ((rc = mdb_cursor_get(mc, &key, &data, MDB_NEXT) == MDB_SUCCESS)) {
+               if (gotsig) {
+                       rc = EINTR;
+                       break;
+               }
                if (mode & PRINT) {
                        text(&key);
                        text(&data);
@@ -196,8 +222,21 @@ int main(int argc, char *argv[])
        if (optind != argc - 1)
                usage(prog);
 
+#ifdef SIGPIPE
+       signal(SIGPIPE, dumpsig);
+#endif
+#ifdef SIGHUP
+       signal(SIGHUP, dumpsig);
+#endif
+       signal(SIGINT, dumpsig);
+       signal(SIGTERM, dumpsig);
+
        envname = argv[optind];
        rc = mdb_env_create(&env);
+       if (rc) {
+               fprintf(stderr, "mdb_env_create failed, error %d %s\n", rc, mdb_strerror(rc));
+               return EXIT_FAILURE;
+       }
 
        if (alldbs || subname) {
                mdb_env_set_maxdbs(env, 2);
@@ -205,19 +244,19 @@ int main(int argc, char *argv[])
 
        rc = mdb_env_open(env, envname, envflags | MDB_RDONLY, 0664);
        if (rc) {
-               printf("mdb_env_open failed, error %d %s\n", rc, mdb_strerror(rc));
+               fprintf(stderr, "mdb_env_open failed, error %d %s\n", rc, mdb_strerror(rc));
                goto env_close;
        }
 
        rc = mdb_txn_begin(env, NULL, MDB_RDONLY, &txn);
        if (rc) {
-               printf("mdb_txn_begin failed, error %d %s\n", rc, mdb_strerror(rc));
+               fprintf(stderr, "mdb_txn_begin failed, error %d %s\n", rc, mdb_strerror(rc));
                goto env_close;
        }
 
        rc = mdb_open(txn, subname, 0, &dbi);
        if (rc) {
-               printf("mdb_open failed, error %d %s\n", rc, mdb_strerror(rc));
+               fprintf(stderr, "mdb_open failed, error %d %s\n", rc, mdb_strerror(rc));
                goto txn_abort;
        }
 
@@ -228,7 +267,7 @@ int main(int argc, char *argv[])
 
                rc = mdb_cursor_open(txn, dbi, &cursor);
                if (rc) {
-                       printf("mdb_cursor_open failed, error %d %s\n", rc, mdb_strerror(rc));
+                       fprintf(stderr, "mdb_cursor_open failed, error %d %s\n", rc, mdb_strerror(rc));
                        goto txn_abort;
                }
                while ((rc = mdb_cursor_get(cursor, &key, NULL, MDB_NEXT_NODUP)) == 0) {
@@ -247,6 +286,8 @@ int main(int argc, char *argv[])
                                        list++;
                                } else {
                                        rc = dumpit(txn, db2, str);
+                                       if (rc)
+                                               break;
                                }
                                mdb_close(env, db2);
                        }