Merge pull request #184 from OSSystems/master

X11: exit codes
This commit is contained in:
Marc-André Moreau 2011-10-25 09:17:25 -07:00
commit a211ca3c1a
6 changed files with 88 additions and 12 deletions

View File

@ -67,6 +67,7 @@
freerdp_sem g_sem; freerdp_sem g_sem;
static int g_thread_count = 0; static int g_thread_count = 0;
static uint8 g_disconnect_reason = 0;
static long xv_port = 0; static long xv_port = 0;
const size_t password_size = 512; 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) xf_process_plugin_args, instance->context->channels, xf_process_client_args, xfi) < 0)
{ {
printf("failed to parse arguments.\n"); printf("failed to parse arguments.\n");
exit(0); exit(XF_EXIT_PARSE_ARGUMENTS);
} }
settings = instance->settings; settings = instance->settings;
@ -866,12 +867,13 @@ int xfreerdp_run(freerdp* instance)
fd_set rfds_set; fd_set rfds_set;
fd_set wfds_set; fd_set wfds_set;
rdpChannels* channels; rdpChannels* channels;
int ret = 0;
memset(rfds, 0, sizeof(rfds)); memset(rfds, 0, sizeof(rfds));
memset(wfds, 0, sizeof(wfds)); memset(wfds, 0, sizeof(wfds));
if (!freerdp_connect(instance)) if (!freerdp_connect(instance))
return 0; return XF_EXIT_CONN_FAILED;
xfi = ((xfContext*) instance->context)->xfi; xfi = ((xfContext*) instance->context)->xfi;
channels = instance->context->channels; channels = instance->context->channels;
@ -884,16 +886,19 @@ int xfreerdp_run(freerdp* instance)
if (freerdp_get_fds(instance, rfds, &rcount, wfds, &wcount) != True) if (freerdp_get_fds(instance, rfds, &rcount, wfds, &wcount) != True)
{ {
printf("Failed to get FreeRDP file descriptor\n"); printf("Failed to get FreeRDP file descriptor\n");
ret = XF_EXIT_CONN_FAILED;
break; break;
} }
if (freerdp_channels_get_fds(channels, instance, rfds, &rcount, wfds, &wcount) != True) if (freerdp_channels_get_fds(channels, instance, rfds, &rcount, wfds, &wcount) != True)
{ {
printf("Failed to get channel manager file descriptor\n"); printf("Failed to get channel manager file descriptor\n");
ret = XF_EXIT_CONN_FAILED;
break; break;
} }
if (xf_get_fds(instance, rfds, &rcount, wfds, &wcount) != True) if (xf_get_fds(instance, rfds, &rcount, wfds, &wcount) != True)
{ {
printf("Failed to get xfreerdp file descriptor\n"); printf("Failed to get xfreerdp file descriptor\n");
ret = XF_EXIT_CONN_FAILED;
break; break;
} }
@ -945,6 +950,9 @@ int xfreerdp_run(freerdp* instance)
xf_process_channel_event(channels, instance); xf_process_channel_event(channels, instance);
} }
if (!ret)
ret = freerdp_error_info(instance);
freerdp_channels_close(channels, instance); freerdp_channels_close(channels, instance);
freerdp_channels_free(channels); freerdp_channels_free(channels);
freerdp_disconnect(instance); freerdp_disconnect(instance);
@ -952,7 +960,7 @@ int xfreerdp_run(freerdp* instance)
freerdp_free(instance); freerdp_free(instance);
xf_free(xfi); xf_free(xfi);
return 0; return ret;
} }
void* thread_func(void* param) void* thread_func(void* param)
@ -960,7 +968,7 @@ void* thread_func(void* param)
struct thread_data* data; struct thread_data* data;
data = (struct thread_data*) param; data = (struct thread_data*) param;
xfreerdp_run(data->instance); g_disconnect_reason = xfreerdp_run(data->instance);
xfree(data); xfree(data);
@ -974,6 +982,27 @@ void* thread_func(void* param)
return NULL; 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[]) int main(int argc, char* argv[])
{ {
pthread_t thread; pthread_t thread;
@ -1022,5 +1051,5 @@ int main(int argc, char* argv[])
freerdp_channels_global_uninit(); freerdp_channels_global_uninit();
return 0; return exit_code_from_disconnect_reason(g_disconnect_reason);
} }

