X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftdb2%2Ftdb.c;h=4ffcebf56150bffe381018b4f401aa5503455196;hp=2315c485eea31be3c40af274243f39cc55f633e0;hb=2b5cb9bd6be4e61870ba7a400d1a9d91c5933371;hpb=751a8a34d06dde243c9f273427ef262c25fbe11f diff --git a/ccan/tdb2/tdb.c b/ccan/tdb2/tdb.c index 2315c485..4ffcebf5 100644 --- a/ccan/tdb2/tdb.c +++ b/ccan/tdb2/tdb.c @@ -112,6 +112,7 @@ static enum TDB_ERROR tdb_new_database(struct tdb_context *tdb, newdb.hdr.hash_seed, tdb->hash_priv); newdb.hdr.recovery = 0; + newdb.hdr.features_used = newdb.hdr.features_offered = TDB_FEATURE_MASK; memset(newdb.hdr.reserved, 0, sizeof(newdb.hdr.reserved)); /* Initial hashes are empty. */ memset(newdb.hdr.hashtable, 0, sizeof(newdb.hdr.hashtable)); @@ -237,6 +238,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", @@ -354,6 +362,16 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags, goto fail; } + /* Clear any features we don't understand. */ + if ((open_flags & O_ACCMODE) != O_RDONLY) { + hdr.features_used &= TDB_FEATURE_MASK; + if (tdb_write_convert(tdb, offsetof(struct tdb_header, + features_used), + &hdr.features_used, + sizeof(hdr.features_used)) == -1) + goto fail; + } + tdb->device = st.st_dev; tdb->inode = st.st_ino; tdb_unlock_open(tdb);