diff options
Diffstat (limited to 'sesman/chansrv/chansrv.c')
-rw-r--r-- | sesman/chansrv/chansrv.c | 147 |
1 files changed, 104 insertions, 43 deletions
diff --git a/sesman/chansrv/chansrv.c b/sesman/chansrv/chansrv.c index 84a973f0..d1f8c3d2 100644 --- a/sesman/chansrv/chansrv.c +++ b/sesman/chansrv/chansrv.c @@ -37,7 +37,7 @@ static int g_rdpsnd_index = -1; static int g_rdpdr_index = -1; tbus g_term_event = 0; -int g_display = 0; +int g_display_num = 0; int g_cliprdr_chan_id = -1; /* cliprdr */ int g_rdpsnd_chan_id = -1; /* rdpsnd */ int g_rdpdr_chan_id = -1; /* rdpdr */ @@ -100,7 +100,7 @@ send_init_response_message(void) { struct stream* s; - g_writeln("xrdp-chansrv: in send_init_response_message"); + g_writeln("xrdp-chansrv: send_init_response_message:"); s = trans_get_out_s(g_con_trans, 8192); if (s == 0) { @@ -121,7 +121,7 @@ send_channel_setup_response_message(void) { struct stream* s; - g_writeln("xrdp-chansrv: in send_channel_setup_response_message"); + g_writeln("xrdp-chansrv: send_channel_setup_response_message:"); s = trans_get_out_s(g_con_trans, 8192); if (s == 0) { @@ -142,7 +142,7 @@ send_channel_data_response_message(void) { struct stream* s; - g_writeln("xrdp-chansrv: in send_channel_data_response_message"); + g_writeln("xrdp-chansrv: send_channel_data_response_message:"); s = trans_get_out_s(g_con_trans, 8192); if (s == 0) { @@ -161,7 +161,7 @@ send_channel_data_response_message(void) static int APP_CC process_message_init(struct stream* s) { - g_writeln("xrdp-chansrv: in process_message_init"); + g_writeln("xrdp-chansrv: process_message_init:"); return send_init_response_message(); } @@ -175,9 +175,10 @@ process_message_channel_setup(struct stream* s) int rv; struct chan_item* ci; - g_writeln("xrdp-chansrv: in process_message_channel_setup"); + g_writeln("xrdp-chansrv: process_message_channel_setup:"); in_uint16_le(s, num_chans); - g_writeln("xrdp-chansrv: num_chans %d", num_chans); + g_writeln("xrdp-chansrv: process_message_channel_setup: num_chans %d", + num_chans); for (index = 0; index < num_chans; index++) { ci = &(g_chan_items[g_num_chan_items]); @@ -185,8 +186,8 @@ process_message_channel_setup(struct stream* s) in_uint8a(s, ci->name, 8); in_uint16_le(s, ci->id); in_uint16_le(s, ci->flags); - g_writeln("xrdp-chansrv: chan name %s id %d flags %8.8x", - ci->name, ci->id, ci->flags); + g_writeln("xrdp-chansrv: process_message_channel_setup: chan name %s " + "id %d flags %8.8x", ci->name, ci->id, ci->flags); if (g_strcasecmp(ci->name, "cliprdr") == 0) { g_cliprdr_index = g_num_chan_items; @@ -235,8 +236,8 @@ process_message_channel_data(struct stream* s) in_uint16_le(s, chan_flags); in_uint16_le(s, length); in_uint32_le(s, total_length); - g_writeln("xrdp-chansrv: log channel data chan_id %d chan_flags %d", - chan_id, chan_flags); + g_writeln("xrdp-chansrv: process_message_channel_data: chan_id %d " + "chan_flags %d", chan_id, chan_flags); rv = send_channel_data_response_message(); if (rv == 0) { @@ -261,7 +262,7 @@ process_message_channel_data(struct stream* s) static int APP_CC process_message_channel_data_response(struct stream* s) { - g_writeln("xrdp-chansrv: in process_message_channel_data_response"); + g_writeln("xrdp-chansrv: process_message_channel_data_response:"); return 0; } @@ -307,8 +308,8 @@ process_message(void) rv = process_message_channel_data_response(s); break; default: - g_writeln("xrdp-chansrv: error in process_message unknown msg %d", - id); + g_writeln("xrdp-chansrv: process_message: error in process_message " + "unknown msg %d", id); break; } if (rv != 0) @@ -338,7 +339,7 @@ my_trans_data_in(struct trans* trans) { return 1; } - g_writeln("xrdp-chansrv: my_trans_data_in"); + g_writeln("xrdp-chansrv: my_trans_data_in:"); s = trans_get_in_s(trans); in_uint32_le(s, id); in_uint32_le(s, size); @@ -371,7 +372,7 @@ my_trans_conn_in(struct trans* trans, struct trans* new_trans) { return 1; } - g_writeln("xrdp-chansrv: my_trans_conn_in"); + g_writeln("xrdp-chansrv: my_trans_conn_in:"); g_con_trans = new_trans; g_con_trans->trans_data_in = my_trans_data_in; g_con_trans->header_size = 8; @@ -394,11 +395,11 @@ setup_listen(void) } g_lis_trans = trans_create(1, 8192, 8192); g_lis_trans->trans_conn_in = my_trans_conn_in; - g_snprintf(text, 255, "%d", 7200 + g_display); + g_snprintf(text, 255, "%d", 7200 + g_display_num); error = trans_listen(g_lis_trans, text); if (error != 0) { - g_writeln("xrdp-chansrv: trans_listen failed"); + g_writeln("xrdp-chansrv: setup_listen: trans_listen failed"); return 1; } return 0; @@ -414,7 +415,7 @@ channel_thread_loop(void* in_val) int error; THREAD_RV rv; - g_writeln("xrdp-chansrv: thread start"); + g_writeln("xrdp-chansrv: channel_thread_loop: thread start"); rv = 0; error = setup_listen(); if (error == 0) @@ -428,21 +429,26 @@ channel_thread_loop(void* in_val) { if (g_is_wait_obj_set(g_term_event)) { - g_writeln("xrdp-chansrv: g_term_event set"); + g_writeln("xrdp-chansrv: channel_thread_loop: g_term_event set"); + clipboard_deinit(); + sound_deinit(); + dev_redir_deinit(); break; } if (g_lis_trans != 0) { if (trans_check_wait_objs(g_lis_trans) != 0) { - g_writeln("xrdp-chansrv: trans_check_wait_objs error"); + g_writeln("xrdp-chansrv: channel_thread_loop: " + "trans_check_wait_objs error"); } } if (g_con_trans != 0) { if (trans_check_wait_objs(g_con_trans) != 0) { - g_writeln("xrdp-chansrv: trans_check_wait_objs error resetting"); + g_writeln("xrdp-chansrv: channel_thread_loop: " + "trans_check_wait_objs error resetting"); /* delete g_con_trans */ trans_delete(g_con_trans); g_con_trans = 0; @@ -472,7 +478,7 @@ channel_thread_loop(void* in_val) g_lis_trans = 0; trans_delete(g_con_trans); g_con_trans = 0; - g_writeln("xrdp-chansrv: thread stop"); + g_writeln("xrdp-chansrv: channel_thread_loop: thread stop"); g_set_wait_obj(g_thread_done_event); return rv; } @@ -493,6 +499,58 @@ nil_signal_handler(int sig) } /*****************************************************************************/ +static int APP_CC +get_display_num_from_display(char* display_text) +{ + int index; + int mode; + int host_index; + int disp_index; + int scre_index; + char host[256]; + char disp[256]; + char scre[256]; + + index = 0; + host_index = 0; + disp_index = 0; + scre_index = 0; + mode = 0; + while (display_text[index] != 0) + { + if (display_text[index] == ':') + { + mode = 1; + } + else if (display_text[index] == '.') + { + mode = 2; + } + else if (mode == 0) + { + host[host_index] = display_text[index]; + host_index++; + } + else if (mode == 1) + { + disp[disp_index] = display_text[index]; + disp_index++; + } + else if (mode == 2) + { + scre[scre_index] = display_text[index]; + scre_index++; + } + index++; + } + host[host_index] = 0; + disp[disp_index] = 0; + scre[scre_index] = 0; + g_display_num = g_atoi(disp); + return 0; +} + +/*****************************************************************************/ int DEFAULT_CC main(int argc, char** argv) { @@ -500,45 +558,48 @@ main(int argc, char** argv) char text[256]; char* display_text; + g_init(); /* os_calls */ pid = g_getpid(); - g_writeln("xrdp-chansrv: app started pid %d(0x%8.8x)", pid, pid); + g_writeln("xrdp-chansrv: main: app started pid %d(0x%8.8x)", pid, pid); g_signal_kill(term_signal_handler); /* SIGKILL */ g_signal_terminate(term_signal_handler); /* SIGTERM */ g_signal_user_interrupt(term_signal_handler); /* SIGINT */ g_signal_pipe(nil_signal_handler); /* SIGPIPE */ - display_text = g_getenv("XRDP_SESSVC_DISPLAY"); - if (display_text == 0) + display_text = g_getenv("DISPLAY"); + g_writeln("xrdp-chansrv: main: DISPLAY env var set to %s", display_text); + get_display_num_from_display(display_text); + if (g_display_num == 0) { - g_writeln("xrdp-chansrv: error, XRDP_SESSVC_DISPLAY not set"); + g_writeln("xrdp-chansrv: main: error, display is zero"); return 1; } - else - { - g_display = g_atoi(display_text); - } - if (g_display == 0) - { - g_writeln("xrdp-chansrv: error, display is zero"); - return 1; - } - g_writeln("xrdp-chansrv: using DISPLAY %d", g_display); + g_writeln("xrdp-chansrv: main: using DISPLAY %d", g_display_num); g_snprintf(text, 255, "xrdp_chansrv_%8.8x_main_term", pid); g_term_event = g_create_wait_obj(text); g_snprintf(text, 255, "xrdp_chansrv_%8.8x_thread_done", pid); g_thread_done_event = g_create_wait_obj(text); tc_thread_create(channel_thread_loop, 0); - if (g_obj_wait(&g_term_event, 1, 0, 0, 0) != 0) + while (!g_is_wait_obj_set(g_term_event)) { - g_writeln("xrdp-chansrv: error, g_obj_wait failed"); + if (g_obj_wait(&g_term_event, 1, 0, 0, 0) != 0) + { + g_writeln("xrdp-chansrv: main: error, g_obj_wait failed"); + break; + } } - /* wait for thread to exit */ - if (g_obj_wait(&g_thread_done_event, 1, 0, 0, 0) != 0) + while (!g_is_wait_obj_set(g_thread_done_event)) { - g_writeln("xrdp-chansrv: error, g_obj_wait failed"); + /* wait for thread to exit */ + if (g_obj_wait(&g_thread_done_event, 1, 0, 0, 0) != 0) + { + g_writeln("xrdp-chansrv: main: error, g_obj_wait failed"); + break; + } } /* cleanup */ g_delete_wait_obj(g_term_event); g_delete_wait_obj(g_thread_done_event); - g_writeln("xrdp-chansrv: app exiting pid %d(0x%8.8x)", pid, pid); + g_writeln("xrdp-chansrv: main: app exiting pid %d(0x%8.8x)", pid, pid); + g_deinit(); /* os_calls */ return 0; } |