X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftdb2%2Fopen.c;h=56514ae533a4c925635e5df350ad690bff34710d;hp=6d930be14f6f4b14faeb44e0beae7dbc3a59b1e1;hb=156e5eb92f1d986957cb081b58320579c6e366dd;hpb=bb4d59ee1e914df9f8066e59a9c9a6604e581c40 diff --git a/ccan/tdb2/open.c b/ccan/tdb2/open.c index 6d930be1..56514ae5 100644 --- a/ccan/tdb2/open.c +++ b/ccan/tdb2/open.c @@ -101,12 +101,13 @@ static enum TDB_ERROR tdb_new_database(struct tdb_context *tdb, else newdb.hdr.hash_seed = random_number(tdb); newdb.hdr.hash_test = TDB_HASH_MAGIC; - newdb.hdr.hash_test = tdb->khash(&newdb.hdr.hash_test, - sizeof(newdb.hdr.hash_test), - newdb.hdr.hash_seed, - tdb->hash_priv); + newdb.hdr.hash_test = tdb->hash_fn(&newdb.hdr.hash_test, + sizeof(newdb.hdr.hash_test), + newdb.hdr.hash_seed, + tdb->hash_data); newdb.hdr.recovery = 0; newdb.hdr.features_used = newdb.hdr.features_offered = TDB_FEATURE_MASK; + newdb.hdr.seqnum = 0; memset(newdb.hdr.reserved, 0, sizeof(newdb.hdr.reserved)); /* Initial hashes are empty. */ memset(newdb.hdr.hashtable, 0, sizeof(newdb.hdr.hashtable)); @@ -204,10 +205,11 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags, tdb->name = NULL; tdb->direct_access = 0; tdb->flags = tdb_flags; - tdb->logfn = NULL; + tdb->log_fn = NULL; tdb->transaction = NULL; tdb->stats = NULL; tdb->access = NULL; + tdb->last_error = TDB_SUCCESS; tdb->file = NULL; tdb_hash_init(tdb); tdb_io_init(tdb); @@ -215,12 +217,12 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags, while (attr) { switch (attr->base.attr) { case TDB_ATTRIBUTE_LOG: - tdb->logfn = attr->log.log_fn; - tdb->log_private = attr->log.log_private; + tdb->log_fn = attr->log.fn; + tdb->log_data = attr->log.data; break; case TDB_ATTRIBUTE_HASH: - tdb->khash = attr->hash.hash_fn; - tdb->hash_priv = attr->hash.hash_private; + tdb->hash_fn = attr->hash.fn; + tdb->hash_data = attr->hash.data; break; case TDB_ATTRIBUTE_SEED: seed = &attr->seed; @@ -243,7 +245,7 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags, } if (tdb_flags & ~(TDB_INTERNAL | TDB_NOLOCK | TDB_NOMMAP | TDB_CONVERT - | TDB_NOSYNC)) { + | TDB_NOSYNC | TDB_SEQNUM)) { ecode = tdb_logerr(tdb, TDB_ERR_EINVAL, TDB_LOG_USE_ERROR, "tdb_open: unknown flags %u", tdb_flags); goto fail; @@ -276,6 +278,16 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags, if (ecode != TDB_SUCCESS) { goto fail; } + if (name) { + tdb->name = strdup(name); + if (!tdb->name) { + ecode = tdb_logerr(tdb, TDB_ERR_OOM, + TDB_LOG_ERROR, + "tdb_open: failed to" + " allocate name"); + goto fail; + } + } tdb_convert(tdb, &hdr.hash_seed, sizeof(hdr.hash_seed)); tdb->hash_seed = hdr.hash_seed; tdb_ftable_init(tdb); @@ -442,9 +454,9 @@ fail_errno: #ifdef TDB_TRACE close(tdb->tracefd); #endif - free((char *)tdb->name); + free(cast_const(char *, tdb->name)); if (tdb->file) { - tdb_unlock_all(tdb); + tdb_lock_cleanup(tdb); if (--tdb->file->refcnt == 0) { assert(tdb->file->num_lockrecs == 0); if (tdb->file->map_ptr) { @@ -483,11 +495,11 @@ int tdb_close(struct tdb_context *tdb) else tdb_munmap(tdb->file); } - free((char *)tdb->name); + free(cast_const(char *, tdb->name)); if (tdb->file) { struct tdb_file **i; - tdb_unlock_all(tdb); + tdb_lock_cleanup(tdb); if (--tdb->file->refcnt == 0) { ret = close(tdb->file->fd);