int DEFAULT_CC xml_send_info(int client, xmlDocPtr doc) { xmlChar* xmlbuff; int buff_size, size; struct stream* s; xmlDocDumpFormatMemory(doc, &xmlbuff, &buff_size, 1); log_message(&(g_cfg->log), LOG_LEVEL_DEBUG_PLUS, "sesman[xml_send_info]: " "data send : %s\n",xmlbuff); make_stream(s); init_stream(s, buff_size + 6); out_uint32_be(s,buff_size); out_uint8p(s, xmlbuff, buff_size) size = s->p - s->data; if (g_tcp_can_send(client, 10)) { int sended = 0; int send = 0; while(sended < size) { send = (size-sended) > 2048 ? 2048 : size-sended; sended += g_tcp_send(client, s->data+sended, send, 0); if (sended < size) { if (g_get_errno() != 0) { log_message(&(g_cfg->log), LOG_LEVEL_DEBUG_PLUS, "sesman[xml_send_info]: " "Error while send %s\n",g_get_strerror()); goto end; } } } if (sended != size) { log_message(&(g_cfg->log), LOG_LEVEL_DEBUG_PLUS, "sesman[xml_send_info]: " "Error while sending data %i != %i\n",sended, size); } } else { log_message(&(g_cfg->log), LOG_LEVEL_DEBUG_PLUS, "sesman[xml_send_info]: " "Unable to send xml response: %s, cause: %s", xmlbuff, strerror(g_get_errno())); } end: free_stream(s); xmlFree(xmlbuff); return buff_size; }
THREAD_RV THREAD_CC admin_thread(void* param) { int server = g_create_unix_socket(MANAGEMENT_SOCKET_NAME); g_chmod_hex(MANAGEMENT_SOCKET_NAME, 0xFFFF); log_message(&(g_cfg->log), LOG_LEVEL_INFO, "sesman[admin_thread]: " "Create pool thread"); pool = thread_pool_init_pool(g_cfg->sess.management_thread_count); log_message(&(g_cfg->log), LOG_LEVEL_INFO, "sesman[admin_thread]: " "Start pool thread"); thread_pool_start_pool_thread(pool, thread_routine); xmlInitParser(); while(1) { log_message(&(g_cfg->log), LOG_LEVEL_DEBUG_PLUS, "sesman[admin_thread]: " "wait connection"); int client = g_wait_connection(server); log_message(&(g_cfg->log), LOG_LEVEL_DEBUG_PLUS, "sesman[process_request]: " "New client connection [%i]",client); if (client < 0) { log_message(&(g_cfg->log), LOG_LEVEL_WARNING, "sesman[process_request]: " "Unable to get client from management socket [%s]", strerror(g_get_errno())); continue; } thread_pool_push_job(pool, client); } }
xmlDocPtr DEFAULT_CC xml_receive_message(int client) { struct stream* s; int data_length; int res = 0; make_stream(s); init_stream(s, 1024); xmlDocPtr doc; res= g_tcp_recv(client, s->data, sizeof(int), 0); if (res != sizeof(int)) { log_message(&(g_cfg->log), LOG_LEVEL_DEBUG, "sesman[xml_received_message]: " "Unable to read size header with error %s", strerror(g_get_errno())); return NULL; } in_uint32_be(s,data_length); log_message(&(g_cfg->log), LOG_LEVEL_DEBUG_PLUS, "sesman[xml_received_message]: " "data_length : %i", data_length); free_stream(s); make_stream(s); init_stream(s, data_length + 1); g_tcp_recv(client, s->data, data_length, 0); s->data[data_length] = 0; log_message(&(g_cfg->log), LOG_LEVEL_DEBUG_PLUS, "sesman[xml_received_message]: " "data : %s",s->data); doc = xmlReadMemory(s->data, data_length, "noname.xml", NULL, 0); free_stream(s); return doc; }
void DEFAULT_CC printerd_main_loop() { int server = g_create_unix_socket(PRINTER_SOCKET_NAME); g_chmod_hex(PRINTER_SOCKET_NAME, 0xFFFF); log_message(l_config, LOG_LEVEL_INFO, "xrdp_printer[printer_main_loop]: " "Create pool thread [%i]", thread_count); pool = thread_pool_init_pool(thread_count); log_message(l_config, LOG_LEVEL_INFO, "xrdp_printer[printer_main_loop]: " "Start pool thread"); thread_pool_start_pool_thread(pool, thread_routine); xmlInitParser(); printer_purge_all(); while (stop == 0) { log_message(l_config, LOG_LEVEL_DEBUG, "xrdp_printer[printer_main_loop]: " "wait connection"); int client = g_wait_connection(server); log_message(l_config, LOG_LEVEL_DEBUG_PLUS, "xrdp_printer[printer_main_loop]: " "New client connection [%i]",client); if (client < 0) { log_message(l_config, LOG_LEVEL_WARNING, "xrdp_printer[printer_main_loop]: " "Unable to get client from management socket [%s]", strerror(g_get_errno())); continue; } thread_pool_push_job(pool, client); } }
int DEFAULT_CC xml_send_error(int client, const char* message) { xmlChar* xmlbuff; xmlDocPtr doc; xmlNodePtr node; struct stream* s; int buff_size, size; xmlChar* version; xmlChar* error; xmlChar* msg; version = xmlCharStrdup("1.0"); doc = xmlNewDoc(version); if (doc == NULL) { log_message(&(g_cfg->log), LOG_LEVEL_WARNING, "sesman[xml_send_error]: " "Unable to create the document"); xmlFree(version); return 0; } error = xmlCharStrdup("error"); msg = xmlCharStrdup(message); doc->encoding = xmlCharStrdup("UTF-8"); node = xmlNewNode(NULL, error); xmlNodeSetContent(node, msg); xmlDocSetRootElement(doc, node); xmlDocDumpFormatMemory(doc, &xmlbuff, &buff_size, 1); log_message(&(g_cfg->log), LOG_LEVEL_WARNING, "sesman[xml_send_error]: " "data send : %s",xmlbuff); make_stream(s); init_stream(s, buff_size + 6); out_uint32_be(s,buff_size); out_uint8p(s, xmlbuff, buff_size) size = s->p - s->data; if (g_tcp_can_send(client, 10)) { buff_size = g_tcp_send(client, s->data, size, 0); } else { log_message(&(g_cfg->log), LOG_LEVEL_DEBUG_PLUS, "sesman[xml_send_error]: " "Unable to send xml response: %s, cause: %s", xmlbuff, strerror(g_get_errno())); } free_stream(s); xmlFreeDoc(doc); xmlFree(xmlbuff); xmlFree(version); xmlFree(error); xmlFree(msg); return buff_size; }
/** * * @brief Starts sesman main loop * */ static void DEFAULT_CC sesman_main_loop(void) { int in_sck; int error; int robjs_count; int cont; tbus sck_obj; tbus robjs[8]; /*main program loop*/ log_message(&(g_cfg->log), LOG_LEVEL_INFO, "sesman[sesman_main_loop]: " "listening..."); g_sck = g_tcp_socket(); g_tcp_set_non_blocking(g_sck); error = scp_tcp_bind(g_sck, g_cfg->listen_address, g_cfg->listen_port); if (error == 0) { error = g_tcp_listen(g_sck); if (error == 0) { sck_obj = g_create_wait_obj_from_socket(g_sck, 0); cont = 1; while (cont) { /* build the wait obj list */ robjs_count = 0; robjs[robjs_count++] = sck_obj; robjs[robjs_count++] = g_term_event; robjs[robjs_count++] = g_sync_event; /* wait */ if (g_obj_wait(robjs, robjs_count, 0, 0, -1) != 0) { /* error, should not get here */ g_sleep(100); } if (g_is_wait_obj_set(g_term_event)) /* term */ { break; } if (g_is_wait_obj_set(g_sync_event)) /* sync */ { g_reset_wait_obj(g_sync_event); session_sync_start(); } if (g_is_wait_obj_set(sck_obj)) /* incomming connection */ { in_sck = g_tcp_accept(g_sck); if ((in_sck == -1) && g_tcp_last_error_would_block(g_sck)) { /* should not get here */ g_sleep(100); } else if (in_sck == -1) { /* error, should not get here */ break; } else { /* we've got a connection, so we pass it to scp code */ log_message(&(g_cfg->log), LOG_LEVEL_INFO, "sesman[sesman_main_loop]: " "new connection"); thread_scp_start(in_sck); /* todo, do we have to wait here ? */ } } } g_delete_wait_obj_from_socket(sck_obj); } else { log_message(&(g_cfg->log), LOG_LEVEL_ERROR, "sesman[sesman_main_loop]: " "listen error %d (%s)", g_get_errno(), g_get_strerror()); } } else { log_message(&(g_cfg->log), LOG_LEVEL_ERROR, "bind error on " "port '%s': %d (%s)", g_cfg->listen_port, g_get_errno(), g_get_strerror()); } g_tcp_close(g_sck); }
/** * * @brief Starts sesman main loop * */ static void DEFAULT_CC sesman_main_loop(void) { int in_sck; int error; int robjs_count; int cont; tbus sck_obj; tbus robjs[8]; g_sck = g_tcp_socket(); if (g_sck < 0) { log_message(LOG_LEVEL_ERROR, "error opening socket, g_tcp_socket() failed..."); return; } g_tcp_set_non_blocking(g_sck); error = scp_tcp_bind(g_sck, g_cfg->listen_address, g_cfg->listen_port); if (error == 0) { error = g_tcp_listen(g_sck); if (error == 0) { log_message(LOG_LEVEL_INFO, "listening to port %s on %s", g_cfg->listen_port, g_cfg->listen_address); sck_obj = g_create_wait_obj_from_socket(g_sck, 0); cont = 1; while (cont) { /* build the wait obj list */ robjs_count = 0; robjs[robjs_count++] = sck_obj; robjs[robjs_count++] = g_term_event; /* wait */ if (g_obj_wait(robjs, robjs_count, 0, 0, -1) != 0) { /* error, should not get here */ g_sleep(100); } if (g_is_wait_obj_set(g_term_event)) /* term */ { break; } if (g_is_wait_obj_set(sck_obj)) /* incoming connection */ { in_sck = g_tcp_accept(g_sck); if ((in_sck == -1) && g_tcp_last_error_would_block(g_sck)) { /* should not get here */ g_sleep(100); } else if (in_sck == -1) { /* error, should not get here */ break; } else { /* we've got a connection, so we pass it to scp code */ LOG_DBG("new connection"); scp_process_start((void*)(tintptr)in_sck); g_sck_close(in_sck); } } } g_delete_wait_obj_from_socket(sck_obj); } else { log_message(LOG_LEVEL_ERROR, "listen error %d (%s)", g_get_errno(), g_get_strerror()); } } else { log_message(LOG_LEVEL_ERROR, "bind error on " "port '%s': %d (%s)", g_cfg->listen_port, g_get_errno(), g_get_strerror()); } g_tcp_close(g_sck); }