#include "private.h"
+#include <ccan/asprintf/asprintf.h>
#include <ccan/tdb2/tdb2.h>
#include <assert.h>
#include <stdarg.h>
attr = attr->base.next;
}
+ if (tdb_flags & ~(TDB_INTERNAL | TDB_NOLOCK | TDB_NOMMAP | TDB_CONVERT
+ | TDB_NOSYNC)) {
+ ecode = tdb_logerr(tdb, TDB_ERR_EINVAL, TDB_LOG_USE_ERROR,
+ "tdb_open: unknown flags %u", tdb_flags);
+ goto fail;
+ }
+
if ((open_flags & O_ACCMODE) == O_WRONLY) {
ecode = tdb_logerr(tdb, TDB_ERR_EINVAL, TDB_LOG_USE_ERROR,
"tdb_open: can't open tdb %s write-only",
if (!tdb->logfn)
return ecode;
- /* FIXME: Doesn't assume asprintf. */
va_start(ap, fmt);
- len = vsnprintf(NULL, 0, fmt, ap);
+ len = vasprintf(&message, fmt, ap);
va_end(ap);
- message = malloc(len + 1);
- if (!message) {
+ if (len < 0) {
tdb->logfn(tdb, TDB_LOG_ERROR, tdb->log_private,
"out of memory formatting message:");
tdb->logfn(tdb, level, tdb->log_private, fmt);
- return ecode;
+ } else {
+ tdb->logfn(tdb, level, tdb->log_private, message);
+ free(message);
}
- va_start(ap, fmt);
- len = vsprintf(message, fmt, ap);
- va_end(ap);
- tdb->logfn(tdb, level, tdb->log_private, message);
- free(message);
errno = saved_errno;
return ecode;
}