Fix socket_accept usage to depend on family.

This commit is contained in:
Diego Nehab 2012-12-11 16:35:27 -02:00
parent 66670c3541
commit 618ce43ee3
8 changed files with 22 additions and 13 deletions

View File

@ -263,7 +263,6 @@ int inet_meth_getpeername(lua_State *L, p_socket ps, int family)
lua_pushliteral(L, "inet6"); lua_pushliteral(L, "inet6");
return 3; return 3;
} }
return 2;
} }
default: default:
lua_pushnil(L); lua_pushnil(L);
@ -423,6 +422,21 @@ const char *inet_tryconnect(p_socket ps, const char *address,
return err; return err;
} }
/*-------------------------------------------------------------------------*\
* Tries to accept a socket
\*-------------------------------------------------------------------------*/
const char *inet_tryaccept(p_socket server, int family, p_socket client, p_timeout tm)
{
socklen_t len;
t_sockaddr_storage addr;
if (family == PF_INET6) {
len = sizeof(struct sockaddr_in6);
} else {
len = sizeof(struct sockaddr_in);
}
return socket_strerror(socket_accept(server, client, (SA *) &addr, &len, tm));
}
/*-------------------------------------------------------------------------*\ /*-------------------------------------------------------------------------*\
* Tries to bind socket to (address, port) * Tries to bind socket to (address, port)
\*-------------------------------------------------------------------------*/ \*-------------------------------------------------------------------------*/

View File

@ -30,6 +30,7 @@ const char *inet_tryconnect(p_socket ps, const char *address,
const char *inet_trybind(p_socket ps, const char *address, const char *serv, const char *inet_trybind(p_socket ps, const char *address, const char *serv,
struct addrinfo *bindhints); struct addrinfo *bindhints);
const char *inet_trydisconnect(p_socket ps, int family, p_timeout tm); const char *inet_trydisconnect(p_socket ps, int family, p_timeout tm);
const char *inet_tryaccept(p_socket server, int family, p_socket client, p_timeout tm);
int inet_meth_getpeername(lua_State *L, p_socket ps, int family); int inet_meth_getpeername(lua_State *L, p_socket ps, int family);
int inet_meth_getsockname(lua_State *L, p_socket ps, int family); int inet_meth_getsockname(lua_State *L, p_socket ps, int family);

View File

@ -32,7 +32,7 @@ LUAINC_macosx_base?=/opt/local/include
LUAINC_macosx?=$(LUAINC_macosx_base)/lua$(LUAV) LUAINC_macosx?=$(LUAINC_macosx_base)/lua$(LUAV)
# FIXME default should this default to fink or to macports? # FIXME default should this default to fink or to macports?
# What happens when more than one Lua version is installed? # What happens when more than one Lua version is installed?
LUAPREFIX_macosx?=/opt/local/ LUAPREFIX_macosx?=/opt/local
# LUAINC_linux: # LUAINC_linux:
# /usr/include/lua$(LUAV) # /usr/include/lua$(LUAV)

View File

@ -186,9 +186,9 @@ static int meth_accept(lua_State *L)
p_tcp server = (p_tcp) auxiliar_checkclass(L, "tcp{server}", 1); p_tcp server = (p_tcp) auxiliar_checkclass(L, "tcp{server}", 1);
p_timeout tm = timeout_markstart(&server->tm); p_timeout tm = timeout_markstart(&server->tm);
t_socket sock; t_socket sock;
int err = socket_accept(&server->sock, &sock, NULL, NULL, tm); const char *err = inet_tryaccept(&server->sock, server->family, &sock, tm);
/* if successful, push client socket */ /* if successful, push client socket */
if (err == IO_DONE) { if (err == NULL) {
p_tcp clnt = (p_tcp) lua_newuserdata(L, sizeof(t_tcp)); p_tcp clnt = (p_tcp) lua_newuserdata(L, sizeof(t_tcp));
auxiliar_setclass(L, "tcp{client}", -1); auxiliar_setclass(L, "tcp{client}", -1);
/* initialize structure fields */ /* initialize structure fields */
@ -203,7 +203,7 @@ static int meth_accept(lua_State *L)
return 1; return 1;
} else { } else {
lua_pushnil(L); lua_pushnil(L);
lua_pushstring(L, socket_strerror(err)); lua_pushstring(L, err);
return 2; return 2;
} }
} }

View File

@ -181,11 +181,7 @@ int socket_connect(p_socket ps, SA *addr, socklen_t len, p_timeout tm) {
* Accept with timeout * Accept with timeout
\*-------------------------------------------------------------------------*/ \*-------------------------------------------------------------------------*/
int socket_accept(p_socket ps, p_socket pa, SA *addr, socklen_t *len, p_timeout tm) { int socket_accept(p_socket ps, p_socket pa, SA *addr, socklen_t *len, p_timeout tm) {
SA daddr;
socklen_t dlen = sizeof(daddr);
if (*ps == SOCKET_INVALID) return IO_CLOSED; if (*ps == SOCKET_INVALID) return IO_CLOSED;
if (!addr) addr = &daddr;
if (!len) len = &dlen;
for ( ;; ) { for ( ;; ) {
int err; int err;
if ((*pa = accept(*ps, addr, len)) != SOCKET_INVALID) return IO_DONE; if ((*pa = accept(*ps, addr, len)) != SOCKET_INVALID) return IO_DONE;

View File

@ -36,6 +36,7 @@
typedef int t_socket; typedef int t_socket;
typedef t_socket *p_socket; typedef t_socket *p_socket;
typedef struct sockaddr_storage t_sockaddr_storage;
#define SOCKET_INVALID (-1) #define SOCKET_INVALID (-1)

View File

@ -169,11 +169,7 @@ int socket_listen(p_socket ps, int backlog) {
\*-------------------------------------------------------------------------*/ \*-------------------------------------------------------------------------*/
int socket_accept(p_socket ps, p_socket pa, SA *addr, socklen_t *len, int socket_accept(p_socket ps, p_socket pa, SA *addr, socklen_t *len,
p_timeout tm) { p_timeout tm) {
SA daddr;
socklen_t dlen = sizeof(daddr);
if (*ps == SOCKET_INVALID) return IO_CLOSED; if (*ps == SOCKET_INVALID) return IO_CLOSED;
if (!addr) addr = &daddr;
if (!len) len = &dlen;
for ( ;; ) { for ( ;; ) {
int err; int err;
/* try to get client socket */ /* try to get client socket */

View File

@ -12,6 +12,7 @@
#include <ws2tcpip.h> #include <ws2tcpip.h>
typedef int socklen_t; typedef int socklen_t;
typedef SOCKADDR_STORAGE t_sockaddr_storage;
typedef SOCKET t_socket; typedef SOCKET t_socket;
typedef t_socket *p_socket; typedef t_socket *p_socket;