fd = open("/dev/urandom", O_RDONLY);
if (fd >= 0) {
if (read_all(fd, &ret, sizeof(ret))) {
- tdb_logerr(tdb, TDB_SUCCESS, TDB_DEBUG_TRACE,
- "tdb_open: random from /dev/urandom");
close(fd);
return ret;
}
char reply[1 + sizeof(uint64_t)];
int r = read(fd, reply, sizeof(reply));
if (r > 1) {
- tdb_logerr(tdb, TDB_SUCCESS, TDB_DEBUG_TRACE,
- "tdb_open: %u random bytes from"
- " /dev/egd-pool", r-1);
/* Copy at least some bytes. */
memcpy(&ret, reply+1, r - 1);
if (reply[0] == sizeof(uint64_t)
/* Fallback: pid and time. */
gettimeofday(&now, NULL);
ret = getpid() * 100132289ULL + now.tv_sec * 1000000ULL + now.tv_usec;
- tdb_logerr(tdb, TDB_SUCCESS, TDB_DEBUG_TRACE,
+ tdb_logerr(tdb, TDB_SUCCESS, TDB_LOG_WARNING,
"tdb_open: random from getpid and time");
return ret;
}
tdb->map_size = sizeof(newdb);
tdb->map_ptr = malloc(tdb->map_size);
if (!tdb->map_ptr) {
- tdb_logerr(tdb, TDB_ERR_OOM, TDB_DEBUG_FATAL,
+ tdb_logerr(tdb, TDB_ERR_OOM, TDB_LOG_ERROR,
"tdb_new_database: failed to allocate");
return -1;
}
if (rlen != sizeof(newdb)) {
if (rlen >= 0)
errno = ENOSPC;
- tdb_logerr(tdb, TDB_ERR_IO, TDB_DEBUG_FATAL,
+ tdb_logerr(tdb, TDB_ERR_IO, TDB_LOG_ERROR,
"tdb_new_database: %zi writing header: %s",
rlen, strerror(errno));
return -1;
tdb->stats->size = sizeof(attr->stats);
break;
default:
- tdb_logerr(tdb, TDB_ERR_EINVAL, TDB_DEBUG_ERROR,
+ tdb_logerr(tdb, TDB_ERR_EINVAL, TDB_LOG_USE_ERROR,
"tdb_open: unknown attribute type %u",
attr->base.attr);
goto fail;
}
if ((open_flags & O_ACCMODE) == O_WRONLY) {
- tdb_logerr(tdb, TDB_ERR_EINVAL, TDB_DEBUG_ERROR,
+ tdb_logerr(tdb, TDB_ERR_EINVAL, TDB_LOG_USE_ERROR,
"tdb_open: can't open tdb %s write-only", name);
goto fail;
}
if ((tdb->fd = open(name, open_flags, mode)) == -1) {
/* errno set by open(2) */
saved_errno = errno;
- tdb_logerr(tdb, TDB_ERR_IO, TDB_DEBUG_ERROR,
+ tdb_logerr(tdb, TDB_ERR_IO, TDB_LOG_ERROR,
"tdb_open: could not open file %s: %s",
name, strerror(errno));
goto fail;
goto fail;
}
} else if (rlen < 0) {
- tdb_logerr(tdb, TDB_ERR_IO, TDB_DEBUG_ERROR,
+ tdb_logerr(tdb, TDB_ERR_IO, TDB_LOG_ERROR,
"tdb_open: error %s reading %s",
strerror(errno), name);
goto fail;
} else if (rlen < sizeof(hdr)
|| strcmp(hdr.magic_food, TDB_MAGIC_FOOD) != 0) {
- tdb_logerr(tdb, TDB_ERR_IO, TDB_DEBUG_ERROR,
+ tdb_logerr(tdb, TDB_ERR_IO, TDB_LOG_ERROR,
"tdb_open: %s is not a tdb file", name);
goto fail;
}
tdb->flags |= TDB_CONVERT;
else {
/* wrong version */
- tdb_logerr(tdb, TDB_ERR_IO, TDB_DEBUG_ERROR,
+ tdb_logerr(tdb, TDB_ERR_IO, TDB_LOG_ERROR,
"tdb_open: %s is unknown version 0x%llx",
name, (long long)hdr.version);
goto fail;
hash_test = tdb_hash(tdb, &hash_test, sizeof(hash_test));
if (hdr.hash_test != hash_test) {
/* wrong hash variant */
- tdb_logerr(tdb, TDB_ERR_IO, TDB_DEBUG_ERROR,
+ tdb_logerr(tdb, TDB_ERR_IO, TDB_LOG_ERROR,
"tdb_open: %s uses a different hash function",
name);
goto fail;
if (fstat(tdb->fd, &st) == -1) {
saved_errno = errno;
- tdb_logerr(tdb, TDB_ERR_IO, TDB_DEBUG_ERROR,
+ tdb_logerr(tdb, TDB_ERR_IO, TDB_LOG_ERROR,
"tdb_open: could not stat open %s: %s",
name, strerror(errno));
goto fail;
/* Is it already in the open list? If so, fail. */
if (tdb_already_open(st.st_dev, st.st_ino)) {
/* FIXME */
- tdb_logerr(tdb, TDB_ERR_NESTING, TDB_DEBUG_ERROR,
+ tdb_logerr(tdb, TDB_ERR_IO, TDB_LOG_USE_ERROR,
"tdb_open: %s (%d,%d) is already open in this"
" process",
name, (int)st.st_dev, (int)st.st_ino);
tdb->name = strdup(name);
if (!tdb->name) {
- tdb_logerr(tdb, TDB_ERR_OOM, TDB_DEBUG_ERROR,
+ tdb_logerr(tdb, TDB_ERR_OOM, TDB_LOG_ERROR,
"tdb_open: failed to allocate name");
goto fail;
}
case TDB_ERR_EINVAL:
saved_errno = EINVAL;
break;
- case TDB_ERR_NESTING:
- saved_errno = EBUSY;
- break;
default:
saved_errno = EINVAL;
break;
} else
tdb_munmap(tdb);
}
+ free(tdb->lockrecs);
free((char *)tdb->name);
if (tdb->fd != -1)
if (close(tdb->fd) != 0)
- tdb_logerr(tdb, TDB_ERR_IO, TDB_DEBUG_ERROR,
+ tdb_logerr(tdb, TDB_ERR_IO, TDB_LOG_ERROR,
"tdb_open: failed to close tdb->fd"
- " on error!");
+ " on error: %s", strerror(errno));
free(tdb);
errno = saved_errno;
return NULL;
/* Slow path. */
newdata = malloc(key.dsize + old_dlen + dbuf.dsize);
if (!newdata) {
- tdb_logerr(tdb, TDB_ERR_OOM, TDB_DEBUG_FATAL,
+ tdb_logerr(tdb, TDB_ERR_OOM, TDB_LOG_ERROR,
"tdb_append: failed to allocate %zu bytes",
(size_t)(key.dsize+old_dlen+dbuf.dsize));
goto fail;
case TDB_ERR_LOCK: return "Locking error";
case TDB_ERR_OOM: return "Out of memory";
case TDB_ERR_EXISTS: return "Record exists";
- case TDB_ERR_NESTING: return "Transaction already started";
case TDB_ERR_EINVAL: return "Invalid parameter";
case TDB_ERR_NOEXIST: return "Record does not exist";
case TDB_ERR_RDONLY: return "write not permitted";
void COLD tdb_logerr(struct tdb_context *tdb,
enum TDB_ERROR ecode,
- enum tdb_debug_level level,
+ enum tdb_log_level level,
const char *fmt, ...)
{
char *message;
message = malloc(len + 1);
if (!message) {
- tdb->logfn(tdb, TDB_DEBUG_ERROR, tdb->log_private,
+ tdb->logfn(tdb, TDB_LOG_ERROR, tdb->log_private,
"out of memory formatting message:");
tdb->logfn(tdb, level, tdb->log_private, fmt);
return;