From 33e10406efd64655b7da2e4f0c74f3c4ee388919 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Fri, 2 Sep 2005 21:29:10 +0000 Subject: [PATCH] Trying to implement AppServer --- include/appserver.h | 9 +++- include/event.h | 4 +- src/appserver.c | 128 ++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 134 insertions(+), 7 deletions(-) diff --git a/include/appserver.h b/include/appserver.h index dfccbac..cf36e06 100644 --- a/include/appserver.h +++ b/include/appserver.h @@ -11,11 +11,16 @@ /* AppServer */ /* types */ typedef struct _AppServer AppServer; +enum _AppServerOptions +{ + ASO_LOCAL = 1, + ASO_REMOTE = 2 +} AppServerOptions; /* functions */ -AppServer * appserver_new(const char * app); -AppServer * appserver_new_event(const char * app, Event * event); +AppServer * appserver_new(const char * app, int options); +AppServer * appserver_new_event(const char * app, int options, Event * event); void appserver_delete(AppServer * appserver); #endif /* !_APPSERVER_H */ diff --git a/include/event.h b/include/event.h index f7925a2..07a93cb 100644 --- a/include/event.h +++ b/include/event.h @@ -13,6 +13,7 @@ /* types */ typedef struct _Event Event; +typedef void (*EventFunc)(int fd, void * data); typedef void (*EventTimeoutFunc)(void * data); @@ -22,7 +23,8 @@ void event_delete(Event * event); /* useful */ int event_loop(Event * event); -int event_timeout(Event * event, EventTimeoutFunc * func, +int event_register_fd_read(Event * event, int fd, EventFunc * func); +int event_register_timeout(Event * event, EventTimeoutFunc * func, struct timeval timeout, void * userdata); #endif /* !_EVENT_H */ diff --git a/src/appserver.c b/src/appserver.c index 51845fb..3af05ac 100644 --- a/src/appserver.c +++ b/src/appserver.c @@ -2,18 +2,92 @@ +#include +#include +#include #include +#include + +#include +#include #include "appserver.h" +/* AppServerClient */ +/* types */ +typedef enum _AppServerClientState +{ + ASCS_NEW, + ASCS_LOGGED +} AppServerClientState; + +typedef struct _AppServerClient +{ + AppServerClientState state; + int fd; + uint32_t addr; /* FIXME uint8_t[4] instead? */ + uint16_t port; +} AppServerClient; + + +/* functions */ +AppServerClient * appserverclient_new(int fd, uint32_t addr, uint16_t port) +{ + AppServerClient * asc; + + if((asc = malloc(sizeof(AppServerClient))) == NULL) + return NULL; + asc->state = ASCS_NEW; + asc->fd = fd; + asc->addr = addr; + asc->port = port; + return asc; +} + +void appserverclient_delete(AppServerClient * appserverclient) +{ + if(close(appserverclient->fd) != 0) + perror("close"); /* FIXME find a way to properly report error */ + free(appserverclient); +} + + /* AppServer */ +/* private */ +/* types */ +ARRAY(AppServerClient, AppServerClient); struct _AppServer { Event * event; + uint16_t port; + AppServerClientArray * clients; }; -AppServer * appserver_new(const char * app) +/* functions */ +static void _appserver_accept(int fd, AppServer * appserver) +{ + struct sockaddr_in sa; + int sa_size = sizeof(struct sockaddr_in); + int fd2; + AppServerClient * asc; + + /* FIXME append client to the clients list with the appropriate state */ + if((fd2 = accept(fd, (struct sockaddr *)&sa, &sa_size)) == -1) + return perror("accept"); /* FIXME report error */ + if((asc = appserverclient_new(fd2, sa.sin_addr.s_addr, sa.sin_port)) + == NULL) + return; + array_append(appserver->clients, asc); +} + + +/* public */ +/* functions */ +/* appserver_new */ +static int _new_interface(AppServer * appserver, const char * app); +static int _new_server(AppServer * appserver, int options); +AppServer * appserver_new(const char * app, int options) { AppServer * appserver; @@ -24,23 +98,69 @@ AppServer * appserver_new(const char * app) free(appserver); return NULL; } - /* FIXME initialize according to app */ + if(_new_interface(appserver, app) != 0 + || _new_server(appserver, options) != 0) + { + event_delete(appserver->event); + free(appserver); + return NULL; + } return appserver; } -AppServer * appserver_new_event(const char * app, Event * event) +/* appserver_new_event */ +AppServer * appserver_new_event(const char * app, int options, Event * event) { AppServer * appserver; if((appserver = malloc(sizeof(AppServer))) == NULL) return NULL; appserver->event = event; - /* FIXME initialize according to app */ + if(_new_interface(appserver, app) != 0 + || _new_server(appserver, options) != 0) + { + free(appserver); + return NULL; + } return appserver; } +static int _new_interface(AppServer * appserver, const char * app) +{ + /* FIXME interfaces are hardcoded */ + if(string_compare(app, "Session") == 0) + { + appserver->port = 4242; /* FIXME */ + return 0; + } + return 1; +} +static int _new_server(AppServer * appserver, int options) +{ + int fd; + struct sockaddr_in sa; + + if((fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) + return 1; /* FIXME report error */ + sa.sin_family = AF_INET; + sa.sin_port = htons(appserver->port); + sa.sin_addr.s_addr = options & ASO_LOCAL ? INADDR_LOOPBACK : INADDR_ANY; + if(bind(fd, (struct sockaddr *)&sa, sizeof(sa)) != 0 + || listen(fd, 5) != 0) + { + /* FIXME report error */ + if(close(fd) != 0) + perror("close"); /* FIXME report error appropriately */ + return 1; + } + event_register_fd_read(appserver->event, fd, _appserver_accept); + return 0; +} + + +/* appserver_delete */ void appserver_delete(AppServer * appserver) { event_delete(appserver->event);