From 26d1cba7cb00602e7a9e950caa647933019b1caf Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Sat, 18 Sep 2010 12:39:57 -0700 Subject: [PATCH] Threads --- guacamole/libguac/client.c | 18 ++++++++++++++++-- guacamole/proxy/Makefile | 2 +- guacamole/proxy/daemon.c | 30 +++++++++++------------------- 3 files changed, 28 insertions(+), 22 deletions(-) diff --git a/guacamole/libguac/client.c b/guacamole/libguac/client.c index 0aa361d4d..c7900d6db 100644 --- a/guacamole/libguac/client.c +++ b/guacamole/libguac/client.c @@ -190,6 +190,14 @@ guac_client* guac_get_client(int client_fd, guac_client_registry_node* registry, GUACIO* io = guac_open(client_fd); guac_instruction instruction; + /* Make copies of arguments */ + char** safe_argv = malloc(argc * sizeof(char*)); + char** scratch_argv = malloc(argc * sizeof(char*)); + + int i; + for (i=0; iio); } - /* FIXME: hostname and port should not be required. Should be made available in some sort of client-contained argc/argv, specified after the protocol on the commandline */ - client_init(client, argc, argv); + client_init(client, argc, scratch_argv); break; } @@ -261,6 +268,13 @@ guac_client* guac_get_client(int client_fd, guac_client_registry_node* registry, } + /* Free memory used for arg copy */ + for (i=0; i #include #include +#include #include "client.h" @@ -93,7 +94,6 @@ int main(int argc, char* argv[]) { struct sockaddr_in client_addr; unsigned int client_addr_len; int connected_socket_fd; - pid_t client_pid ; int listen_port; @@ -163,6 +163,7 @@ int main(int argc, char* argv[]) { /* Daemon loop */ for (;;) { + pthread_t thread; client_thread_data* data; /* Listen for connections */ @@ -179,26 +180,17 @@ int main(int argc, char* argv[]) { return 3; } - /* Fork client */ - client_pid = fork(); - if (client_pid < 0) { - perror("Could not fork child"); - return 4; - } + data = malloc(sizeof(client_thread_data)); - /* In child ... */ - else if (client_pid == 0) { - - data = malloc(sizeof(client_thread_data)); - - data->fd = connected_socket_fd; - data->client_init = alias.client_init; - data->registry = registry; - data->argc = client_argc; - data->argv = client_argv; - - start_client_thread(data); + data->fd = connected_socket_fd; + data->client_init = alias.client_init; + data->registry = registry; + data->argc = client_argc; + data->argv = client_argv; + if (pthread_create(&thread, NULL, start_client_thread, (void*) data)) { + perror("Error creating client thread"); + return 3; } }