Moved thread creation
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -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
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
./configure CFLAGS='-g3 -O0' CXXFLAGS='-g3 -O0' --prefix=/usr
|
./configure CFLAGS='-g3 -O0' CXXFLAGS='-g3 -O0'
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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
44
stabbertest.c
Normal 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);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user