Keep the peer identifier around (for clients only at the moment)

This commit is contained in:
Pierre Pronchery 2013-01-08 01:49:26 +01:00
parent ebcb9d925d
commit 903ae06929

View File

@ -60,6 +60,8 @@ typedef struct _TCPSocket
AppTransportClient * client; AppTransportClient * client;
int fd; int fd;
struct sockaddr * sa;
socklen_t sa_size;
/* input queue */ /* input queue */
char * bufin; char * bufin;
@ -75,6 +77,7 @@ struct _AppTransportPlugin
AppTransportMode mode; AppTransportMode mode;
struct addrinfo * ai; struct addrinfo * ai;
socklen_t ai_addrlen;
union union
{ {
@ -113,8 +116,10 @@ static int _tcp_server_add_client(TCP * tcp, TCPSocket * client);
/* sockets */ /* sockets */
static int _tcp_socket_init(TCPSocket * tcpsocket, int domain, 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); struct sockaddr * sa, socklen_t sa_size);
static TCPSocket * _tcp_socket_new_fd(TCP * tcp, int fd, struct sockaddr * sa,
socklen_t sa_size);
static void _tcp_socket_delete(TCPSocket * tcpsocket); static void _tcp_socket_delete(TCPSocket * tcpsocket);
static void _tcp_socket_destroy(TCPSocket * tcpsocket); static void _tcp_socket_destroy(TCPSocket * tcpsocket);
@ -281,6 +286,7 @@ static int _init_client(TCP * tcp, char const * name)
tcp->u.client.fd, tcp->u.client.fd,
(EventIOFunc)_tcp_socket_callback_read, (EventIOFunc)_tcp_socket_callback_read,
&tcp->u.client); &tcp->u.client);
tcp->ai_addrlen = aip->ai_addrlen;
break; break;
} }
freeaddrinfo(tcp->ai); freeaddrinfo(tcp->ai);
@ -337,6 +343,7 @@ static int _init_server(TCP * tcp, char const * name)
tcp->u.server.fd = -1; tcp->u.server.fd = -1;
continue; continue;
} }
tcp->ai_addrlen = aip->ai_addrlen;
event_register_io_read(tcp->helper->event, tcp->u.server.fd, event_register_io_read(tcp->helper->event, tcp->u.server.fd,
(EventIOFunc)_tcp_callback_accept, tcp); (EventIOFunc)_tcp_callback_accept, tcp);
break; break;
@ -428,7 +435,7 @@ static int _tcp_socket_init(TCPSocket * tcpsocket, int domain, TCP * tcp)
if((tcpsocket->fd = socket(domain, 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, NULL, 0);
/* set the socket as non-blocking */ /* set the socket as non-blocking */
if((flags = fcntl(tcpsocket->fd, F_GETFL)) == -1) if((flags = fcntl(tcpsocket->fd, F_GETFL)) == -1)
return -_tcp_error("fcntl", 1); return -_tcp_error("fcntl", 1);
@ -440,11 +447,14 @@ static int _tcp_socket_init(TCPSocket * tcpsocket, int domain, TCP * tcp)
/* tcp_socket_init_fd */ /* tcp_socket_init_fd */
static void _tcp_socket_init_fd(TCPSocket * tcpsocket, TCP * tcp, int fd) static void _tcp_socket_init_fd(TCPSocket * tcpsocket, TCP * tcp, int fd,
struct sockaddr * sa, socklen_t sa_size)
{ {
tcpsocket->tcp = tcp; tcpsocket->tcp = tcp;
tcpsocket->client = NULL; tcpsocket->client = NULL;
tcpsocket->fd = fd; tcpsocket->fd = fd;
tcpsocket->sa = sa;
tcpsocket->sa_size = sa_size;
tcpsocket->bufin = NULL; tcpsocket->bufin = NULL;
tcpsocket->bufin_cnt = 0; tcpsocket->bufin_cnt = 0;
tcpsocket->bufout = NULL; tcpsocket->bufout = NULL;
@ -453,13 +463,14 @@ static void _tcp_socket_init_fd(TCPSocket * tcpsocket, TCP * tcp, int fd)
/* tcp_socket_new_fd */ /* tcp_socket_new_fd */
static TCPSocket * _tcp_socket_new_fd(TCP * tcp, int fd) static TCPSocket * _tcp_socket_new_fd(TCP * tcp, int fd, struct sockaddr * sa,
socklen_t sa_size)
{ {
TCPSocket * tcpsocket; TCPSocket * tcpsocket;
if((tcpsocket = object_new(sizeof(*tcpsocket))) == NULL) if((tcpsocket = object_new(sizeof(*tcpsocket))) == NULL)
return NULL; return NULL;
_tcp_socket_init_fd(tcpsocket, tcp, fd); _tcp_socket_init_fd(tcpsocket, tcp, fd, sa, sa_size);
return tcpsocket; return tcpsocket;
} }
@ -514,13 +525,13 @@ static int _tcp_socket_queue(TCPSocket * tcpsocket, Buffer * buffer)
/* callbacks */ /* callbacks */
/* tcp_callback_accept */ /* tcp_callback_accept */
static int _accept_client(TCP * tcp, int fd); static int _accept_client(TCP * tcp, int fd, struct sockaddr * sa,
socklen_t sa_size);
static int _tcp_callback_accept(int fd, TCP * tcp) static int _tcp_callback_accept(int fd, TCP * tcp)
{ {
/* FIXME may not be the right type of struct sockaddr */ struct sockaddr * sa;
struct sockaddr_in sa; socklen_t sa_size = tcp->ai_addrlen;
socklen_t sa_size = sizeof(sa);
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "DEBUG: %s(%d)\n", __func__, fd); fprintf(stderr, "DEBUG: %s(%d)\n", __func__, fd);
@ -528,12 +539,21 @@ static int _tcp_callback_accept(int fd, TCP * tcp)
/* check parameters */ /* check parameters */
if(tcp->u.server.fd != fd) if(tcp->u.server.fd != fd)
return -1; return -1;
if((fd = accept(fd, (struct sockaddr *)&sa, &sa_size)) < 0) if((sa = malloc(sa_size)) == NULL)
/* XXX this may not be enough to recover */
sa_size = 0;
if((fd = accept(fd, sa, &sa_size)) < 0)
{
free(sa);
return _tcp_error("accept", 1); return _tcp_error("accept", 1);
if(_accept_client(tcp, fd) != 0) }
if(_accept_client(tcp, fd, sa, sa_size) != 0)
{
/* just close the connection and keep serving */ /* just close the connection and keep serving */
/* FIXME report error */ /* FIXME report error */
close(fd); close(fd);
free(sa);
}
#ifdef DEBUG #ifdef DEBUG
else else
fprintf(stderr, "DEBUG: %s() %d\n", __func__, fd); fprintf(stderr, "DEBUG: %s() %d\n", __func__, fd);
@ -541,7 +561,8 @@ static int _tcp_callback_accept(int fd, TCP * tcp)
return 0; return 0;
} }
static int _accept_client(TCP * tcp, int fd) static int _accept_client(TCP * tcp, int fd, struct sockaddr * sa,
socklen_t sa_size)
{ {
TCPSocket * tcpsocket; TCPSocket * tcpsocket;
Buffer * buf; Buffer * buf;
@ -550,7 +571,7 @@ static int _accept_client(TCP * tcp, int fd)
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "DEBUG: %s(%d)\n", __func__, fd); fprintf(stderr, "DEBUG: %s(%d)\n", __func__, fd);
#endif #endif
if((tcpsocket = _tcp_socket_new_fd(tcp, fd)) == NULL) if((tcpsocket = _tcp_socket_new_fd(tcp, fd, sa, sa_size)) == NULL)
return -1; return -1;
/* send the banner */ /* send the banner */
if((buf = buffer_new(sizeof(banner), banner)) == NULL if((buf = buffer_new(sizeof(banner), banner)) == NULL
@ -587,6 +608,7 @@ static void _tcp_socket_delete(TCPSocket * tcpsocket)
/* tcp_socket_destroy */ /* tcp_socket_destroy */
static void _tcp_socket_destroy(TCPSocket * tcpsocket) static void _tcp_socket_destroy(TCPSocket * tcpsocket)
{ {
free(tcpsocket->sa);
if(tcpsocket->fd >= 0) if(tcpsocket->fd >= 0)
{ {
event_unregister_io_read(tcpsocket->tcp->helper->event, event_unregister_io_read(tcpsocket->tcp->helper->event,