diff options
author | Andrew Bartlett <abartlet@samba.org> | 2012-04-16 14:18:49 +1000 |
---|---|---|
committer | Andrew Bartlett <abartlet@samba.org> | 2012-04-18 12:04:59 +1000 |
commit | cc86f8e9858ed49074e0d159bdcfb14d18859562 (patch) | |
tree | 4cf780b2c3ae4d26c02ee2c48c4f41dbf7254c04 /lib | |
parent | 338e5a1d35574dbd96bbbcf2a74fe33adc95cb8c (diff) | |
download | samba-cc86f8e9858ed49074e0d159bdcfb14d18859562.tar.gz samba-cc86f8e9858ed49074e0d159bdcfb14d18859562.tar.bz2 samba-cc86f8e9858ed49074e0d159bdcfb14d18859562.zip |
lib/util: Move map_nt_error_from_tdb to the top level
This will help with making dbwrap available as a top level library.
Andrew Bartlett
Diffstat (limited to 'lib')
-rw-r--r-- | lib/util/util_tdb.c | 65 | ||||
-rw-r--r-- | lib/util/util_tdb.h | 6 |
2 files changed, 70 insertions, 1 deletions
diff --git a/lib/util/util_tdb.c b/lib/util/util_tdb.c index f239797c47..2096769e57 100644 --- a/lib/util/util_tdb.c +++ b/lib/util/util_tdb.c @@ -4,7 +4,8 @@ tdb utility functions Copyright (C) Andrew Tridgell 1992-2006 - + Copyright (C) Volker Lendecke 2007-2011 + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or @@ -351,3 +352,65 @@ int tdb_traverse_delete_fn(struct tdb_context *the_tdb, TDB_DATA key, TDB_DATA d { return tdb_delete(the_tdb, key); } + +/**************************************************************************** + Return an NTSTATUS from a TDB_ERROR +****************************************************************************/ + +NTSTATUS map_nt_error_from_tdb(enum TDB_ERROR err) +{ + NTSTATUS result = NT_STATUS_INTERNAL_ERROR; + + switch (err) { + case TDB_SUCCESS: + result = NT_STATUS_OK; + break; + case TDB_ERR_CORRUPT: + result = NT_STATUS_INTERNAL_DB_CORRUPTION; + break; + case TDB_ERR_IO: + result = NT_STATUS_UNEXPECTED_IO_ERROR; + break; + case TDB_ERR_OOM: + result = NT_STATUS_NO_MEMORY; + break; + case TDB_ERR_EXISTS: + result = NT_STATUS_OBJECT_NAME_COLLISION; + break; + + 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; + +#ifndef BUILD_TDB2 + case TDB_ERR_NOLOCK: + case TDB_ERR_LOCK_TIMEOUT: + /* + * These two ones in the enum are not actually used + */ + result = NT_STATUS_FILE_LOCK_CONFLICT; + break; +#endif + 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; +#ifndef BUILD_TDB2 + case TDB_ERR_NESTING: + result = NT_STATUS_INTERNAL_ERROR; + break; +#endif + }; + return result; +} diff --git a/lib/util/util_tdb.h b/lib/util/util_tdb.h index 3d03b990c2..0b6f3f18a4 100644 --- a/lib/util/util_tdb.h +++ b/lib/util/util_tdb.h @@ -132,5 +132,11 @@ bool tdb_change_uint32_atomic(struct tdb_context *tdb, const char *keystr, uint3 int tdb_traverse_delete_fn(struct tdb_context *the_tdb, TDB_DATA key, TDB_DATA dbuf, void *state); +/**************************************************************************** + Return an NTSTATUS from a TDB_ERROR +****************************************************************************/ + +NTSTATUS map_nt_error_from_tdb(enum TDB_ERROR err); + #endif /* _____LIB_UTIL_UTIL_TDB_H__ */ |