diff options
-rw-r--r-- | librpc/ndr/libndr.h | 1 | ||||
-rw-r--r-- | librpc/ndr/ndr.c | 35 | ||||
-rw-r--r-- | source4/librpc/rpc/pyrpc.h | 2 |
3 files changed, 37 insertions, 1 deletions
diff --git a/librpc/ndr/libndr.h b/librpc/ndr/libndr.h index fdecddc0fc..4ab0bf5f0b 100644 --- a/librpc/ndr/libndr.h +++ b/librpc/ndr/libndr.h @@ -342,6 +342,7 @@ struct ndr_interface_list { Map an NT error code from a NDR error code. *********************************************************************/ NTSTATUS ndr_map_error2ntstatus(enum ndr_err_code ndr_err); +const char *ndr_map_error2string(enum ndr_err_code ndr_err); /* FIXME: Use represent_as instead */ struct dom_sid; diff --git a/librpc/ndr/ndr.c b/librpc/ndr/ndr.c index 22b9fccbb5..2341f51faa 100644 --- a/librpc/ndr/ndr.c +++ b/librpc/ndr/ndr.c @@ -1122,3 +1122,38 @@ _PUBLIC_ enum ndr_err_code ndr_pull_relative_ptr2(struct ndr_pull *ndr, const vo NDR_CHECK(ndr_token_retrieve(&ndr->relative_list, p, &rel_offset)); return ndr_pull_set_offset(ndr, rel_offset); } + +const static struct { + enum ndr_err_code err; + const char *string; +} ndr_err_code_strings[] = { + { NDR_ERR_SUCCESS, "Success" }, + { NDR_ERR_ARRAY_SIZE, "Bad Array Size" }, + { NDR_ERR_BAD_SWITCH, "Bad Switch" }, + { NDR_ERR_OFFSET, "Offset Error" }, + { NDR_ERR_RELATIVE, "Relative Pointer Error" }, + { NDR_ERR_CHARCNV, "Character Conversion Error" }, + { NDR_ERR_LENGTH, "Length Error" }, + { NDR_ERR_SUBCONTEXT, "Subcontext Error" }, + { NDR_ERR_COMPRESSION, "Compression Error" }, + { NDR_ERR_STRING, "String Error" }, + { NDR_ERR_VALIDATE, "Validate Error" }, + { NDR_ERR_BUFSIZE, "Buffer Size Error" }, + { NDR_ERR_ALLOC, "Allocation Error" }, + { NDR_ERR_RANGE, "Range Error" }, + { NDR_ERR_TOKEN, "Token Error" }, + { NDR_ERR_IPV4ADDRESS, "IPv4 Address Error" }, + { NDR_ERR_INVALID_POINTER, "Invalid Pointer" }, + { NDR_ERR_UNREAD_BYTES, "Unread Bytes" }, + { 0, NULL } +}; + +_PUBLIC_ const char *ndr_map_error2string(enum ndr_err_code ndr_err) +{ + int i; + for (i = 0; ndr_err_code_strings[i].string != NULL; i++) { + if (ndr_err_code_strings[i].err == ndr_err) + return ndr_err_code_strings[i].string; + } + return "Unknown error"; +} diff --git a/source4/librpc/rpc/pyrpc.h b/source4/librpc/rpc/pyrpc.h index 6d5193f57e..ae622b562c 100644 --- a/source4/librpc/rpc/pyrpc.h +++ b/source4/librpc/rpc/pyrpc.h @@ -48,7 +48,7 @@ typedef struct { PyAPI_DATA(PyTypeObject) dcerpc_InterfaceType; -#define PyErr_FromNdrError(err) PyErr_FromNTSTATUS(ndr_map_error2ntstatus(err)) +#define PyErr_FromNdrError(err) Py_BuildValue("(is)", err, ndr_map_error2string(err)) #define PyErr_SetNdrError(err) \ PyErr_SetObject(PyExc_RuntimeError, PyErr_FromNdrError(err)) |