Preparing some more for IPv6 support

This commit is contained in:
Pierre Pronchery 2012-11-21 20:16:01 +01:00
parent 416643c52d
commit 100f93a577
4 changed files with 35 additions and 20 deletions

View File

@ -109,7 +109,7 @@ static int _tcp_error(char const * message, int code);
static int _tcp_server_add_client(TCP * tcp, TCPSocket * client); static int _tcp_server_add_client(TCP * tcp, TCPSocket * client);
/* sockets */ /* sockets */
static int _tcp_socket_init(TCPSocket * tcpsocket, TCP * tcp); static int _tcp_socket_init(TCPSocket * tcpsocket, int domain, TCP * tcp);
static void _tcp_socket_init_fd(TCPSocket * tcpsocket, TCP * tcp, int fd); static void _tcp_socket_init_fd(TCPSocket * tcpsocket, TCP * tcp, int fd);
static TCPSocket * _tcp_socket_new_fd(TCP * tcp, int fd); static TCPSocket * _tcp_socket_new_fd(TCP * tcp, int fd);
static void _tcp_socket_delete(TCPSocket * tcpsocket); static void _tcp_socket_delete(TCPSocket * tcpsocket);
@ -141,7 +141,8 @@ AppTransportPluginDefinition transport =
/* functions */ /* functions */
/* plug-in */ /* plug-in */
/* tcp_init */ /* tcp_init */
static int _init_address(char const * name, struct sockaddr_in * sa); static int _init_address(char const * name, int * domain,
struct sockaddr_in * sa);
static int _init_client(TCP * tcp, char const * name); static int _init_client(TCP * tcp, char const * name);
static int _init_server(TCP * tcp, char const * name); static int _init_server(TCP * tcp, char const * name);
@ -179,7 +180,8 @@ static TCP * _tcp_init(AppTransportPluginHelper * helper,
return tcp; return tcp;
} }
static int _init_address(char const * name, struct sockaddr_in * sa) static int _init_address(char const * name, int * domain,
struct sockaddr_in * sa)
{ {
char * p; char * p;
char * q; char * q;
@ -205,7 +207,7 @@ static int _init_address(char const * name, struct sockaddr_in * sa)
/* check for errors */ /* check for errors */
if(l < 0) if(l < 0)
return -1; return -1;
sa->sin_family = TCP_FAMILY; sa->sin_family = *domain;
sa->sin_port = htons(l); sa->sin_port = htons(l);
memcpy(&sa->sin_addr, he->h_addr_list[0], sizeof(sa->sin_addr)); memcpy(&sa->sin_addr, he->h_addr_list[0], sizeof(sa->sin_addr));
return 0; return 0;
@ -213,13 +215,14 @@ static int _init_address(char const * name, struct sockaddr_in * sa)
static int _init_client(TCP * tcp, char const * name) static int _init_client(TCP * tcp, char const * name)
{ {
int domain = TCP_FAMILY;
struct sockaddr_in sa; struct sockaddr_in sa;
/* obtain the remote address */ /* obtain the remote address */
if(_init_address(name, &sa) != 0) if(_init_address(name, &domain, &sa) != 0)
return -1; return -1;
/* initialize the client socket */ /* initialize the client socket */
if(_tcp_socket_init(&tcp->u.client, tcp) != 0) if(_tcp_socket_init(&tcp->u.client, domain, tcp) != 0)
return -1; return -1;
/* connect to the remote host */ /* connect to the remote host */
#ifdef DEBUG #ifdef DEBUG
@ -246,13 +249,14 @@ static int _init_client(TCP * tcp, char const * name)
static int _init_server(TCP * tcp, char const * name) static int _init_server(TCP * tcp, char const * name)
{ {
TCPSocket tcpsocket; TCPSocket tcpsocket;
int domain = TCP_FAMILY;
struct sockaddr_in sa; struct sockaddr_in sa;
/* obtain the local address */ /* obtain the local address */
if(_init_address(name, &sa) != 0) if(_init_address(name, &domain, &sa) != 0)
return -1; return -1;
/* create the socket */ /* create the socket */
if(_tcp_socket_init(&tcpsocket, tcp) != 0) if(_tcp_socket_init(&tcpsocket, domain, tcp) != 0)
return -1; return -1;
/* XXX ugly */ /* XXX ugly */
tcp->u.server.fd = tcpsocket.fd; tcp->u.server.fd = tcpsocket.fd;
@ -329,11 +333,11 @@ static int _tcp_server_add_client(TCP * tcp, TCPSocket * client)
/* sockets */ /* sockets */
/* tcp_socket_init */ /* tcp_socket_init */
static int _tcp_socket_init(TCPSocket * tcpsocket, TCP * tcp) static int _tcp_socket_init(TCPSocket * tcpsocket, int domain, TCP * tcp)
{ {
int flags; int flags;
if((tcpsocket->fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) if((tcpsocket->fd = socket(domain, SOCK_STREAM, 0)) < 0)
return -_tcp_error("socket", 1); return -_tcp_error("socket", 1);
_tcp_socket_init_fd(tcpsocket, tcp, tcpsocket->fd); _tcp_socket_init_fd(tcpsocket, tcp, tcpsocket->fd);
/* set the socket as non-blocking */ /* set the socket as non-blocking */

View File

@ -40,6 +40,11 @@
# define close(fd) closesocket(fd) # define close(fd) closesocket(fd)
#endif #endif
/* for udp4 and udp6 */
#ifndef UDP_FAMILY
# define UDP_FAMILY AF_INET
#endif
/* UDP */ /* UDP */
/* private */ /* private */
@ -96,10 +101,11 @@ AppTransportPluginDefinition transport =
/* functions */ /* functions */
/* plug-in */ /* plug-in */
/* udp_init */ /* udp_init */
static int _init_address(char const * name, struct sockaddr_in * sa); static int _init_address(char const * name, int * domain,
struct sockaddr_in * sa);
static int _init_client(UDP * udp, char const * name); static int _init_client(UDP * udp, char const * name);
static int _init_server(UDP * udp, char const * name); static int _init_server(UDP * udp, char const * name);
static int _init_socket(UDP * udp); static int _init_socket(UDP * udp, int domain);
static UDP * _udp_init(AppTransportPluginHelper * helper, static UDP * _udp_init(AppTransportPluginHelper * helper,
AppTransportMode mode, char const * name) AppTransportMode mode, char const * name)
@ -134,7 +140,8 @@ static UDP * _udp_init(AppTransportPluginHelper * helper,
return udp; return udp;
} }
static int _init_address(char const * name, struct sockaddr_in * sa) static int _init_address(char const * name, int * domain,
struct sockaddr_in * sa)
{ {
char * p; char * p;
char * q; char * q;
@ -160,7 +167,7 @@ static int _init_address(char const * name, struct sockaddr_in * sa)
/* check for errors */ /* check for errors */
if(l < 0) if(l < 0)
return -1; return -1;
sa->sin_family = AF_INET; sa->sin_family = *domain;
sa->sin_port = htons(l); sa->sin_port = htons(l);
memcpy(&sa->sin_addr, he->h_addr_list[0], sizeof(sa->sin_addr)); memcpy(&sa->sin_addr, he->h_addr_list[0], sizeof(sa->sin_addr));
return 0; return 0;
@ -168,13 +175,14 @@ static int _init_address(char const * name, struct sockaddr_in * sa)
static int _init_client(UDP * udp, char const * name) static int _init_client(UDP * udp, char const * name)
{ {
int domain = UDP_FAMILY;
struct sockaddr_in sa; struct sockaddr_in sa;
/* obtain the remote address */ /* obtain the remote address */
if(_init_address(name, &sa) != 0) if(_init_address(name, &domain, &sa) != 0)
return -1; return -1;
/* create the socket */ /* create the socket */
if(_init_socket(udp) != 0) if(_init_socket(udp, domain) != 0)
return -1; return -1;
/* listen for incoming messages */ /* listen for incoming messages */
event_register_io_read(udp->helper->event, udp->fd, event_register_io_read(udp->helper->event, udp->fd,
@ -184,13 +192,14 @@ static int _init_client(UDP * udp, char const * name)
static int _init_server(UDP * udp, char const * name) static int _init_server(UDP * udp, char const * name)
{ {
int domain = UDP_FAMILY;
struct sockaddr_in sa; struct sockaddr_in sa;
/* obtain the local address */ /* obtain the local address */
if(_init_address(name, &sa) != 0) if(_init_address(name, &domain, &sa) != 0)
return -1; return -1;
/* create the socket */ /* create the socket */
if(_init_socket(udp) != 0) if(_init_socket(udp, domain) != 0)
return -1; return -1;
/* listen for incoming messages */ /* listen for incoming messages */
event_register_io_read(udp->helper->event, udp->fd, event_register_io_read(udp->helper->event, udp->fd,
@ -198,11 +207,11 @@ static int _init_server(UDP * udp, char const * name)
return 0; return 0;
} }
static int _init_socket(UDP * udp) static int _init_socket(UDP * udp, int domain)
{ {
int flags; int flags;
if((udp->fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) if((udp->fd = socket(domain, SOCK_STREAM, 0)) < 0)
return -_udp_error("socket", 1); return -_udp_error("socket", 1);
/* set the socket as non-blocking */ /* set the socket as non-blocking */
if((flags = fcntl(udp->fd, F_GETFL)) == -1) if((flags = fcntl(udp->fd, F_GETFL)) == -1)

View File

@ -15,4 +15,5 @@
#define UDP_FAMILY AF_INET
#include "udp.c" #include "udp.c"

View File

@ -15,4 +15,5 @@
#define UDP_FAMILY AF_INET6
#include "udp.c" #include "udp.c"