summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/lib/dbwrap_tdb.c10
-rw-r--r--source3/lib/util_tdb.c37
2 files changed, 45 insertions, 2 deletions
diff --git a/source3/lib/dbwrap_tdb.c b/source3/lib/dbwrap_tdb.c
index 238ba51761..2b09e3ccab 100644
--- a/source3/lib/dbwrap_tdb.c
+++ b/source3/lib/dbwrap_tdb.c
@@ -127,9 +127,15 @@ static NTSTATUS db_tdb_delete(struct db_record *rec)
{
struct db_tdb_ctx *ctx = talloc_get_type_abort(rec->private_data,
struct db_tdb_ctx);
+ int res;
+
+ res = tdb_delete(ctx->tdb, rec->key);
- return (tdb_delete(ctx->tdb, rec->key) == 0) ?
- NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL;
+ if (res == 0) {
+ return NT_STATUS_OK;
+ }
+
+ return map_nt_error_from_tdb(tdb_error(ctx->tdb));
}
struct db_tdb_traverse_ctx {
diff --git a/source3/lib/util_tdb.c b/source3/lib/util_tdb.c
index c6e3063d56..d6f110e458 100644
--- a/source3/lib/util_tdb.c
+++ b/source3/lib/util_tdb.c
@@ -940,3 +940,40 @@ struct tdb_wrap *tdb_wrap_open(TALLOC_CTX *mem_ctx,
return w;
}
+
+NTSTATUS map_nt_error_from_tdb(enum TDB_ERROR err)
+{
+ struct { enum TDB_ERROR err; NTSTATUS status; } map[] =
+ { { TDB_SUCCESS, NT_STATUS_OK },
+ { TDB_ERR_CORRUPT, NT_STATUS_INTERNAL_DB_CORRUPTION },
+ { TDB_ERR_IO, NT_STATUS_UNEXPECTED_IO_ERROR },
+ { TDB_ERR_OOM, NT_STATUS_NO_MEMORY },
+ { TDB_ERR_EXISTS, NT_STATUS_OBJECT_NAME_COLLISION },
+
+ /*
+ * TDB_ERR_LOCK is very broad, we could for example
+ * distinguish between fcntl locks and invalid lock
+ * sequences. So NT_STATUS_FILE_LOCK_CONFLICT is a
+ * compromise.
+ */
+ { TDB_ERR_LOCK, NT_STATUS_FILE_LOCK_CONFLICT },
+ /*
+ * The next two ones in the enum are not actually used
+ */
+ { TDB_ERR_NOLOCK, NT_STATUS_FILE_LOCK_CONFLICT },
+ { TDB_ERR_LOCK_TIMEOUT, NT_STATUS_FILE_LOCK_CONFLICT },
+ { TDB_ERR_NOEXIST, NT_STATUS_NOT_FOUND },
+ { TDB_ERR_EINVAL, NT_STATUS_INVALID_PARAMETER },
+ { TDB_ERR_RDONLY, NT_STATUS_ACCESS_DENIED }
+ };
+
+ int i;
+
+ for (i=0; i < sizeof(map) / sizeof(map[0]); i++) {
+ if (err == map[i].err) {
+ return map[i].status;
+ }
+ }
+
+ return NT_STATUS_INTERNAL_ERROR;
+}