From 27f44c01ff05cbe66542a9ecc2556c5ca1cbe65e Mon Sep 17 00:00:00 2001 From: James Booth Date: Sun, 17 May 2015 15:24:03 +0100 Subject: [PATCH] Moved thread creation --- .gitignore | 2 ++ configure-debug | 2 +- src/client/stabber.c | 21 +------------- src/server/log.c | 12 ++++---- src/server/parser.c | 4 ++- src/server/prime.c | 20 +++++++------- src/server/prime.h | 2 ++ src/server/server.c | 66 +++++++++++++++++++++++++++----------------- stabbertest.c | 44 +++++++++++++++++++++++++++++ 9 files changed, 109 insertions(+), 64 deletions(-) create mode 100644 stabbertest.c diff --git a/.gitignore b/.gitignore index 2daab66..08e1083 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,5 @@ src/server/log.lo config.cache configure.lineno src/server/prime.lo + +stabbertest diff --git a/configure-debug b/configure-debug index 10a63b9..85bfd81 100755 --- a/configure-debug +++ b/configure-debug @@ -1,3 +1,3 @@ #!/bin/sh -./configure CFLAGS='-g3 -O0' CXXFLAGS='-g3 -O0' --prefix=/usr +./configure CFLAGS='-g3 -O0' CXXFLAGS='-g3 -O0' diff --git a/src/client/stabber.c b/src/client/stabber.c index 75ea6e5..2cd22ee 100644 --- a/src/client/stabber.c +++ b/src/client/stabber.c @@ -9,15 +9,6 @@ typedef struct server_args_t { int port; } StabberArgs; -static void* -_start_server_cb(void *data) -{ - StabberArgs *args = (StabberArgs*)data; - server_run(args->port); - - return NULL; -} - int stbbr_main(int port) { @@ -27,17 +18,7 @@ stbbr_main(int port) int stbbr_start(int port) { - StabberArgs *args = malloc(sizeof(StabberArgs)); - args->port = port; - - pthread_t server_thread; - int res = pthread_create(&server_thread, NULL, _start_server_cb, (void*)args); - if (res != 0) { - return 0; - } - pthread_detach(server_thread); - - return 1; + return server_run(port); } int diff --git a/src/server/log.c b/src/server/log.c index 6b8cdac..0171e63 100644 --- a/src/server/log.c +++ b/src/server/log.c @@ -7,8 +7,6 @@ #include static FILE *logp; -static GTimeZone *tz; -static GDateTime *dt; gchar * _xdg_get_data_home(void) @@ -90,7 +88,6 @@ log_init(void) g_string_free(log_dir, TRUE); g_free(xdg_data); - tz = g_time_zone_new_local(); gchar *log_file = _get_main_log_file(); logp = fopen(log_file, "a"); g_chmod(log_file, S_IRUSR | S_IWUSR); @@ -104,10 +101,12 @@ log_println(const char * const msg, ...) va_start(arg, msg); GString *fmt_msg = g_string_new(NULL); g_string_vprintf(fmt_msg, msg, arg); - dt = g_date_time_new_now(tz); + GTimeZone *tz = g_time_zone_new_local(); + GDateTime *dt = g_date_time_new_now(tz); gchar *date_fmt = g_date_time_format(dt, "%d/%m/%Y %H:%M:%S"); fprintf(logp, "%s: %s\n", date_fmt, fmt_msg->str); g_date_time_unref(dt); + g_time_zone_unref(tz); fflush(logp); g_free(date_fmt); g_string_free(fmt_msg, TRUE); @@ -121,10 +120,12 @@ log_print(const char * const msg, ...) va_start(arg, msg); GString *fmt_msg = g_string_new(NULL); g_string_vprintf(fmt_msg, msg, arg); - dt = g_date_time_new_now(tz); + GTimeZone *tz = g_time_zone_new_local(); + GDateTime *dt = g_date_time_new_now(tz); gchar *date_fmt = g_date_time_format(dt, "%d/%m/%Y %H:%M:%S"); fprintf(logp, "%s: %s", date_fmt, fmt_msg->str); g_date_time_unref(dt); + g_time_zone_unref(tz); fflush(logp); g_free(date_fmt); g_string_free(fmt_msg, TRUE); @@ -147,7 +148,6 @@ log_print_chars(const char * const msg, ...) void log_close(void) { - g_time_zone_unref(tz); if (logp) { fclose(logp); } diff --git a/src/server/parser.c b/src/server/parser.c index 27265a1..b8769a0 100644 --- a/src/server/parser.c +++ b/src/server/parser.c @@ -86,7 +86,9 @@ parser_init(stream_start_func startcb, auth_func authcb, id_func idcb) int parser_feed(char *chunk, int len) { - return XML_Parse(parser, chunk, len, 0); + int res = XML_Parse(parser, chunk, len, 0); + parser_reset(); + return res; } void diff --git a/src/server/prime.c b/src/server/prime.c index 7fe3dc8..af787d2 100644 --- a/src/server/prime.c +++ b/src/server/prime.c @@ -4,11 +4,19 @@ #include static char *required_passwd = NULL; -static GHashTable *idstubs; +static GHashTable *idstubs = NULL; + +void +prime_init(void) +{ + required_passwd = strdup("password"); + idstubs = g_hash_table_new_full(g_str_hash, g_str_equal, free, free); +} void prime_required_passwd(char *password) { + free(required_passwd); required_passwd = strdup(password); } @@ -21,19 +29,11 @@ prime_get_passwd(void) void prime_for(char *id, char *stream) { - if (!idstubs) { - idstubs = g_hash_table_new_full(g_str_hash, g_str_equal, free, free); - } - g_hash_table_insert(idstubs, strdup(id), strdup(stream)); } char* prime_get_for(const char *id) { - if (idstubs) { - return g_hash_table_lookup(idstubs, id); - } - - return NULL; + return g_hash_table_lookup(idstubs, id); } diff --git a/src/server/prime.h b/src/server/prime.h index 719261f..914884d 100644 --- a/src/server/prime.h +++ b/src/server/prime.h @@ -1,6 +1,8 @@ #ifndef __H_PRIME #define __H_PRIME +void prime_init(void); + void prime_required_passwd(char *password); char* prime_get_passwd(void); diff --git a/src/server/server.c b/src/server/server.c index 9fae01f..aeb861b 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -100,7 +100,6 @@ listen_to(void) while ((read_size = recv(client->sock, buf, 1, 0)) > 0) { log_print_chars("%c", buf[0]); parser_feed(buf, 1); - parser_reset(); g_string_append_len(stream, buf, read_size); if (g_str_has_suffix(stream->str, STREAM_END)) { stream_end(); @@ -178,6 +177,33 @@ id_callback(const char *id) } } +void* +_start_server_cb(void* userdata) +{ + struct sockaddr_in client_addr; + + // connection accept + int c = sizeof(struct sockaddr_in); + errno = 0; + int client_socket = accept(listen_socket, (struct sockaddr *)&client_addr, (socklen_t*)&c); + if (client_socket == -1) { + char *errmsg = strerror(errno); + log_println("Accept failed: %s", errmsg); + free(errmsg); + exit(9); + } + + client = xmppclient_new(client_addr, client_socket); + parser_init(stream_start_callback, auth_callback, id_callback); + + log_print("RECV: "); + listen_for_xmlstart(); + log_print("RECV: "); + listen_to(); + + return NULL; +} + int server_run(int port) { @@ -186,7 +212,7 @@ server_run(int port) atexit(_shutdown); - struct sockaddr_in server_addr, client_addr; + struct sockaddr_in server_addr; // create socket errno = 0; @@ -195,7 +221,7 @@ server_run(int port) char *errmsg = strerror(errno); log_println("Could not create socket: %s", errmsg); free(errmsg); - return 0; + return -1; } server_addr.sin_family = AF_INET; @@ -209,7 +235,7 @@ server_run(int port) char *errmsg = strerror(errno); log_println("Bind failed: %s", errmsg); free(errmsg); - return 0; + return -1; } // set socket to listen mode @@ -219,33 +245,21 @@ server_run(int port) char *errmsg = strerror(errno); log_println("Listen failed: %s", errmsg); free(errmsg); - return 0; + return -1; } - log_println("Waiting for incoming connections..."); + log_println("Waiting for incoming connection..."); - // connection accept - int c = sizeof(struct sockaddr_in); - errno = 0; - int client_socket = accept(listen_socket, (struct sockaddr *)&client_addr, (socklen_t*)&c); - if (client_socket == -1) { - char *errmsg = strerror(errno); - log_println("Accept failed: %s", errmsg); - free(errmsg); - return 0; + prime_init(); + + pthread_t server_thread; + int res = pthread_create(&server_thread, NULL, _start_server_cb, NULL); + if (res != 0) { + return -1; } + pthread_detach(server_thread); - client = xmppclient_new(client_addr, client_socket); - parser_init(stream_start_callback, auth_callback, id_callback); - log_print("RECV: "); - int res = listen_for_xmlstart(); - if (res == -1) { - return 0; - } - - log_print("RECV: "); - listen_to(); - return 1; + return 0; } static void diff --git a/stabbertest.c b/stabbertest.c new file mode 100644 index 0000000..5716f74 --- /dev/null +++ b/stabbertest.c @@ -0,0 +1,44 @@ +#include +#include +#include + +int main(void) +{ + stbbr_start(5230); + + stbbr_auth_passwd("password"); + + stbbr_for("roster", + "" + "" + "" + "" + "" + ""); + + stbbr_for("prof_presence_1", + "" + "dnd" + "busy!" + "" + "" + "chat" + "Talk to me!" + "" + "" + "away" + "Out of office" + ""); + + stbbr_for("prof_msg_2", + "" + "Welcome!!" + ""); + + stbbr_for("prof_msg_3", + "" + "From me laptop" + ""); + + pthread_exit(NULL); +}