From c73f0877500c01d978a4e8b1d50bd64011f70984 Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Fri, 27 Jun 2014 10:53:11 -0700 Subject: [PATCH] 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. --- libraries/liblmdb/mdb_dump.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/libraries/liblmdb/mdb_dump.c b/libraries/liblmdb/mdb_dump.c index 5242519..c684375 100644 --- a/libraries/liblmdb/mdb_dump.c +++ b/libraries/liblmdb/mdb_dump.c @@ -17,6 +17,7 @@ #include #include #include +#include #include "lmdb.h" #define PRINT 1 @@ -37,6 +38,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) @@ -112,6 +120,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,6 +208,15 @@ 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); @@ -247,6 +268,8 @@ int main(int argc, char *argv[]) list++; } else { rc = dumpit(txn, db2, str); + if (rc) + break; } mdb_close(env, db2); }