Preparing some more for IPv6 support
This commit is contained in:
parent
416643c52d
commit
100f93a577
|
@ -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 */
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -15,4 +15,5 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define UDP_FAMILY AF_INET
|
||||||
#include "udp.c"
|
#include "udp.c"
|
||||||
|
|
|
@ -15,4 +15,5 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define UDP_FAMILY AF_INET6
|
||||||
#include "udp.c"
|
#include "udp.c"
|
||||||
|
|
Loading…
Reference in New Issue
Block a user