From: Richard Kettlewell Date: Sat, 30 Jul 2011 20:11:40 +0000 (+0100) Subject: Do not fatal-error when deleting a global pref that does not exist. X-Git-Tag: branchpoint-5.1~37^2~6 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/commitdiff_plain/3f3cd4c942b8a5f15306ac8ca0d9cfcd4e9391b7 Do not fatal-error when deleting a global pref that does not exist. --- diff --git a/lib/trackdb.c b/lib/trackdb.c index ddf11af..4afd925 100644 --- a/lib/trackdb.c +++ b/lib/trackdb.c @@ -2736,16 +2736,18 @@ int trackdb_rescan_underway(void) { * @param name Global preference name * @param value New value * @param who Who is setting it + * @return 0 on success, -1 on error */ -void trackdb_set_global(const char *name, +int trackdb_set_global(const char *name, const char *value, const char *who) { DB_TXN *tid; - int state; + int state, err; for(;;) { tid = trackdb_begin_transaction(); - if(!trackdb_set_global_tid(name, value, tid)) + err = trackdb_set_global_tid(name, value, tid); + if(err != DB_LOCK_DEADLOCK) break; trackdb_abort_transaction(tid); } @@ -2766,6 +2768,7 @@ void trackdb_set_global(const char *name, eventlog("state", state ? "enable_random" : "disable_random", (char *)0); } eventlog("global_pref", name, value, (char *)0); + return err == 0 ? 0 : -1; } /** @brief Set a global preference @@ -2791,7 +2794,7 @@ int trackdb_set_global_tid(const char *name, err = trackdb_globaldb->put(trackdb_globaldb, tid, &k, &d, 0); else err = trackdb_globaldb->del(trackdb_globaldb, tid, &k, 0); - if(err == DB_LOCK_DEADLOCK) return err; + if(err == DB_LOCK_DEADLOCK || err == DB_NOTFOUND) return err; if(err) disorder_fatal(0, "error updating database: %s", db_strerror(err)); return 0; diff --git a/lib/trackdb.h b/lib/trackdb.h index 1d7c8e9..a37c81b 100644 --- a/lib/trackdb.h +++ b/lib/trackdb.h @@ -148,9 +148,9 @@ int trackdb_rescan_cancel(void); void trackdb_gc(void); /* tidy up old database log files */ -void trackdb_set_global(const char *name, - const char *value, - const char *who); +int trackdb_set_global(const char *name, + const char *value, + const char *who); /* set a global pref (remove if value=0). */ const char *trackdb_get_global(const char *name); diff --git a/server/server.c b/server/server.c index 4dafabb..d8a84ea 100644 --- a/server/server.c +++ b/server/server.c @@ -1150,8 +1150,10 @@ static int c_set_global(struct conn *c, sink_writes(ev_writer_sink(c->w), "550 cannot set internal global preferences\n"); return 1; } - trackdb_set_global(vec[0], vec[1], c->who); - sink_printf(ev_writer_sink(c->w), "250 OK\n"); + if(trackdb_set_global(vec[0], vec[1], c->who)) + sink_printf(ev_writer_sink(c->w), "250 OK\n"); + else + sink_writes(ev_writer_sink(c->w), "550 not found\n"); return 1; }