void DEFAULT_CC term_signal_handler(int sig) { log_message(&log_conf, LOG_LEVEL_DEBUG, "chansrv[term_signal_handler]: " "term_signal_handler: got signal %d", sig); g_set_wait_obj(g_term_event); }
/* called by a worker thread, ask the main thread to call session_sync_start and wait till done */ int DEFAULT_CC session_start(int width, int height, int bpp, char *username, char *password, long data, tui8 type, char *domain, char *program, char *directory, char *client_ip) { int display; /* lock mutex */ lock_sync_acquire(); /* set shared vars */ g_sync_cmd = 0; g_sync_width = width; g_sync_height = height; g_sync_bpp = bpp; g_sync_username = username; g_sync_password = password; g_sync_domain = domain; g_sync_program = program; g_sync_directory = directory; g_sync_client_ip = client_ip; g_sync_data = data; g_sync_type = type; /* set event for main thread to see */ g_set_wait_obj(g_sync_event); /* wait for main thread to get done */ lock_sync_sem_acquire(); /* read result(display) from shared var */ display = g_sync_result; /* unlock mutex */ lock_sync_release(); return display; }
void APP_CC g_set_term(int in_val) { if (in_val) { g_set_wait_obj(g_term_event); } else { g_reset_wait_obj(g_term_event); } }
void DEFAULT_CC xrdp_shutdown(int sig) { tbus threadid; threadid = tc_get_threadid(); g_writeln("shutting down"); g_writeln("signal %d threadid %p", sig, threadid); if (!g_is_wait_obj_set(g_term_event)) { g_set_wait_obj(g_term_event); } }
/* called by a worker thread, ask the main thread to call session_sync_start and wait till done */ int DEFAULT_CC session_reconnect(int display, char *username) { /* lock mutex */ lock_sync_acquire(); /* set shared vars */ g_sync_cmd = 1; g_sync_width = display; g_sync_username = username; /* set event for main thread to see */ g_set_wait_obj(g_sync_event); /* wait for main thread to get done */ lock_sync_sem_acquire(); /* unlock mutex */ lock_sync_release(); return 0; }
static int APP_CC rail_process_exec(struct stream *s, int size) { int flags; int ExeOrFileLength; int WorkingDirLength; int ArgumentsLen; char *ExeOrFile; char *WorkingDir; char *Arguments; LOG(0, ("chansrv::rail_process_exec:")); in_uint16_le(s, flags); in_uint16_le(s, ExeOrFileLength); in_uint16_le(s, WorkingDirLength); in_uint16_le(s, ArgumentsLen); ExeOrFile = read_uni(s, ExeOrFileLength); WorkingDir = read_uni(s, WorkingDirLength); Arguments = read_uni(s, ArgumentsLen); LOG(10, (" flags 0x%8.8x ExeOrFileLength %d WorkingDirLength %d " "ArgumentsLen %d ExeOrFile [%s] WorkingDir [%s] " "Arguments [%s]", flags, ExeOrFileLength, WorkingDirLength, ArgumentsLen, ExeOrFile, WorkingDir, Arguments)); if (g_strlen(ExeOrFile) > 0) { LOG(10, ("rail_process_exec: pre")); /* ask main thread to fork */ tc_mutex_lock(g_exec_mutex); g_exec_name = ExeOrFile; g_set_wait_obj(g_exec_event); tc_sem_dec(g_exec_sem); tc_mutex_unlock(g_exec_mutex); LOG(10, ("rail_process_exec: post")); } g_free(ExeOrFile); g_free(WorkingDir); g_free(Arguments); return 0; }
long APP_CC g_xrdp_sync(long (*sync_func)(long param1, long param2), long sync_param1, long sync_param2) { long sync_result; int sync_command; if (tc_threadid_equal(tc_get_threadid(), g_threadid)) { /* this is the main thread, call the function directly */ sync_result = sync_func(sync_param1, sync_param2); } else { tc_mutex_lock(g_sync1_mutex); tc_mutex_lock(g_sync_mutex); g_sync_param1 = sync_param1; g_sync_param2 = sync_param2; g_sync_func = sync_func; g_sync_command = 100; tc_mutex_unlock(g_sync_mutex); g_set_wait_obj(g_sync_event); do { g_sleep(100); tc_mutex_lock(g_sync_mutex); sync_command = g_sync_command; sync_result = g_sync_result; tc_mutex_unlock(g_sync_mutex); } while (sync_command != 0); tc_mutex_unlock(g_sync1_mutex); } return sync_result; }
void DEFAULT_CC sig_sesman_shutdown(int sig) { char pid_file[256]; log_message(LOG_LEVEL_INFO, "shutting down sesman %d", 1); if (g_getpid() != g_pid) { LOG_DBG("g_getpid() [%d] differs from g_pid [%d]", (g_getpid()), g_pid); return; } LOG_DBG(" - getting signal %d pid %d", sig, g_getpid()); g_set_wait_obj(g_term_event); g_tcp_close(g_sck); session_sigkill_all(); g_snprintf(pid_file, 255, "%s/xrdp-sesman.pid", XRDP_PID_PATH); g_file_delete(pid_file); }
static int APP_CC xrdp_mm_setup_mod2(struct xrdp_mm* self) { char text[256]; char* name = (char *)NULL; char* value = (char *)NULL; int i = 0; int rv = 0; int key_flags = 0; int device_flags = 0; g_memset(text,0,sizeof(char) * 256); rv = 1; text[0] = 0; if (!g_is_wait_obj_set(self->wm->pro_layer->self_term_event)) { if (self->mod->mod_start(self->mod, self->wm->screen->width, self->wm->screen->height, self->wm->screen->bpp) != 0) { g_set_wait_obj(self->wm->pro_layer->self_term_event); /* kill session */ } } if (!g_is_wait_obj_set(self->wm->pro_layer->self_term_event)) { if (self->display > 0) { if (self->code == 0) /* Xvnc */ { g_snprintf(text, 255, "%d", 5900 + self->display); } else if (self->code == 10) /* X11rdp */ { g_snprintf(text, 255, "%d", 6200 + self->display); } else { g_set_wait_obj(self->wm->pro_layer->self_term_event); /* kill session */ } } } if (!g_is_wait_obj_set(self->wm->pro_layer->self_term_event)) { /* this adds the port to the end of the list, it will already be in the list as -1 the module should use the last one */ if (g_strlen(text) > 0) { list_add_item(self->login_names, (long)g_strdup("port")); list_add_item(self->login_values, (long)g_strdup(text)); } /* always set these */ name = self->wm->session->client_info->hostname; self->mod->mod_set_param(self->mod, "hostname", name); g_snprintf(text, 255, "%d", self->wm->session->client_info->keylayout); self->mod->mod_set_param(self->mod, "keylayout", text); for (i = 0; i < self->login_names->count; i++) { name = (char*)list_get_item(self->login_names, i); value = (char*)list_get_item(self->login_values, i); self->mod->mod_set_param(self->mod, name, value); } /* connect */ if (self->mod->mod_connect(self->mod) == 0) { rv = 0; } else { // AUDIT connected Failed AUDIT_FAILED_OPEN( self->wm->pro_layer, "" ); } } if (rv == 0) { // AUDIT connected Ok AUDIT_OPEN( self->wm->pro_layer, "" ); /* sync modifiers */ key_flags = 0; device_flags = 0; if (self->wm->scroll_lock) { key_flags |= 1; } if (self->wm->num_lock) { key_flags |= 2; } if (self->wm->caps_lock) { key_flags |= 4; } if (self->mod != 0) { if (self->mod->mod_event != 0) { self->mod->mod_event(self->mod, 17, key_flags, device_flags, key_flags, device_flags); } } } return rv; }
THREAD_RV THREAD_CC channel_thread_loop(void* in_val) { tbus objs[32]; int num_objs; int timeout; int error; THREAD_RV rv; log_message(&log_conf, LOG_LEVEL_DEBUG, "chansrv[channel_thread_loop]: " "channel_thread_loop: thread start"); rv = 0; error = setup_listen(); if (error == 0) { timeout = 0; num_objs = 0; objs[num_objs] = g_term_event; num_objs++; trans_get_wait_objs(g_lis_trans, objs, &num_objs, &timeout); while (g_obj_wait(objs, num_objs, 0, 0, timeout) == 0) { if (g_is_wait_obj_set(g_term_event)) { log_message(&log_conf, LOG_LEVEL_DEBUG, "chansrv[channel_thread_loop]: " "channel_thread_loop: g_term_event set"); //clipboard_deinit(); //sound_deinit(); //dev_redir_deinit(); //seamrdp_deinit(); user_channel_deinit(); break; } if (g_lis_trans != 0) { if (trans_check_wait_objs(g_lis_trans) != 0) { log_message(&log_conf, LOG_LEVEL_WARNING, "chansrv[channel_thread_loop]: " "trans_check_wait_objs error"); } } if (g_con_trans != 0) { if (trans_check_wait_objs(g_con_trans) != 0) { log_message(&log_conf, LOG_LEVEL_WARNING, "chansrv[channel_thread_loop]: " "trans_check_wait_objs error resetting"); //clipboard_deinit(); //sound_deinit(); //dev_redir_deinit(); //seamrdp_deinit(); user_channel_deinit(); trans_delete(g_con_trans); g_con_trans = 0; error = setup_listen(); if (error != 0) { break; } } } //clipboard_check_wait_objs(); //sound_check_wait_objs(); //dev_redir_check_wait_objs(); //seamrdp_check_wait_objs(); user_channel_check_wait_objs(); timeout = 0; num_objs = 0; objs[num_objs] = g_term_event; num_objs++; trans_get_wait_objs(g_lis_trans, objs, &num_objs, &timeout); trans_get_wait_objs(g_con_trans, objs, &num_objs, &timeout); //clipboard_get_wait_objs(objs, &num_objs, &timeout); //sound_get_wait_objs(objs, &num_objs, &timeout); //dev_redir_get_wait_objs(objs, &num_objs, &timeout); //seamrdp_get_wait_objs(objs, &num_objs, &timeout); user_channel_get_wait_objs(objs, &num_objs, &timeout); } } trans_delete(g_lis_trans); g_lis_trans = 0; trans_delete(g_con_trans); g_con_trans = 0; log_message(&log_conf, LOG_LEVEL_DEBUG, "chansrv[channel_thread_loop]: " "channel_thread_loop: thread stop"); g_set_wait_obj(g_thread_done_event); return rv; }
int APP_CC xrdp_process_main_loop(struct xrdp_process* self) { int robjs_count; int wobjs_count; int cont; int timeout = 0; tbus robjs[32]; tbus wobjs[32]; tbus term_obj; DEBUG(("xrdp_process_main_loop")); self->status = 1; self->server_trans->trans_data_in = xrdp_process_data_in; self->server_trans->callback_data = self; self->session = libxrdp_init((tbus)self, self->server_trans); /* this callback function is in xrdp_wm.c */ self->session->callback = callback; /* this function is just above */ self->session->is_term = xrdp_is_term; if (libxrdp_process_incomming(self->session) == 0) { term_obj = g_get_term_event(); cont = 1; while (cont) { /* build the wait obj list */ timeout = -1; robjs_count = 0; wobjs_count = 0; robjs[robjs_count++] = term_obj; robjs[robjs_count++] = self->self_term_event; xrdp_wm_get_wait_objs(self->wm, robjs, &robjs_count, wobjs, &wobjs_count, &timeout); trans_get_wait_objs(self->server_trans, robjs, &robjs_count, &timeout); /* wait */ if (g_obj_wait(robjs, robjs_count, wobjs, wobjs_count, timeout) != 0) { /* error, should not get here */ g_sleep(100); } if (g_is_wait_obj_set(term_obj)) /* term */ { break; } if (g_is_wait_obj_set(self->self_term_event)) { break; } if (xrdp_wm_check_wait_objs(self->wm) != 0) { break; } if (trans_check_wait_objs(self->server_trans) != 0) { break; } } libxrdp_disconnect(self->session); } xrdp_process_mod_end(self); libxrdp_exit(self->session); self->session = 0; self->status = -1; g_set_wait_obj(self->done_event); return 0; }
int APP_CC xrdp_process_main_loop(struct xrdp_process* self) { int robjs_count; int wobjs_count; int cont; int timeout; tbus robjs[32]; tbus wobjs[32]; tbus term_obj; tbus sck_obj; self->status = 1; self->session = libxrdp_init((long)self, self->sck); /* this callback function is in xrdp_wm.c */ self->session->callback = callback; /* this function is just above */ self->session->is_term = xrdp_is_term; g_tcp_set_non_blocking(self->sck); g_tcp_set_no_delay(self->sck); if (libxrdp_process_incomming(self->session) == 0) { term_obj = g_get_term_event(); sck_obj = g_create_wait_obj_from_socket(self->sck, 0); cont = 1; while (cont) { /* build the wait obj list */ timeout = -1; robjs_count = 0; wobjs_count = 0; robjs[robjs_count++] = term_obj; robjs[robjs_count++] = sck_obj; robjs[robjs_count++] = self->self_term_event; xrdp_wm_get_wait_objs(self->wm, robjs, &robjs_count, wobjs, &wobjs_count, &timeout); /* wait */ if (g_obj_wait(robjs, robjs_count, wobjs, wobjs_count, timeout) != 0) { /* error, should not get here */ g_sleep(100); } if (g_is_wait_obj_set(term_obj)) /* term */ { break; } if (g_is_wait_obj_set(self->self_term_event)) { break; } if (g_is_wait_obj_set(sck_obj)) /* incomming client data */ { if (xrdp_process_loop(self) != 0) { break; } } if (xrdp_wm_check_wait_objs(self->wm) != 0) { break; } } g_delete_wait_obj_from_socket(sck_obj); libxrdp_disconnect(self->session); } xrdp_process_mod_end(self); libxrdp_exit(self->session); self->session = 0; g_tcp_close(self->sck); self->status = -1; g_set_wait_obj(self->done_event); return 0; }
int APP_CC xrdp_process_main_loop(struct xrdp_process *self) { int robjs_count; int wobjs_count; int cont; int timeout = 0; tbus robjs[32]; tbus wobjs[32]; tbus term_obj; DEBUG(("xrdp_process_main_loop")); self->status = 1; self->server_trans->extra_flags = 0; self->server_trans->header_size = 0; self->server_trans->no_stream_init_on_data_in = 1; self->server_trans->trans_data_in = xrdp_process_data_in; self->server_trans->callback_data = self; init_stream(self->server_trans->in_s, 8192 * 4); self->session = libxrdp_init((tbus)self, self->server_trans); self->server_trans->si = &(self->session->si); self->server_trans->my_source = XRDP_SOURCE_CLIENT; /* this callback function is in xrdp_wm.c */ self->session->callback = callback; /* this function is just above */ self->session->is_term = xrdp_is_term; if (libxrdp_process_incoming(self->session) == 0) { init_stream(self->server_trans->in_s, 32 * 1024); term_obj = g_get_term_event(); cont = 1; while (cont) { /* build the wait obj list */ timeout = -1; robjs_count = 0; wobjs_count = 0; robjs[robjs_count++] = term_obj; robjs[robjs_count++] = self->self_term_event; xrdp_wm_get_wait_objs(self->wm, robjs, &robjs_count, wobjs, &wobjs_count, &timeout); trans_get_wait_objs_rw(self->server_trans, robjs, &robjs_count, wobjs, &wobjs_count, &timeout); /* wait */ if (g_obj_wait(robjs, robjs_count, wobjs, wobjs_count, timeout) != 0) { /* error, should not get here */ g_sleep(100); } if (g_is_wait_obj_set(term_obj)) /* term */ { break; } if (g_is_wait_obj_set(self->self_term_event)) { break; } if (xrdp_wm_check_wait_objs(self->wm) != 0) { break; } if (trans_check_wait_objs(self->server_trans) != 0) { break; } } /* send disconnect message if possible */ libxrdp_disconnect(self->session); } else { g_writeln("xrdp_process_main_loop: libxrdp_process_incoming failed"); /* this will try to send a disconnect, maybe should check that connection got far enough */ libxrdp_disconnect(self->session); } /* Run end in module */ xrdp_process_mod_end(self); libxrdp_exit(self->session); self->session = 0; self->status = -1; g_set_wait_obj(self->done_event); return 0; }
void DEFAULT_CC term_signal_handler(int sig) { LOGM((LOG_LEVEL_INFO, "term_signal_handler: got signal %d", sig)); g_set_wait_obj(g_term_event); }
THREAD_RV THREAD_CC channel_thread_loop(void *in_val) { tbus objs[32]; int num_objs; int timeout; int error; THREAD_RV rv; LOGM((LOG_LEVEL_INFO, "channel_thread_loop: thread start")); rv = 0; setup_api_listen(); error = setup_listen(); if (error == 0) { timeout = -1; num_objs = 0; objs[num_objs] = g_term_event; num_objs++; trans_get_wait_objs(g_lis_trans, objs, &num_objs); trans_get_wait_objs(g_api_lis_trans, objs, &num_objs); while (g_obj_wait(objs, num_objs, 0, 0, timeout) == 0) { if (g_is_wait_obj_set(g_term_event)) { LOGM((LOG_LEVEL_INFO, "channel_thread_loop: g_term_event set")); clipboard_deinit(); sound_deinit(); dev_redir_deinit(); rail_deinit(); break; } if (g_lis_trans != 0) { if (trans_check_wait_objs(g_lis_trans) != 0) { LOGM((LOG_LEVEL_INFO, "channel_thread_loop: " "trans_check_wait_objs error")); } } if (g_con_trans != 0) { if (trans_check_wait_objs(g_con_trans) != 0) { LOGM((LOG_LEVEL_INFO, "channel_thread_loop: " "trans_check_wait_objs error resetting")); clipboard_deinit(); sound_deinit(); dev_redir_deinit(); rail_deinit(); /* delete g_con_trans */ trans_delete(g_con_trans); g_con_trans = 0; /* create new listener */ error = setup_listen(); if (error != 0) { break; } } } if (g_api_lis_trans != 0) { if (trans_check_wait_objs(g_api_lis_trans) != 0) { LOG(0, ("channel_thread_loop: trans_check_wait_objs failed")); } } LOG(10, ("0 %p", g_api_con_trans)); if (g_api_con_trans != 0) { LOG(10, ("1 %p %d", g_api_con_trans, g_tcp_can_recv(g_api_con_trans->sck, 0))); if (trans_check_wait_objs(g_api_con_trans) != 0) { LOG(10, ("channel_thread_loop: trans_check_wait_objs failed, " "or disconnected")); g_free(g_api_con_trans->callback_data); trans_delete(g_api_con_trans); g_api_con_trans = 0; } } xcommon_check_wait_objs(); sound_check_wait_objs(); dev_redir_check_wait_objs(); fuse_check_wait_objs(); timeout = -1; num_objs = 0; objs[num_objs] = g_term_event; num_objs++; trans_get_wait_objs(g_lis_trans, objs, &num_objs); trans_get_wait_objs(g_con_trans, objs, &num_objs); trans_get_wait_objs(g_api_lis_trans, objs, &num_objs); trans_get_wait_objs(g_api_con_trans, objs, &num_objs); xcommon_get_wait_objs(objs, &num_objs, &timeout); sound_get_wait_objs(objs, &num_objs, &timeout); dev_redir_get_wait_objs(objs, &num_objs, &timeout); fuse_get_wait_objs(objs, &num_objs, &timeout); } } trans_delete(g_lis_trans); g_lis_trans = 0; trans_delete(g_con_trans); g_con_trans = 0; trans_delete(g_api_lis_trans); g_api_lis_trans = 0; trans_delete(g_api_con_trans); g_api_con_trans = 0; LOGM((LOG_LEVEL_INFO, "channel_thread_loop: thread stop")); g_set_wait_obj(g_thread_done_event); return rv; }