mirror of
https://github.com/samba-team/samba.git
synced 2025-02-23 09:57:40 +03:00
s3: Use a switch to implement map_nt_error_from_tdb
First, this immediately gave me the warning that TDB_ERR_NESTING was not covered and second, this saved 48 bytes in the .o :-)
This commit is contained in:
parent
6c00a3db24
commit
2111fe5255
@ -642,39 +642,56 @@ fail:
|
|||||||
|
|
||||||
NTSTATUS map_nt_error_from_tdb(enum TDB_ERROR err)
|
NTSTATUS map_nt_error_from_tdb(enum TDB_ERROR err)
|
||||||
{
|
{
|
||||||
struct { enum TDB_ERROR err; NTSTATUS status; } map[] =
|
NTSTATUS result = NT_STATUS_INTERNAL_ERROR;
|
||||||
{ { 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 },
|
|
||||||
|
|
||||||
/*
|
switch (err) {
|
||||||
* TDB_ERR_LOCK is very broad, we could for example
|
case TDB_SUCCESS:
|
||||||
* distinguish between fcntl locks and invalid lock
|
result = NT_STATUS_OK;
|
||||||
* sequences. So NT_STATUS_FILE_LOCK_CONFLICT is a
|
break;
|
||||||
* compromise.
|
case TDB_ERR_CORRUPT:
|
||||||
*/
|
result = NT_STATUS_INTERNAL_DB_CORRUPTION;
|
||||||
{ TDB_ERR_LOCK, NT_STATUS_FILE_LOCK_CONFLICT },
|
break;
|
||||||
/*
|
case TDB_ERR_IO:
|
||||||
* The next two ones in the enum are not actually used
|
result = NT_STATUS_UNEXPECTED_IO_ERROR;
|
||||||
*/
|
break;
|
||||||
{ TDB_ERR_NOLOCK, NT_STATUS_FILE_LOCK_CONFLICT },
|
case TDB_ERR_OOM:
|
||||||
{ TDB_ERR_LOCK_TIMEOUT, NT_STATUS_FILE_LOCK_CONFLICT },
|
result = NT_STATUS_NO_MEMORY;
|
||||||
{ TDB_ERR_NOEXIST, NT_STATUS_NOT_FOUND },
|
break;
|
||||||
{ TDB_ERR_EINVAL, NT_STATUS_INVALID_PARAMETER },
|
case TDB_ERR_EXISTS:
|
||||||
{ TDB_ERR_RDONLY, NT_STATUS_ACCESS_DENIED }
|
result = NT_STATUS_OBJECT_NAME_COLLISION;
|
||||||
};
|
break;
|
||||||
|
|
||||||
int i;
|
case TDB_ERR_LOCK:
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
result = NT_STATUS_FILE_LOCK_CONFLICT;
|
||||||
|
break;
|
||||||
|
|
||||||
for (i=0; i < sizeof(map) / sizeof(map[0]); i++) {
|
case TDB_ERR_NOLOCK:
|
||||||
if (err == map[i].err) {
|
case TDB_ERR_LOCK_TIMEOUT:
|
||||||
return map[i].status;
|
/*
|
||||||
}
|
* These two ones in the enum are not actually used
|
||||||
}
|
*/
|
||||||
|
result = NT_STATUS_FILE_LOCK_CONFLICT;
|
||||||
return NT_STATUS_INTERNAL_ERROR;
|
break;
|
||||||
|
case TDB_ERR_NOEXIST:
|
||||||
|
result = NT_STATUS_NOT_FOUND;
|
||||||
|
break;
|
||||||
|
case TDB_ERR_EINVAL:
|
||||||
|
result = NT_STATUS_INVALID_PARAMETER;
|
||||||
|
break;
|
||||||
|
case TDB_ERR_RDONLY:
|
||||||
|
result = NT_STATUS_ACCESS_DENIED;
|
||||||
|
break;
|
||||||
|
case TDB_ERR_NESTING:
|
||||||
|
result = NT_STATUS_INTERNAL_ERROR;
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
int tdb_data_cmp(TDB_DATA t1, TDB_DATA t2)
|
int tdb_data_cmp(TDB_DATA t1, TDB_DATA t2)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user