diff options
author | Timothy Pearson <kb9vqf@pearsoncomputing.net> | 2012-05-24 09:43:05 -0500 |
---|---|---|
committer | Timothy Pearson <kb9vqf@pearsoncomputing.net> | 2012-05-24 09:43:05 -0500 |
commit | 68475221bde72a114f7ae5c814cbf9f145b3a83f (patch) | |
tree | 3390bf022fd4b3f723cc337464d635d45dc1216e | |
parent | ee2d2bfb353af724d8726ada09d5133b9b81430a (diff) | |
download | xrdp-proprietary-68475221bde72a114f7ae5c814cbf9f145b3a83f.tar.gz xrdp-proprietary-68475221bde72a114f7ae5c814cbf9f145b3a83f.zip |
Partially fix immediate exit after login
-rw-r--r-- | xup/xup.c | 98 |
1 files changed, 96 insertions, 2 deletions
@@ -22,6 +22,97 @@ #include "xup.h" +#include <arpa/inet.h> +#include <sys/types.h> +#include <netinet/in.h> +#include <sys/socket.h> +#include <sys/types.h> +#include <unistd.h> +#include <fcntl.h> +#include <netdb.h> + +/******************************************************************************/ +/** + * + * @brief checks if there's a server running on a host and port + * @param display the display to check + * @return 0 if the port is closed, 1 if it is open + * + */ +static int DEFAULT_CC +check_port_status(const char* host, const char* port) +{ + char text[256]; + int x_running; + int sck; + + struct sockaddr_in servaddr; + int soc = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); + + g_memset( &servaddr, 0, sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_port = htons(atoi(port)); + + struct hostent* hostaddr; + hostaddr = gethostbyname(host); + g_memcpy(&servaddr.sin_addr, hostaddr->h_addr, hostaddr->h_length); + + int res = connect(soc, (struct sockaddr*)&servaddr, sizeof(servaddr)); + + close(soc); + + if (res == -1) + { + // Port is closed, no server there! + return 0; + } + else { + // Port is open + return 1; + } +} + +/******************************************************************************/ +/** + * + * @brief checks if there's a server running on a remote display + * @param display the display to check + * @return 0 if there isn't a display running, nonzero otherwise + * + */ +static int DEFAULT_CC +x_server_running_check_remote_port(const char* host, const char* port) +{ + int x_running; + int sck; + + x_running = 0; + x_running += check_port_status(host, port); + + return x_running; +} + +/******************************************************************************/ +static int APP_CC +wait_for_remote_xserver(const char* host, const char* port) +{ + int i; + + /* give X a bit to start */ + /* wait up to 15 secs for x server to start */ + i = 0; + while (!x_server_running_check_remote_port(host, port)) + { + i++; + if (i > 60) + { + break; + } + g_sleep(250); + } + return 0; +} + /******************************************************************************/ /* returns error */ int DEFAULT_CC @@ -151,12 +242,15 @@ lib_mod_connect(struct mod* mod) } char text[256]; - g_snprintf(text, 255, "services starting on %s, please wait...\n\r", mod->ip); + g_snprintf(text, 255, "allocating resources on %s, please wait...\n\r", mod->ip); mod->server_msg(mod, text, 0); + // Prevent an immediate RDP exit + wait_for_remote_xserver(mod->ip, mod->port); + // FIXME CRITICAL // Prevent an immediate RDP exit - // This delay needs to be long enough for everything to start up 100% + // Why is this still needed even after waiting for the X11rdp server to start!?!? g_sleep(5000); if (g_strcmp(mod->ip, "") == 0) |