X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftdb2%2Fopen.c;h=c3feecf73f34acfd08cabbd81570dd1883ddebc4;hp=7cbac0afa0c3cf39d7b2122c89b03e784ab5a574;hb=0753972a623c7bf24f13578a5ceb3995ea307876;hpb=142e3d312251b46526350ddfebaca6286146aaf2 diff --git a/ccan/tdb2/open.c b/ccan/tdb2/open.c index 7cbac0af..c3feecf7 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; @@ -321,24 +334,31 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags, tdb_bool_err berr; enum TDB_ERROR ecode; - tdb = malloc(sizeof(*tdb)); + tdb = malloc(sizeof(*tdb) + (name ? strlen(name) + 1 : 0)); if (!tdb) { /* Can't log this */ errno = ENOMEM; return NULL; } - tdb->name = NULL; + /* Set name immediately for logging functions. */ + if (name) { + tdb->name = strcpy((char *)(tdb + 1), name); + } else { + tdb->name = NULL; + } tdb->direct_access = 0; 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) { @@ -350,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; @@ -369,7 +383,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_SEQNUM)) { + | TDB_NOSYNC | TDB_SEQNUM | TDB_ALLOW_NESTING)) { ecode = tdb_logerr(tdb, TDB_ERR_EINVAL, TDB_LOG_USE_ERROR, "tdb_open: unknown flags %u", tdb_flags); goto fail; @@ -402,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); @@ -520,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; @@ -590,7 +587,6 @@ fail_errno: #ifdef TDB_TRACE close(tdb->tracefd); #endif - free(cast_const(char *, tdb->name)); if (tdb->file) { tdb_lock_cleanup(tdb); if (--tdb->file->refcnt == 0) { @@ -631,7 +627,6 @@ int tdb_close(struct tdb_context *tdb) else tdb_munmap(tdb->file); } - free(cast_const(char *, tdb->name)); if (tdb->file) { struct tdb_file **i;