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;
ssize_t rlen;
struct tdb_header hdr;
struct tdb_attribute_seed *seed = NULL;
+ struct tdb_attribute_openhook *openhook = NULL;
tdb_bool_err berr;
enum TDB_ERROR ecode;
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);
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;
if (tdb->stats->size > sizeof(attr->stats))
tdb->stats->size = sizeof(attr->stats);
break;
+ case TDB_ATTRIBUTE_OPENHOOK:
+ openhook = &attr->openhook;
+ break;
default:
ecode = tdb_logerr(tdb, TDB_ERR_EINVAL,
TDB_LOG_USE_ERROR,
goto fail;
}
+ /* call their open hook if they gave us one. */
+ if (openhook) {
+ ecode = openhook->fn(tdb->file->fd, openhook->data);
+ if (ecode != TDB_SUCCESS) {
+ tdb_logerr(tdb, ecode, TDB_LOG_ERROR,
+ "tdb_open: open hook failed");
+ goto fail;
+ }
+ open_flags |= O_CREAT;
+ }
+
/* If they used O_TRUNC, read will return 0. */
rlen = pread(tdb->file->fd, &hdr, sizeof(hdr), 0);
if (rlen == 0 && (open_flags & O_CREAT)) {
#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);