Skip to content

Commit

Permalink
Merge pull request FreeRDP#5639 from akallabeth/error_category
Browse files Browse the repository at this point in the history
Added function to get an error category for better error handling.
  • Loading branch information
mfleisz committed Oct 4, 2019
2 parents 1c6aa52 + 8d08838 commit a301e08
Show file tree
Hide file tree
Showing 10 changed files with 452 additions and 333 deletions.
14 changes: 14 additions & 0 deletions include/freerdp/error.h
Expand Up @@ -28,6 +28,17 @@
extern "C" {
#endif

/* Error categories */
#define CAT_NONE "success"
#define CAT_USE "use"
#define CAT_BROKER "broker"
#define CAT_GATEWAY "gateway"
#define CAT_LICENSING "licensing"
#define CAT_SERVER "server"
#define CAT_CONFIG "config"
#define CAT_PROTOCOL "protocol"
#define CAT_ADMIN "administrative"

/**
* Error Info Codes (Error Info PDU)
*/
Expand Down Expand Up @@ -163,6 +174,7 @@ extern "C" {

FREERDP_API const char* freerdp_get_error_info_string(UINT32 code);
FREERDP_API const char* freerdp_get_error_info_name(UINT32 code);
FREERDP_API const char* freerdp_get_error_info_category(UINT32 code);

/**
* This static variable holds an error code if the return value from connect is FALSE.
Expand Down Expand Up @@ -214,6 +226,7 @@ FREERDP_API extern int connectErrorCode;

FREERDP_API const char* freerdp_get_error_base_string(UINT32 code);
FREERDP_API const char* freerdp_get_error_base_name(UINT32 code);
FREERDP_API const char* freerdp_get_error_base_category(UINT32 code);

#define FREERDP_ERROR_SUCCESS ERRINFO_SUCCESS
#define FREERDP_ERROR_NONE ERRINFO_NONE
Expand Down Expand Up @@ -278,6 +291,7 @@ FREERDP_API const char* freerdp_get_error_base_name(UINT32 code);

FREERDP_API const char* freerdp_get_error_connect_string(UINT32 code);
FREERDP_API const char* freerdp_get_error_connect_name(UINT32 code);
FREERDP_API const char* freerdp_get_error_connect_category(UINT32 code);

#define FREERDP_ERROR_CONNECT_CLASS (FREERDP_ERROR_BASE + 2)

Expand Down
1 change: 1 addition & 0 deletions include/freerdp/freerdp.h
Expand Up @@ -472,6 +472,7 @@ FREERDP_API int freerdp_get_disconnect_ultimatum(rdpContext* context);
FREERDP_API UINT32 freerdp_get_last_error(rdpContext* context);
FREERDP_API const char* freerdp_get_last_error_name(UINT32 error);
FREERDP_API const char* freerdp_get_last_error_string(UINT32 error);
FREERDP_API const char* freerdp_get_last_error_category(UINT32 error);
FREERDP_API void freerdp_set_last_error(rdpContext* context, UINT32 lastError);

FREERDP_API const char* freerdp_get_logon_error_info_type(UINT32 type);
Expand Down
19 changes: 19 additions & 0 deletions libfreerdp/core/errbase.c
Expand Up @@ -64,6 +64,25 @@ const char* freerdp_get_error_base_string(UINT32 code)
return "ERRBASE_UNKNOWN";
}

const char* freerdp_get_error_base_category(UINT32 code)
{
const ERRINFO* errInfo;

errInfo = &ERRBASE_CODES[0];

while (errInfo->code != ERRBASE_NONE)
{
if (code == errInfo->code)
{
return errInfo->category;
}

errInfo++;
}

return "ERRBASE_UNKNOWN";
}

const char* freerdp_get_error_base_name(UINT32 code)
{
const ERRINFO* errInfo;
Expand Down
82 changes: 50 additions & 32 deletions libfreerdp/core/errconnect.c
Expand Up @@ -30,7 +30,7 @@

#define TAG FREERDP_TAG("core")

#define ERRCONNECT_DEFINE(_code) { ERRCONNECT_##_code , "ERRCONNECT_" #_code , ERRCONNECT_##_code##_STRING }
#define ERRCONNECT_DEFINE(_code, category) { ERRCONNECT_##_code , "ERRCONNECT_" #_code , ERRCONNECT_##_code##_STRING, category }

/* Protocol-independent codes */

Expand Down Expand Up @@ -121,37 +121,37 @@

static const ERRINFO ERRCONNECT_CODES[] =
{
ERRCONNECT_DEFINE(SUCCESS),

ERRCONNECT_DEFINE(PRE_CONNECT_FAILED),
ERRCONNECT_DEFINE(CONNECT_UNDEFINED),
ERRCONNECT_DEFINE(POST_CONNECT_FAILED),
ERRCONNECT_DEFINE(DNS_ERROR),
ERRCONNECT_DEFINE(DNS_NAME_NOT_FOUND),
ERRCONNECT_DEFINE(CONNECT_FAILED),
ERRCONNECT_DEFINE(MCS_CONNECT_INITIAL_ERROR),
ERRCONNECT_DEFINE(TLS_CONNECT_FAILED),
ERRCONNECT_DEFINE(AUTHENTICATION_FAILED),
ERRCONNECT_DEFINE(INSUFFICIENT_PRIVILEGES),
ERRCONNECT_DEFINE(CONNECT_CANCELLED),
ERRCONNECT_DEFINE(SECURITY_NEGO_CONNECT_FAILED),
ERRCONNECT_DEFINE(CONNECT_TRANSPORT_FAILED),
ERRCONNECT_DEFINE(PASSWORD_EXPIRED),
ERRCONNECT_DEFINE(PASSWORD_CERTAINLY_EXPIRED),
ERRCONNECT_DEFINE(CLIENT_REVOKED),
ERRCONNECT_DEFINE(KDC_UNREACHABLE),
ERRCONNECT_DEFINE(ACCOUNT_DISABLED),
ERRCONNECT_DEFINE(PASSWORD_MUST_CHANGE),
ERRCONNECT_DEFINE(LOGON_FAILURE),
ERRCONNECT_DEFINE(WRONG_PASSWORD),
ERRCONNECT_DEFINE(ACCESS_DENIED),
ERRCONNECT_DEFINE(ACCOUNT_RESTRICTION),
ERRCONNECT_DEFINE(ACCOUNT_LOCKED_OUT),
ERRCONNECT_DEFINE(ACCOUNT_EXPIRED),
ERRCONNECT_DEFINE(LOGON_TYPE_NOT_GRANTED),
ERRCONNECT_DEFINE(NO_OR_MISSING_CREDENTIALS),

ERRCONNECT_DEFINE(NONE)
ERRCONNECT_DEFINE(SUCCESS, CAT_NONE),

ERRCONNECT_DEFINE(PRE_CONNECT_FAILED, CAT_CONFIG),
ERRCONNECT_DEFINE(CONNECT_UNDEFINED, CAT_USE),
ERRCONNECT_DEFINE(POST_CONNECT_FAILED, CAT_CONFIG),
ERRCONNECT_DEFINE(DNS_ERROR, CAT_USE),
ERRCONNECT_DEFINE(DNS_NAME_NOT_FOUND, CAT_CONFIG),
ERRCONNECT_DEFINE(CONNECT_FAILED, CAT_USE),
ERRCONNECT_DEFINE(MCS_CONNECT_INITIAL_ERROR, CAT_PROTOCOL),
ERRCONNECT_DEFINE(TLS_CONNECT_FAILED, CAT_USE),
ERRCONNECT_DEFINE(AUTHENTICATION_FAILED, CAT_USE),
ERRCONNECT_DEFINE(INSUFFICIENT_PRIVILEGES, CAT_ADMIN),
ERRCONNECT_DEFINE(CONNECT_CANCELLED, CAT_USE),
ERRCONNECT_DEFINE(SECURITY_NEGO_CONNECT_FAILED, CAT_USE),
ERRCONNECT_DEFINE(CONNECT_TRANSPORT_FAILED, CAT_USE),
ERRCONNECT_DEFINE(PASSWORD_EXPIRED, CAT_ADMIN),
ERRCONNECT_DEFINE(PASSWORD_CERTAINLY_EXPIRED, CAT_ADMIN),
ERRCONNECT_DEFINE(CLIENT_REVOKED, CAT_ADMIN),
ERRCONNECT_DEFINE(KDC_UNREACHABLE, CAT_ADMIN),
ERRCONNECT_DEFINE(ACCOUNT_DISABLED, CAT_ADMIN),
ERRCONNECT_DEFINE(PASSWORD_MUST_CHANGE, CAT_ADMIN),
ERRCONNECT_DEFINE(LOGON_FAILURE, CAT_USE),
ERRCONNECT_DEFINE(WRONG_PASSWORD, CAT_USE),
ERRCONNECT_DEFINE(ACCESS_DENIED, CAT_ADMIN),
ERRCONNECT_DEFINE(ACCOUNT_RESTRICTION, CAT_ADMIN),
ERRCONNECT_DEFINE(ACCOUNT_LOCKED_OUT, CAT_ADMIN),
ERRCONNECT_DEFINE(ACCOUNT_EXPIRED, CAT_ADMIN),
ERRCONNECT_DEFINE(LOGON_TYPE_NOT_GRANTED, CAT_ADMIN),
ERRCONNECT_DEFINE(NO_OR_MISSING_CREDENTIALS, CAT_USE),

ERRCONNECT_DEFINE(NONE, CAT_NONE)
};

const char* freerdp_get_error_connect_string(UINT32 code)
Expand All @@ -172,6 +172,24 @@ const char* freerdp_get_error_connect_string(UINT32 code)
return "ERRCONNECT_UNKNOWN";
}

const char* freerdp_get_error_connect_category(UINT32 code)
{
const ERRINFO* errInfo;
errInfo = &ERRCONNECT_CODES[0];

while (errInfo->code != ERRCONNECT_NONE)
{
if (code == errInfo->code)
{
return errInfo->category;
}

errInfo++;
}

return "ERRCONNECT_UNKNOWN";
}

const char* freerdp_get_error_connect_name(UINT32 code)
{
const ERRINFO* errInfo;
Expand Down

0 comments on commit a301e08

Please sign in to comment.