src: add facility for mapping between ntstatus, win(sock), c errors

This commit is contained in:
Bert Belder 2017-09-02 04:40:02 +02:00
parent 8753208959
commit 22f02b1e01
3 changed files with 3009 additions and 0 deletions

2908
src/error-map.h Normal file

File diff suppressed because it is too large Load Diff

85
src/error.c Normal file
View File

@ -0,0 +1,85 @@
#define WIN32_LEAN_AND_MEAN
#include <WinSock2.h>
#include <Windows.h>
#include <errno.h>
#include "error-map.h"
#pragma warning(push)
#pragma warning(disable : 4127) /* "conditional expression is constant" */
unsigned long we_map_ntstatus_to_winsock_error(unsigned long ntstatus) {
#define X(ntstatus_code, ntstatus_symbol, win_error, winsock_error, c_err) \
if (winsock_error != -1 && ntstatus == ntstatus_code) \
return (unsigned long) winsock_error;
WE_ERROR_MAP(X)
#undef X
return WSAEINVAL;
}
unsigned long we_map_ntstatus_to_win_error(unsigned long ntstatus) {
#define X(ntstatus_code, ntstatus_symbol, win_error, winsock_error, c_err) \
if (win_error != -1 && ntstatus == ntstatus_code) \
return win_error;
WE_ERROR_MAP(X)
#undef X
return ERROR_MR_MID_NOT_FOUND;
}
errno_t we_map_ntstatus_to_errno(unsigned long ntstatus) {
#define X(ntstatus_code, ntstatus_symbol, win_error, winsock_error, c_err) \
if (c_err != -1 && ntstatus == ntstatus_code) \
return c_err;
WE_ERROR_MAP(X)
#undef X
return EINVAL;
}
errno_t we_map_win_error_to_errno(unsigned long code) {
#define X(ntstatus_code, ntstatus_symbol, win_error, winsock_error, c_err) \
if (c_err != -1 && ((win_error != -1 && code == win_error) || \
(winsock_error != -1 && code == winsock_error))) \
return c_err;
WE_ERROR_MAP(X)
#undef X
return EINVAL;
}
const char* we_get_ntstatus_symbol(unsigned long ntstatus) {
#define X(ntstatus_code, ntstatus_symbol, win_error, winsock_error, c_err) \
{ \
static const char SYMBOL[] = #ntstatus_symbol; \
if (sizeof SYMBOL > 0 && ntstatus == ntstatus_code) \
return SYMBOL; \
}
WE_ERROR_MAP(X)
#undef X
return "";
}
const char* we_get_win_error_symbol(unsigned long code) {
#define X(ntstatus_code, ntstatus_symbol, win_error, winsock_error, c_err) \
{ \
static const char SYMBOL[] = #win_error; \
if (sizeof SYMBOL > 0 && win_error != -1 && code == win_error) \
return SYMBOL; \
}
WE_ERROR_MAP(X)
#undef X
return "";
}
const char* we_get_errno_symbol(errno_t err) {
#define X(ntstatus_code, ntstatus_symbol, win_error, winsock_error, c_err) \
{ \
static const char SYMBOL[] = #c_err; \
if (sizeof SYMBOL > 0 && c_err != -1 && err == c_err) \
return SYMBOL; \
}
WE_ERROR_MAP(X)
#undef X
return "";
}
#pragma warning(pop)

16
src/error.h Normal file
View File

@ -0,0 +1,16 @@
#ifndef ERROR_H_
#define ERROR_H_
#include <errno.h>
unsigned long we_map_ntstatus_to_winsock_error(unsigned long ntstatus);
unsigned long we_map_ntstatus_to_win_error(unsigned long ntstatus);
errno_t we_map_ntstatus_to_errno(unsigned long ntstatus);
errno_t we_map_win_error_to_errno(unsigned long code);
const char* we_get_ntstatus_symbol(unsigned long ntstatus);
const char* we_get_win_error_symbol(unsigned long code);
const char* we_get_errno_symbol(errno_t err);
#endif /* ERROR_H_ */