From f0ea4fa43be7ab6af1bacecee1402305e0c2977d Mon Sep 17 00:00:00 2001 From: Eduardo Beloni Date: Mon, 24 Oct 2011 16:46:19 -0200 Subject: [PATCH] X11: X11: handling error info -> disconnect reason --- client/X11/xfreerdp.c | 39 ++++++++++++++++++++++++++++++++++----- client/X11/xfreerdp.h | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 5 deletions(-) diff --git a/client/X11/xfreerdp.c b/client/X11/xfreerdp.c index 7dc4d6573..7ed76654f 100644 --- a/client/X11/xfreerdp.c +++ b/client/X11/xfreerdp.c @@ -67,6 +67,7 @@ freerdp_sem g_sem; static int g_thread_count = 0; +static uint8 g_disconnect_reason = 0; static long xv_port = 0; const size_t password_size = 512; @@ -424,7 +425,7 @@ boolean xf_pre_connect(freerdp* instance) xf_process_plugin_args, instance->context->channels, xf_process_client_args, xfi) < 0) { printf("failed to parse arguments.\n"); - exit(0); + exit(XF_EXIT_PARSE_ARGUMENTS); } settings = instance->settings; @@ -866,12 +867,13 @@ int xfreerdp_run(freerdp* instance) fd_set rfds_set; fd_set wfds_set; rdpChannels* channels; + int ret = 0; memset(rfds, 0, sizeof(rfds)); memset(wfds, 0, sizeof(wfds)); if (!freerdp_connect(instance)) - return 0; + return XF_EXIT_CONN_FAILED; xfi = ((xfContext*) instance->context)->xfi; channels = instance->context->channels; @@ -884,16 +886,19 @@ int xfreerdp_run(freerdp* instance) if (freerdp_get_fds(instance, rfds, &rcount, wfds, &wcount) != True) { printf("Failed to get FreeRDP file descriptor\n"); + ret = XF_EXIT_CONN_FAILED; break; } if (freerdp_channels_get_fds(channels, instance, rfds, &rcount, wfds, &wcount) != True) { printf("Failed to get channel manager file descriptor\n"); + ret = XF_EXIT_CONN_FAILED; break; } if (xf_get_fds(instance, rfds, &rcount, wfds, &wcount) != True) { printf("Failed to get xfreerdp file descriptor\n"); + ret = XF_EXIT_CONN_FAILED; break; } @@ -945,6 +950,9 @@ int xfreerdp_run(freerdp* instance) xf_process_channel_event(channels, instance); } + if (!ret) + ret = freerdp_error_info(instance); + freerdp_channels_close(channels, instance); freerdp_channels_free(channels); freerdp_disconnect(instance); @@ -952,7 +960,7 @@ int xfreerdp_run(freerdp* instance) freerdp_free(instance); xf_free(xfi); - return 0; + return ret; } void* thread_func(void* param) @@ -960,7 +968,7 @@ void* thread_func(void* param) struct thread_data* data; data = (struct thread_data*) param; - xfreerdp_run(data->instance); + g_disconnect_reason = xfreerdp_run(data->instance); xfree(data); @@ -974,6 +982,27 @@ void* thread_func(void* param) return NULL; } +static uint8 exit_code_from_disconnect_reason(uint32 reason) +{ + if (reason == 0 || + (reason >= XF_EXIT_PARSE_ARGUMENTS && reason <= XF_EXIT_CONN_FAILED)) + return reason; + + /* Licence error set */ + else if (reason >= 0x100 && reason <= 0x10A) + reason -= 0x100 + XF_EXIT_LICENSE_INTERNAL; + + /* RDP protocol error set */ + else if (reason >= 0x10c9 && reason <= 0x1193) + reason = XF_EXIT_RDP; + + /* There's no need to test protocol-independent codes: they match */ + else if (!(reason <= 0xB)) + reason = XF_EXIT_UNKNOWN; + + return reason; +} + int main(int argc, char* argv[]) { pthread_t thread; @@ -1022,5 +1051,5 @@ int main(int argc, char* argv[]) freerdp_channels_global_uninit(); - return 0; + return exit_code_from_disconnect_reason(g_disconnect_reason); } diff --git a/client/X11/xfreerdp.h b/client/X11/xfreerdp.h index e4dd6dea8..44bef6f97 100644 --- a/client/X11/xfreerdp.h +++ b/client/X11/xfreerdp.h @@ -147,6 +147,47 @@ struct xf_info void xf_toggle_fullscreen(xfInfo* xfi); boolean xf_post_connect(freerdp* instance); +enum XF_EXIT_CODE +{ + /* section 0-15: protocol-independent codes */ + XF_EXIT_SUCCESS = 0, + XF_EXIT_DISCONNECT = 1, + XF_EXIT_LOGOFF = 2, + XF_EXIT_IDLE_TIMEOUT = 3, + XF_EXIT_LOGON_TIMEOUT = 4, + XF_EXIT_CONN_REPLACED = 5, + XF_EXIT_OUT_OF_MEMORY = 6, + XF_EXIT_CONN_DENIED = 7, + XF_EXIT_CONN_DENIED_FIPS = 8, + XF_EXIT_USER_PRIVILEGES = 9, + XF_EXIT_FRESH_CREDENTIALS_REQUIRED = 10, + XF_EXIT_DISCONNECT_BY_USER = 11, + + /* section 16-31: license error set */ + XF_EXIT_LICENSE_INTERNAL = 16, + XF_EXIT_LICENSE_NO_LICENSE_SERVER = 17, + XF_EXIT_LICENSE_NO_LICENSE = 18, + XF_EXIT_LICENSE_BAD_CLIENT_MSG = 19, + XF_EXIT_LICENSE_HWID_DOESNT_MATCH = 20, + XF_EXIT_LICENSE_BAD_CLIENT = 21, + XF_EXIT_LICENSE_CANT_FINISH_PROTOCOL = 22, + XF_EXIT_LICENSE_CLIENT_ENDED_PROTOCOL = 23, + XF_EXIT_LICENSE_BAD_CLIENT_ENCRYPTION = 24, + XF_EXIT_LICENSE_CANT_UPGRADE = 25, + XF_EXIT_LICENSE_NO_REMOTE_CONNECTIONS = 26, + + /* section 32-127: RDP protocol error set */ + XF_EXIT_RDP = 32, + + /* section 128-254: xfreerdp specific exit codes */ + XF_EXIT_PARSE_ARGUMENTS = 128, + XF_EXIT_MEMORY = 129, + XF_EXIT_PROTOCOL = 130, + XF_EXIT_CONN_FAILED = 131, + + XF_EXIT_UNKNOWN = 255, +}; + #ifdef WITH_DEBUG_X11 #define DEBUG_X11(fmt, ...) DEBUG_CLASS(X11, fmt, ## __VA_ARGS__) #else