Moved thread creation

This commit is contained in:
James Booth
2015-05-17 15:24:03 +01:00
parent 1a28b331a5
commit 27f44c01ff
9 changed files with 109 additions and 64 deletions

2
.gitignore vendored
View File

@@ -41,3 +41,5 @@ src/server/log.lo
config.cache config.cache
configure.lineno configure.lineno
src/server/prime.lo src/server/prime.lo
stabbertest

View File

@@ -1,3 +1,3 @@
#!/bin/sh #!/bin/sh
./configure CFLAGS='-g3 -O0' CXXFLAGS='-g3 -O0' --prefix=/usr ./configure CFLAGS='-g3 -O0' CXXFLAGS='-g3 -O0'

View File

@@ -9,15 +9,6 @@ typedef struct server_args_t {
int port; int port;
} StabberArgs; } StabberArgs;
static void*
_start_server_cb(void *data)
{
StabberArgs *args = (StabberArgs*)data;
server_run(args->port);
return NULL;
}
int int
stbbr_main(int port) stbbr_main(int port)
{ {
@@ -27,17 +18,7 @@ stbbr_main(int port)
int int
stbbr_start(int port) stbbr_start(int port)
{ {
StabberArgs *args = malloc(sizeof(StabberArgs)); return server_run(port);
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;
} }
int int

View File

@@ -7,8 +7,6 @@
#include <glib/gstdio.h> #include <glib/gstdio.h>
static FILE *logp; static FILE *logp;
static GTimeZone *tz;
static GDateTime *dt;
gchar * gchar *
_xdg_get_data_home(void) _xdg_get_data_home(void)
@@ -90,7 +88,6 @@ log_init(void)
g_string_free(log_dir, TRUE); g_string_free(log_dir, TRUE);
g_free(xdg_data); g_free(xdg_data);
tz = g_time_zone_new_local();
gchar *log_file = _get_main_log_file(); gchar *log_file = _get_main_log_file();
logp = fopen(log_file, "a"); logp = fopen(log_file, "a");
g_chmod(log_file, S_IRUSR | S_IWUSR); g_chmod(log_file, S_IRUSR | S_IWUSR);
@@ -104,10 +101,12 @@ log_println(const char * const msg, ...)
va_start(arg, msg); va_start(arg, msg);
GString *fmt_msg = g_string_new(NULL); GString *fmt_msg = g_string_new(NULL);
g_string_vprintf(fmt_msg, msg, arg); 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"); gchar *date_fmt = g_date_time_format(dt, "%d/%m/%Y %H:%M:%S");
fprintf(logp, "%s: %s\n", date_fmt, fmt_msg->str); fprintf(logp, "%s: %s\n", date_fmt, fmt_msg->str);
g_date_time_unref(dt); g_date_time_unref(dt);
g_time_zone_unref(tz);
fflush(logp); fflush(logp);
g_free(date_fmt); g_free(date_fmt);
g_string_free(fmt_msg, TRUE); g_string_free(fmt_msg, TRUE);
@@ -121,10 +120,12 @@ log_print(const char * const msg, ...)
va_start(arg, msg); va_start(arg, msg);
GString *fmt_msg = g_string_new(NULL); GString *fmt_msg = g_string_new(NULL);
g_string_vprintf(fmt_msg, msg, arg); 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"); gchar *date_fmt = g_date_time_format(dt, "%d/%m/%Y %H:%M:%S");
fprintf(logp, "%s: %s", date_fmt, fmt_msg->str); fprintf(logp, "%s: %s", date_fmt, fmt_msg->str);
g_date_time_unref(dt); g_date_time_unref(dt);
g_time_zone_unref(tz);
fflush(logp); fflush(logp);
g_free(date_fmt); g_free(date_fmt);
g_string_free(fmt_msg, TRUE); g_string_free(fmt_msg, TRUE);
@@ -147,7 +148,6 @@ log_print_chars(const char * const msg, ...)
void void
log_close(void) log_close(void)
{ {
g_time_zone_unref(tz);
if (logp) { if (logp) {
fclose(logp); fclose(logp);
} }

View File

@@ -86,7 +86,9 @@ parser_init(stream_start_func startcb, auth_func authcb, id_func idcb)
int int
parser_feed(char *chunk, int len) 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 void

View File

@@ -4,11 +4,19 @@
#include <string.h> #include <string.h>
static char *required_passwd = NULL; 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 void
prime_required_passwd(char *password) prime_required_passwd(char *password)
{ {
free(required_passwd);
required_passwd = strdup(password); required_passwd = strdup(password);
} }
@@ -21,19 +29,11 @@ prime_get_passwd(void)
void void
prime_for(char *id, char *stream) 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)); g_hash_table_insert(idstubs, strdup(id), strdup(stream));
} }
char* char*
prime_get_for(const char *id) prime_get_for(const char *id)
{ {
if (idstubs) { return g_hash_table_lookup(idstubs, id);
return g_hash_table_lookup(idstubs, id);
}
return NULL;
} }

