Trying to implement AppServer
This commit is contained in:
parent
fdafb10340
commit
33e10406ef
|
@ -11,11 +11,16 @@
|
||||||
/* AppServer */
|
/* AppServer */
|
||||||
/* types */
|
/* types */
|
||||||
typedef struct _AppServer AppServer;
|
typedef struct _AppServer AppServer;
|
||||||
|
enum _AppServerOptions
|
||||||
|
{
|
||||||
|
ASO_LOCAL = 1,
|
||||||
|
ASO_REMOTE = 2
|
||||||
|
} AppServerOptions;
|
||||||
|
|
||||||
|
|
||||||
/* functions */
|
/* functions */
|
||||||
AppServer * appserver_new(const char * app);
|
AppServer * appserver_new(const char * app, int options);
|
||||||
AppServer * appserver_new_event(const char * app, Event * event);
|
AppServer * appserver_new_event(const char * app, int options, Event * event);
|
||||||
void appserver_delete(AppServer * appserver);
|
void appserver_delete(AppServer * appserver);
|
||||||
|
|
||||||
#endif /* !_APPSERVER_H */
|
#endif /* !_APPSERVER_H */
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
/* types */
|
/* types */
|
||||||
typedef struct _Event Event;
|
typedef struct _Event Event;
|
||||||
|
|
||||||
|
typedef void (*EventFunc)(int fd, void * data);
|
||||||
typedef void (*EventTimeoutFunc)(void * data);
|
typedef void (*EventTimeoutFunc)(void * data);
|
||||||
|
|
||||||
|
|
||||||
|
@ -22,7 +23,8 @@ void event_delete(Event * event);
|
||||||
|
|
||||||
/* useful */
|
/* useful */
|
||||||
int event_loop(Event * event);
|
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);
|
struct timeval timeout, void * userdata);
|
||||||
|
|
||||||
#endif /* !_EVENT_H */
|
#endif /* !_EVENT_H */
|
||||||
|
|
128
src/appserver.c
128
src/appserver.c
|
@ -2,18 +2,92 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/ip.h>
|
||||||
|
#include <unistd.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include <array.h>
|
||||||
|
#include <string.h>
|
||||||
#include "appserver.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 */
|
/* AppServer */
|
||||||
|
/* private */
|
||||||
|
/* types */
|
||||||
|
ARRAY(AppServerClient, AppServerClient);
|
||||||
struct _AppServer
|
struct _AppServer
|
||||||
{
|
{
|
||||||
Event * event;
|
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;
|
AppServer * appserver;
|
||||||
|
|
||||||
|
@ -24,23 +98,69 @@ AppServer * appserver_new(const char * app)
|
||||||
free(appserver);
|
free(appserver);
|
||||||
return NULL;
|
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;
|
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;
|
AppServer * appserver;
|
||||||
|
|
||||||
if((appserver = malloc(sizeof(AppServer))) == NULL)
|
if((appserver = malloc(sizeof(AppServer))) == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
appserver->event = event;
|
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;
|
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)
|
void appserver_delete(AppServer * appserver)
|
||||||
{
|
{
|
||||||
event_delete(appserver->event);
|
event_delete(appserver->event);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user