Trap signals

Try to exit cleanly to avoid leaving stale readers. Not
a critical issue since mdb_reader_check can take care of
them, but still cleaner.
incre
Howard Chu 11 years ago
parent 277526d0f0
commit c73f087750
  1. 23
      libraries/liblmdb/mdb_dump.c

@ -17,6 +17,7 @@
#include <string.h> #include <string.h>
#include <ctype.h> #include <ctype.h>
#include <unistd.h> #include <unistd.h>
#include <signal.h>
#include "lmdb.h" #include "lmdb.h"
#define PRINT 1 #define PRINT 1
@ -37,6 +38,13 @@ flagbit dbflags[] = {
{ 0, NULL } { 0, NULL }
}; };
static volatile sig_atomic_t gotsig;
static void dumpsig( int sig )
{
gotsig=1;
}
static const char hexc[] = "0123456789abcdef"; static const char hexc[] = "0123456789abcdef";
static void hex(unsigned char c) static void hex(unsigned char c)
@ -112,6 +120,10 @@ static int dumpit(MDB_txn *txn, MDB_dbi dbi, char *name)
if (rc) return rc; if (rc) return rc;
while ((rc = mdb_cursor_get(mc, &key, &data, MDB_NEXT) == MDB_SUCCESS)) { while ((rc = mdb_cursor_get(mc, &key, &data, MDB_NEXT) == MDB_SUCCESS)) {
if (gotsig) {
rc = EINTR;
break;
}
if (mode & PRINT) { if (mode & PRINT) {
text(&key); text(&key);
text(&data); text(&data);
@ -196,6 +208,15 @@ int main(int argc, char *argv[])
if (optind != argc - 1) if (optind != argc - 1)
usage(prog); usage(prog);
#ifdef SIGPIPE
signal(SIGPIPE, dumpsig);
#endif
#ifdef SIGHUP
signal(SIGHUP, dumpsig);
#endif
signal(SIGINT, dumpsig);
signal(SIGTERM, dumpsig);
envname = argv[optind]; envname = argv[optind];
rc = mdb_env_create(&env); rc = mdb_env_create(&env);
@ -247,6 +268,8 @@ int main(int argc, char *argv[])
list++; list++;
} else { } else {
rc = dumpit(txn, db2, str); rc = dumpit(txn, db2, str);
if (rc)
break;
} }
mdb_close(env, db2); mdb_close(env, db2);
} }

Loading…
Cancel
Save