mirror of
https://github.com/lunarmodules/luasocket.git
synced 2024-12-26 12:28:21 +01:00
inet: refactor getpeername to allocate the struct on the stack
This commit is contained in:
parent
8393c76180
commit
7893d9ece2
36
src/inet.c
36
src/inet.c
@ -169,27 +169,37 @@ static int inet_global_gethostname(lua_State *L)
|
|||||||
\*-------------------------------------------------------------------------*/
|
\*-------------------------------------------------------------------------*/
|
||||||
int inet_meth_getpeername(lua_State *L, p_socket ps)
|
int inet_meth_getpeername(lua_State *L, p_socket ps)
|
||||||
{
|
{
|
||||||
struct sockaddr *peer;
|
struct sockaddr_storage peer;
|
||||||
|
struct sockaddr *p = (struct sockaddr *)&peer;
|
||||||
socklen_t peer_len = sizeof(struct sockaddr_storage);
|
socklen_t peer_len = sizeof(struct sockaddr_storage);
|
||||||
char ipaddr[INET6_ADDRSTRLEN];
|
|
||||||
|
|
||||||
peer = (struct sockaddr *) malloc(peer_len);
|
if (getpeername(*ps, p, &peer_len) < 0) {
|
||||||
if (!peer || (getpeername(*ps, (SA *) peer, &peer_len) < 0)) {
|
|
||||||
lua_pushnil(L);
|
lua_pushnil(L);
|
||||||
lua_pushstring(L, "getpeername failed");
|
lua_pushstring(L, "getpeername failed");
|
||||||
} else {
|
} else {
|
||||||
if (peer->sa_family == AF_INET)
|
char ipaddr[INET6_ADDRSTRLEN] = "";
|
||||||
inet_ntop(AF_INET, &((struct sockaddr_in *)peer)->sin_addr,
|
unsigned short port = 0;
|
||||||
|
|
||||||
|
switch (p->sa_family) {
|
||||||
|
case AF_INET:
|
||||||
|
inet_ntop(AF_INET, &((struct sockaddr_in *)&peer)->sin_addr,
|
||||||
ipaddr, sizeof(ipaddr));
|
ipaddr, sizeof(ipaddr));
|
||||||
else if (peer->sa_family == AF_INET6)
|
port = ntohs(((struct sockaddr_in *)&peer)->sin_port);
|
||||||
inet_ntop(AF_INET6, &((struct sockaddr_in6 *)peer)->sin6_addr,
|
break;
|
||||||
|
case AF_INET6:
|
||||||
|
inet_ntop(AF_INET6, &((struct sockaddr_in6 *)&peer)->sin6_addr,
|
||||||
ipaddr, sizeof(ipaddr));
|
ipaddr, sizeof(ipaddr));
|
||||||
|
port = ntohs(((struct sockaddr_in6 *)&peer)->sin6_port);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
lua_pushnil(L);
|
||||||
|
lua_pushstring(L, "Unknown address family");
|
||||||
|
return 2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
lua_pushstring(L, ipaddr);
|
lua_pushstring(L, ipaddr);
|
||||||
if (peer->sa_family == AF_INET)
|
lua_pushnumber(L, port);
|
||||||
lua_pushnumber(L, ntohs(((struct sockaddr_in *)peer)->sin_port));
|
|
||||||
else if (peer->sa_family == AF_INET6)
|
|
||||||
lua_pushnumber(L, ntohs(((struct sockaddr_in6 *)peer)->sin6_port));
|
|
||||||
free(peer);
|
|
||||||
}
|
}
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user