Trying to implement AppServer

This commit is contained in:
Pierre Pronchery 2005-09-02 21:29:10 +00:00
parent fdafb10340
commit 33e10406ef
3 changed files with 134 additions and 7 deletions

View File

@ -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 */

View File

@ -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 */

View File

@ -2,18 +2,92 @@
#include <sys/socket.h>
#include <netinet/ip.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <array.h>
#include <string.h>
#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);