View File

@@ -1,6 +1,8 @@
#ifndef __H_PRIME #ifndef __H_PRIME
#define __H_PRIME #define __H_PRIME
void prime_init(void);
void prime_required_passwd(char *password); void prime_required_passwd(char *password);
char* prime_get_passwd(void); char* prime_get_passwd(void);

View File

@@ -100,7 +100,6 @@ listen_to(void)
while ((read_size = recv(client->sock, buf, 1, 0)) > 0) { while ((read_size = recv(client->sock, buf, 1, 0)) > 0) {
log_print_chars("%c", buf[0]); log_print_chars("%c", buf[0]);
parser_feed(buf, 1); parser_feed(buf, 1);
parser_reset();
g_string_append_len(stream, buf, read_size); g_string_append_len(stream, buf, read_size);
if (g_str_has_suffix(stream->str, STREAM_END)) { if (g_str_has_suffix(stream->str, STREAM_END)) {
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 int
server_run(int port) server_run(int port)
{ {
@@ -186,7 +212,7 @@ server_run(int port)
atexit(_shutdown); atexit(_shutdown);
struct sockaddr_in server_addr, client_addr; struct sockaddr_in server_addr;
// create socket // create socket
errno = 0; errno = 0;
@@ -195,7 +221,7 @@ server_run(int port)
char *errmsg = strerror(errno); char *errmsg = strerror(errno);
log_println("Could not create socket: %s", errmsg); log_println("Could not create socket: %s", errmsg);
free(errmsg); free(errmsg);
return 0; return -1;
} }
server_addr.sin_family = AF_INET; server_addr.sin_family = AF_INET;
@@ -209,7 +235,7 @@ server_run(int port)
char *errmsg = strerror(errno); char *errmsg = strerror(errno);
log_println("Bind failed: %s", errmsg); log_println("Bind failed: %s", errmsg);
free(errmsg); free(errmsg);
return 0; return -1;
} }
// set socket to listen mode // set socket to listen mode
@@ -219,33 +245,21 @@ server_run(int port)
char *errmsg = strerror(errno); char *errmsg = strerror(errno);
log_println("Listen failed: %s", errmsg); log_println("Listen failed: %s", errmsg);
free(errmsg); free(errmsg);
return 0; return -1;
} }
log_println("Waiting for incoming connections..."); log_println("Waiting for incoming connection...");
// connection accept prime_init();
int c = sizeof(struct sockaddr_in);
errno = 0; pthread_t server_thread;
int client_socket = accept(listen_socket, (struct sockaddr *)&client_addr, (socklen_t*)&c); int res = pthread_create(&server_thread, NULL, _start_server_cb, NULL);
if (client_socket == -1) { if (res != 0) {
char *errmsg = strerror(errno); return -1;
log_println("Accept failed: %s", errmsg);
free(errmsg);
return 0;
} }
pthread_detach(server_thread);
client = xmppclient_new(client_addr, client_socket); return 0;
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;
} }
static void static void

44
stabbertest.c Normal file
View File

@@ -0,0 +1,44 @@
#include <stabber.h>
#include <pthread.h>
#include <stdlib.h>
int main(void)
{
stbbr_start(5230);
stbbr_auth_passwd("password");
stbbr_for("roster",
"<iq id=\"roster\" type=\"result\" to=\"stabber@localhost/profanity\">"
"<query xmlns=\"jabber:iq:roster\" ver=\"362\">"
"<item jid=\"buddy1@localhost\" subscription=\"both\" name=\"Buddy1\"/>"
"<item jid=\"buddy2@localhost\" subscription=\"both\" name=\"Buddy2\"/>"
"</query>"
"</iq>");
stbbr_for("prof_presence_1",
"<presence to=\"stabber@localhost\" from=\"buddy1@localhost/mobile\">"
"<show>dnd</show>"
"<status>busy!</status>"
"</presence>"
"<presence to=\"stabber@localhost\" from=\"buddy1@localhost/laptop\">"
"<show>chat</show>"
"<status>Talk to me!</status>"
"</presence>"
"<presence to=\"stabber@localhost\" from=\"buddy2@localhost/work\">"
"<show>away</show>"
"<status>Out of office</status>"
"</presence>");
stbbr_for("prof_msg_2",
"<message id=\"message1\" to=\"stabber@localhost\" from=\"buddy1@localhost/mobile\" type=\"chat\">"
"<body>Welcome!!</body>"
"</message>");
stbbr_for("prof_msg_3",
"<message id=\"message2\" to=\"stabber@localhost\" from=\"buddy1@localhost/laptop\" type=\"chat\">"
"<body>From me laptop</body>"
"</message>");
pthread_exit(NULL);
}