Partially implemented server mode
This commit is contained in:
parent
d57af2744b
commit
09a113a3b1
|
@ -15,6 +15,12 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
#include <System.h>
|
#include <System.h>
|
||||||
#include "App/apptransport.h"
|
#include "App/apptransport.h"
|
||||||
|
|
||||||
|
@ -38,6 +44,12 @@ static TCP * _tcp_init(AppTransportPluginHelper * helper,
|
||||||
AppTransportMode mode, char const * name);
|
AppTransportMode mode, char const * name);
|
||||||
static void _tcp_destroy(TCP * tcp);
|
static void _tcp_destroy(TCP * tcp);
|
||||||
|
|
||||||
|
/* useful */
|
||||||
|
static int _tcp_error(char const * message, int code);
|
||||||
|
|
||||||
|
/* callbacks */
|
||||||
|
static int _tcp_callback_accept(int fd, TCP * tcp);
|
||||||
|
|
||||||
|
|
||||||
/* public */
|
/* public */
|
||||||
/* constants */
|
/* constants */
|
||||||
|
@ -56,23 +68,95 @@ AppTransportPluginDefinition definition =
|
||||||
/* functions */
|
/* functions */
|
||||||
/* plug-in */
|
/* plug-in */
|
||||||
/* tcp_init */
|
/* tcp_init */
|
||||||
|
static int _init_client(TCP * tcp, char const * name);
|
||||||
|
static int _init_server(TCP * tcp, char const * name);
|
||||||
|
|
||||||
static TCP * _tcp_init(AppTransportPluginHelper * helper,
|
static TCP * _tcp_init(AppTransportPluginHelper * helper,
|
||||||
AppTransportMode mode, char const * name)
|
AppTransportMode mode, char const * name)
|
||||||
{
|
{
|
||||||
TCP * tcp;
|
TCP * tcp;
|
||||||
|
int res = -1;
|
||||||
|
|
||||||
if((tcp = object_new(sizeof(*tcp))) == NULL)
|
if((tcp = object_new(sizeof(*tcp))) == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
tcp->helper = helper;
|
tcp->helper = helper;
|
||||||
tcp->fd = -1;
|
tcp->fd = -1;
|
||||||
/* FIXME really implement */
|
switch(mode)
|
||||||
|
{
|
||||||
|
case ATM_CLIENT:
|
||||||
|
res = _init_client(tcp, name);
|
||||||
|
break;
|
||||||
|
case ATM_SERVER:
|
||||||
|
res = _init_server(tcp, name);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* check for errors */
|
||||||
|
if(res != 0)
|
||||||
|
{
|
||||||
|
_tcp_destroy(tcp);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
return tcp;
|
return tcp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int _init_client(TCP * tcp, char const * name)
|
||||||
|
{
|
||||||
|
if((tcp->fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
|
||||||
|
return -_tcp_error("socket", 1);
|
||||||
|
/* FIXME really implement */
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int _init_server(TCP * tcp, char const * name)
|
||||||
|
{
|
||||||
|
struct sockaddr_in sa;
|
||||||
|
|
||||||
|
if((tcp->fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
|
||||||
|
return -_tcp_error("socket", 1);
|
||||||
|
sa.sin_family = AF_INET;
|
||||||
|
sa.sin_port = htons(4241); /* XXX hard-coded */
|
||||||
|
sa.sin_addr.s_addr = htonl(INADDR_ANY);
|
||||||
|
if(bind(tcp->fd, (struct sockaddr *)&sa, sizeof(sa)) != 0)
|
||||||
|
return -_tcp_error("bind", 1);
|
||||||
|
if(listen(tcp->fd, 5) != 0)
|
||||||
|
return -_tcp_error("listen", 1);
|
||||||
|
event_register_io_read(tcp->helper->event, tcp->fd,
|
||||||
|
_tcp_callback_accept, tcp);
|
||||||
|
/* FIXME implement */
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* tcp_destroy */
|
/* tcp_destroy */
|
||||||
static void _tcp_destroy(TCP * tcp)
|
static void _tcp_destroy(TCP * tcp)
|
||||||
{
|
{
|
||||||
/* FIXME really implement */
|
/* FIXME really implement */
|
||||||
|
if(tcp->fd >= 0)
|
||||||
|
close(tcp->fd);
|
||||||
object_delete(tcp);
|
object_delete(tcp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* useful */
|
||||||
|
/* tcp_error */
|
||||||
|
static int _tcp_error(char const * message, int code)
|
||||||
|
{
|
||||||
|
return error_set_code(code, "%s%s%s", (message != NULL) ? message : "",
|
||||||
|
(message != NULL) ? ": " : "", strerror(errno));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* callbacks */
|
||||||
|
/* tcp_callback_accept */
|
||||||
|
static int _tcp_callback_accept(int fd, TCP * tcp)
|
||||||
|
{
|
||||||
|
struct sockaddr_in sa;
|
||||||
|
socklen_t sa_size = sizeof(sa);
|
||||||
|
int newfd;
|
||||||
|
|
||||||
|
if((newfd = accept(fd, (struct sockaddr *)&sa, &sa_size)) < 0)
|
||||||
|
return _tcp_error("accept", 1);
|
||||||
|
/* FIXME really implement */
|
||||||
|
close(newfd);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user