View File

@ -147,6 +147,47 @@ struct xf_info
void xf_toggle_fullscreen(xfInfo* xfi); void xf_toggle_fullscreen(xfInfo* xfi);
boolean xf_post_connect(freerdp* instance); 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 #ifdef WITH_DEBUG_X11
#define DEBUG_X11(fmt, ...) DEBUG_CLASS(X11, fmt, ## __VA_ARGS__) #define DEBUG_X11(fmt, ...) DEBUG_CLASS(X11, fmt, ## __VA_ARGS__)
#else #else

View File

@ -100,6 +100,8 @@ FREERDP_API boolean freerdp_disconnect(freerdp* instance);
FREERDP_API boolean freerdp_get_fds(freerdp* instance, void** rfds, int* rcount, void** wfds, int* wcount); FREERDP_API boolean freerdp_get_fds(freerdp* instance, void** rfds, int* rcount, void** wfds, int* wcount);
FREERDP_API boolean freerdp_check_fds(freerdp* instance); FREERDP_API boolean freerdp_check_fds(freerdp* instance);
FREERDP_API uint32 freerdp_error_info(freerdp* instance);
FREERDP_API freerdp* freerdp_new(); FREERDP_API freerdp* freerdp_new();
FREERDP_API void freerdp_free(freerdp* instance); FREERDP_API void freerdp_free(freerdp* instance);

View File

@ -151,6 +151,11 @@ void freerdp_context_free(freerdp* instance)
IFCALL(instance->ContextFree, instance, instance->context); IFCALL(instance->ContextFree, instance, instance->context);
} }
uint32 freerdp_error_info(freerdp* instance)
{
return instance->context->rdp->errorInfo;
}
freerdp* freerdp_new() freerdp* freerdp_new()
{ {
freerdp* instance; freerdp* instance;

View File

@ -425,14 +425,12 @@ boolean rdp_send_data_pdu(rdpRdp* rdp, STREAM* s, uint8 type, uint16 channel_id)
return True; return True;
} }
void rdp_recv_set_error_info_data_pdu(STREAM* s) void rdp_recv_set_error_info_data_pdu(rdpRdp* rdp, STREAM* s)
{ {
uint32 errorInfo; stream_read_uint32(s, rdp->errorInfo); /* errorInfo (4 bytes) */
stream_read_uint32(s, errorInfo); /* errorInfo (4 bytes) */ if (rdp->errorInfo != ERRINFO_SUCCESS)
rdp_print_errinfo(rdp->errorInfo);
if (errorInfo != ERRINFO_SUCCESS)
rdp_print_errinfo(errorInfo);
} }
void rdp_recv_data_pdu(rdpRdp* rdp, STREAM* s) void rdp_recv_data_pdu(rdpRdp* rdp, STREAM* s)
@ -514,7 +512,7 @@ void rdp_recv_data_pdu(rdpRdp* rdp, STREAM* s)
break; break;
case DATA_PDU_TYPE_SET_ERROR_INFO: case DATA_PDU_TYPE_SET_ERROR_INFO:
rdp_recv_set_error_info_data_pdu(s); rdp_recv_set_error_info_data_pdu(rdp, s);
break; break;
case DATA_PDU_TYPE_DRAW_NINEGRID_ERROR: case DATA_PDU_TYPE_DRAW_NINEGRID_ERROR:

View File

@ -144,6 +144,7 @@ struct rdp_rdp
uint8 fips_sign_key[20]; uint8 fips_sign_key[20];
uint8 fips_encrypt_key[24]; uint8 fips_encrypt_key[24];
uint8 fips_decrypt_key[24]; uint8 fips_decrypt_key[24];
uint32 errorInfo;
}; };
void rdp_read_security_header(STREAM* s, uint16* flags); void rdp_read_security_header(STREAM* s, uint16* flags);