r23170: Add map_nt_error_from_tdb()
authorVolker Lendecke <vlendec@samba.org>
Mon, 28 May 2007 11:08:58 +0000 (11:08 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:22:51 +0000 (12:22 -0500)
(This used to be commit 02beae81c8ecef7cfe300a29852d74813c9409bf)

source3/lib/dbwrap_tdb.c
source3/lib/util_tdb.c

index 238ba5176102706125460eb40637a3364f140e98..2b09e3ccabbf11ce1ea5d9aa46dfea37e36622bd 100644 (file)
@@ -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 {
index c6e3063d56bfde66e2af3c08065a7fddf3b84e76..d6f110e45812273966f29cedb4b5a9c8c343558e 100644 (file)
@@ -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;
+}