X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftdb2%2Fopen.c;h=1292fcc1ee32ee59431284527706461696096211;hp=37e20907fedfc1a9f512c449dea8b8e727ebcf9a;hb=8cca0397ef6f6017b13ce9ab4999bf3d92a2dee5;hpb=66ead2bcb732aa53bde5092b34c16d780df779ea diff --git a/ccan/tdb2/open.c b/ccan/tdb2/open.c index 37e20907..1292fcc1 100644 --- a/ccan/tdb2/open.c +++ b/ccan/tdb2/open.c @@ -203,6 +203,12 @@ enum TDB_ERROR tdb_set_attribute(struct tdb_context *tdb, : attr->base.attr == TDB_ATTRIBUTE_SEED ? "TDB_ATTRIBUTE_SEED" : "TDB_ATTRIBUTE_OPENHOOK"); + case TDB_ATTRIBUTE_STATS: + return tdb->last_error + = tdb_logerr(tdb, TDB_ERR_EINVAL, + TDB_LOG_USE_ERROR, + "tdb_set_attribute:" + " cannot set TDB_ATTRIBUTE_STATS"); case TDB_ATTRIBUTE_FLOCK: tdb->lock_fn = attr->flock.lock; tdb->unlock_fn = attr->flock.unlock; @@ -252,9 +258,13 @@ enum TDB_ERROR tdb_get_attribute(struct tdb_context *tdb, TDB_LOG_USE_ERROR, "tdb_get_attribute:" " cannot get TDB_ATTRIBUTE_OPENHOOK"); - case TDB_ATTRIBUTE_STATS: - /* FIXME */ - return TDB_ERR_EINVAL; + case TDB_ATTRIBUTE_STATS: { + size_t size = attr->stats.size; + if (size > tdb->stats.size) + size = tdb->stats.size; + memcpy(&attr->stats, &tdb->stats, size); + break; + } case TDB_ATTRIBUTE_FLOCK: attr->flock.lock = tdb->lock_fn; attr->flock.unlock = tdb->unlock_fn; @@ -291,7 +301,10 @@ void tdb_unset_attribute(struct tdb_context *tdb, : "TDB_ATTRIBUTE_OPENHOOK"); break; case TDB_ATTRIBUTE_STATS: - /* FIXME */ + tdb_logerr(tdb, TDB_ERR_EINVAL, + TDB_LOG_USE_ERROR, + "tdb_unset_attribute:" + "cannot unset TDB_ATTRIBUTE_STATS"); break; case TDB_ATTRIBUTE_FLOCK: tdb->lock_fn = tdb_fcntl_lock; @@ -337,13 +350,15 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags, tdb->flags = tdb_flags; tdb->log_fn = NULL; tdb->transaction = NULL; - tdb->stats = NULL; tdb->access = NULL; tdb->last_error = TDB_SUCCESS; tdb->file = NULL; tdb->lock_fn = tdb_fcntl_lock; tdb->unlock_fn = tdb_fcntl_unlock; tdb->hash_fn = jenkins_hash; + memset(&tdb->stats, 0, sizeof(tdb->stats)); + tdb->stats.base.attr = TDB_ATTRIBUTE_STATS; + tdb->stats.size = sizeof(tdb->stats); tdb_io_init(tdb); while (attr) { @@ -355,12 +370,6 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags, case TDB_ATTRIBUTE_SEED: seed = &attr->seed; break; - case TDB_ATTRIBUTE_STATS: - tdb->stats = &attr->stats; - /* They have stats we don't know about? Tell them. */ - if (tdb->stats->size > sizeof(attr->stats)) - tdb->stats->size = sizeof(attr->stats); - break; case TDB_ATTRIBUTE_OPENHOOK: openhook = &attr->openhook; break; @@ -407,16 +416,6 @@ 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); @@ -525,13 +524,6 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags, goto fail; } - 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; - } - /* Clear any features we don't understand. */ if ((open_flags & O_ACCMODE) != O_RDONLY) { hdr.features_used &= TDB_FEATURE_MASK;