X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Ftdb2%2Ftdb.c;h=ce431208bf4cb4fa28d09f9158c7fb02c93d7d37;hb=a0e0927e1f34d80fd4d4ee2d68fa2acb94ae9eb2;hp=c087aad25ea9c9e782f722de6bcacec720cac239;hpb=b21004624683be5bf1d8f75e3b5be4e9618049ee;p=ccan diff --git a/ccan/tdb2/tdb.c b/ccan/tdb2/tdb.c index c087aad2..ce431208 100644 --- a/ccan/tdb2/tdb.c +++ b/ccan/tdb2/tdb.c @@ -1,4 +1,5 @@ #include "private.h" +#include #include #include #include @@ -236,6 +237,13 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags, 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", @@ -245,8 +253,6 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags, if ((open_flags & O_ACCMODE) == O_RDONLY) { tdb->read_only = true; - /* read only databases don't do locking */ - tdb->flags |= TDB_NOLOCK; tdb->mmap_flags = PROT_READ; } else { tdb->read_only = false; @@ -758,23 +764,18 @@ enum TDB_ERROR COLD tdb_logerr(struct tdb_context *tdb, 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; }