]> the.earth.li Git - onak.git/blobdiff - keydb_db4.c
Check for sd_listen_fds in libsystemd as well as libsystemd-daemon
[onak.git] / keydb_db4.c
index 3e4a039e1cc0058a5512ecf17a37654fdbab4335..b2d34c5360018d1ff88dca9dd83bba92a2c0d218 100644 (file)
@@ -169,6 +169,7 @@ static int db4_upgradedb(struct onak_db4_dbctx *privctx)
        char buf[1024];
        int lockfile_fd;
        struct stat statbuf;
+       ssize_t written;
 
        snprintf(buf, sizeof(buf) - 1, "%s/%s", config.db_dir,
                        DB4_UPGRADE_FILE);
@@ -184,8 +185,16 @@ static int db4_upgradedb(struct onak_db4_dbctx *privctx)
                }
        }
        snprintf(buf, sizeof(buf) - 1, "%d", getpid());
-       write(lockfile_fd, buf, strlen(buf));
+       written = write(lockfile_fd, buf, strlen(buf));
        close(lockfile_fd);
+       if (written != strlen(buf)) {
+               logthing(LOGTHING_CRITICAL, "Couldn't write PID to lockfile: "
+                               "%s", strerror(errno));
+               snprintf(buf, sizeof(buf) - 1, "%s/%s", config.db_dir,
+                               DB4_UPGRADE_FILE);
+               unlink(buf);
+               return -1;
+       }
 
        logthing(LOGTHING_NOTICE, "Upgrading DB4 database");
        ret = db_env_create(&privctx->dbenv, 0);
@@ -772,7 +781,9 @@ static int db4_delete_key(struct onak_dbctx *dbctx,
        }
 
        if (db4_fetch_key_id(dbctx, keyid, &publickey, true) == 0) {
-               db4_endtrans(dbctx);
+               if (!intrans) {
+                       db4_endtrans(dbctx);
+               }
                return 1;
        }
 
@@ -826,7 +837,7 @@ static int db4_delete_key(struct onak_dbctx *dbctx,
                                DB_GET_BOTH);
 
                        if (ret == 0) {
-                               ret = cursor->c_del(cursor, 0);
+                               cursor->c_del(cursor, 0);
                        }
 
                        /* New style just uses the fingerprint as the data */
@@ -898,7 +909,7 @@ static int db4_delete_key(struct onak_dbctx *dbctx,
                        DB_GET_BOTH);
 
                if (ret == 0) {
-                       ret = cursor->c_del(cursor, 0);
+                       cursor->c_del(cursor, 0);
                }
 
                /* New style mapping to fingerprint */
@@ -993,7 +1004,7 @@ static int db4_delete_key(struct onak_dbctx *dbctx,
                                DB_GET_BOTH);
 
                        if (ret == 0) {
-                               ret = cursor->c_del(cursor, 0);
+                               cursor->c_del(cursor, 0);
                        }
 
                        /* Remove 32 bit keyid -> fingerprint mapping */
@@ -1085,7 +1096,7 @@ static int db4_delete_key(struct onak_dbctx *dbctx,
                                DB_GET_BOTH);
 
                        if (ret == 0) {
-                               ret = cursor->c_del(cursor, 0);
+                               cursor->c_del(cursor, 0);
                        }
 
                        /* Then delete new style fingerprint mapping */
@@ -1124,6 +1135,16 @@ static int db4_delete_key(struct onak_dbctx *dbctx,
        publickey = NULL;
 
        if (!deadlock) {
+               key.data = fingerprint.fp;
+               key.size = fingerprint.length;
+
+               keydb_fp(privctx, &fingerprint)->del(keydb_fp(privctx,
+                                       &fingerprint),
+                               privctx->txn,
+                               &key,
+                               0); /* flags */
+
+               /* Delete old style 64 bit keyid */
                key.data = &keyid;
                key.size = sizeof(keyid);
 
@@ -1685,12 +1706,14 @@ struct onak_dbctx *keydb_db4_init(bool readonly)
         * Up the number of locks we're allowed at once. We base this on
         * the maximum number of keys we're going to return.
         */
-       maxlocks = config.maxkeys * 16;
-       if (maxlocks < 1000) {
-               maxlocks = 1000;
+       if (ret == 0) {
+               maxlocks = config.maxkeys * 16;
+               if (maxlocks < 1000) {
+                       maxlocks = 1000;
+               }
+               privctx->dbenv->set_lk_max_locks(privctx->dbenv, maxlocks);
+               privctx->dbenv->set_lk_max_objects(privctx->dbenv, maxlocks);
        }
-       privctx->dbenv->set_lk_max_locks(privctx->dbenv, maxlocks);
-       privctx->dbenv->set_lk_max_objects(privctx->dbenv, maxlocks);
 
        /*
         * Enable deadlock detection so that we don't block indefinitely on