tdb->hash_priv);
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));
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);
}
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;
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);
#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) {
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);