From f6d1f564b9dd7c1871128e70477e19e4044ff50f Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Tue, 1 Mar 2011 23:19:19 +1030 Subject: [PATCH] tdb2: Internal error helpers. I use the "high pointers hold error numbers" trick, and also make tdb_logerr return the error code, which enables the common case of "return tdb_logerr(...)". --- ccan/tdb2/private.h | 18 ++++++++++++++---- ccan/tdb2/tdb.c | 13 +++++++------ ccan/tdb2/tdb2.h | 3 ++- 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/ccan/tdb2/private.h b/ccan/tdb2/private.h index 3366aea2..ae3ffb2a 100644 --- a/ccan/tdb2/private.h +++ b/ccan/tdb2/private.h @@ -74,6 +74,16 @@ typedef uint64_t tdb_off_t; #define TDB_RECOVERY_INVALID_MAGIC (0x0ULL) #define TDB_OFF_ERR ((tdb_off_t)-1) +#define TDB_OFF_IS_ERR(off) unlikely(off >= (tdb_off_t)TDB_ERR_LAST) + +/* Packing errors into pointers and v.v. */ +#define TDB_PTR_IS_ERR(ptr) \ + unlikely((void *)(ptr) >= (void *)(long)TDB_ERR_LAST) +#define TDB_PTR_ERR(p) ((enum TDB_ERROR)(long)(p)) +#define TDB_ERR_PTR(err) ((void *)(long)(err)) + +/* Common case of returning true, false or -ve error. */ +typedef int tdb_bool_err; /* Prevent others from opening the file. */ #define TDB_OPEN_LOCK 0 @@ -551,10 +561,10 @@ int tdb_transaction_recover(struct tdb_context *tdb); bool tdb_needs_recovery(struct tdb_context *tdb); /* tdb.c: */ -void COLD tdb_logerr(struct tdb_context *tdb, - enum TDB_ERROR ecode, - enum tdb_log_level level, - const char *fmt, ...); +enum TDB_ERROR COLD tdb_logerr(struct tdb_context *tdb, + enum TDB_ERROR ecode, + enum tdb_log_level level, + const char *fmt, ...); #ifdef TDB_TRACE void tdb_trace(struct tdb_context *tdb, const char *op); diff --git a/ccan/tdb2/tdb.c b/ccan/tdb2/tdb.c index 38124582..fa8e8876 100644 --- a/ccan/tdb2/tdb.c +++ b/ccan/tdb2/tdb.c @@ -706,10 +706,10 @@ const char *tdb_errorstr(const struct tdb_context *tdb) return "Invalid error code"; } -void COLD tdb_logerr(struct tdb_context *tdb, - enum TDB_ERROR ecode, - enum tdb_log_level level, - const char *fmt, ...) +enum TDB_ERROR COLD tdb_logerr(struct tdb_context *tdb, + enum TDB_ERROR ecode, + enum tdb_log_level level, + const char *fmt, ...) { char *message; va_list ap; @@ -720,7 +720,7 @@ void COLD tdb_logerr(struct tdb_context *tdb, tdb->ecode = ecode; if (!tdb->logfn) - return; + return ecode; /* FIXME: Doesn't assume asprintf. */ va_start(ap, fmt); @@ -732,7 +732,7 @@ void COLD tdb_logerr(struct tdb_context *tdb, tdb->logfn(tdb, TDB_LOG_ERROR, tdb->log_private, "out of memory formatting message:"); tdb->logfn(tdb, level, tdb->log_private, fmt); - return; + return ecode; } va_start(ap, fmt); len = vsprintf(message, fmt, ap); @@ -740,4 +740,5 @@ void COLD tdb_logerr(struct tdb_context *tdb, tdb->logfn(tdb, level, tdb->log_private, message); free(message); errno = saved_errno; + return ecode; } diff --git a/ccan/tdb2/tdb2.h b/ccan/tdb2/tdb2.h index 3e02c803..4fd34e8b 100644 --- a/ccan/tdb2/tdb2.h +++ b/ccan/tdb2/tdb2.h @@ -111,7 +111,8 @@ enum TDB_ERROR { TDB_ERR_EXISTS = -5, /* The key already exists. */ TDB_ERR_NOEXIST = -6, /* The key does not exist. */ TDB_ERR_EINVAL = -7, /* You're using it wrong. */ - TDB_ERR_RDONLY = -8 /* The database is read-only. */ + TDB_ERR_RDONLY = -8, /* The database is read-only. */ + TDB_ERR_LAST = TDB_ERR_RDONLY }; /** -- 2.39.2