#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
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);
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;
tdb->ecode = ecode;
if (!tdb->logfn)
- return;
+ return ecode;
/* FIXME: Doesn't assume asprintf. */
va_start(ap, fmt);
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);
tdb->logfn(tdb, level, tdb->log_private, message);
free(message);
errno = saved_errno;
+ return ecode;
}
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
};
/**