aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Zeitz <florob@babelmonkeys.de>2011-06-30 21:49:39 +0200
committerSam Roberts <vieuxtech@gmail.com>2012-04-11 13:33:34 -0700
commit8393c76180ca73c1bda4d8bbb96efc041bdc90cd (patch)
tree1bf801cb8c4400acda80d5cd89702d438dbfecac
parent594f826aa129f8b497c37fe08429eff5651dac9d (diff)
downloadluasocket-8393c76180ca73c1bda4d8bbb96efc041bdc90cd.tar.gz
luasocket-8393c76180ca73c1bda4d8bbb96efc041bdc90cd.tar.bz2
luasocket-8393c76180ca73c1bda4d8bbb96efc041bdc90cd.zip
Fix getpeername to work with IPv6 addresses
-rw-r--r--src/inet.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/src/inet.c b/src/inet.c
index ecec363..c8a2c4d 100644
--- a/src/inet.c
+++ b/src/inet.c
@@ -169,14 +169,27 @@ static int inet_global_gethostname(lua_State *L)
169\*-------------------------------------------------------------------------*/ 169\*-------------------------------------------------------------------------*/
170int inet_meth_getpeername(lua_State *L, p_socket ps) 170int inet_meth_getpeername(lua_State *L, p_socket ps)
171{ 171{
172 struct sockaddr_in peer; 172 struct sockaddr *peer;
173 socklen_t peer_len = sizeof(peer); 173 socklen_t peer_len = sizeof(struct sockaddr_storage);
174 if (getpeername(*ps, (SA *) &peer, &peer_len) < 0) { 174 char ipaddr[INET6_ADDRSTRLEN];
175
176 peer = (struct sockaddr *) malloc(peer_len);
177 if (!peer || (getpeername(*ps, (SA *) peer, &peer_len) < 0)) {
175 lua_pushnil(L); 178 lua_pushnil(L);
176 lua_pushstring(L, "getpeername failed"); 179 lua_pushstring(L, "getpeername failed");
177 } else { 180 } else {
178 lua_pushstring(L, inet_ntoa(peer.sin_addr)); 181 if (peer->sa_family == AF_INET)
179 lua_pushnumber(L, ntohs(peer.sin_port)); 182 inet_ntop(AF_INET, &((struct sockaddr_in *)peer)->sin_addr,
183 ipaddr, sizeof(ipaddr));
184 else if (peer->sa_family == AF_INET6)
185 inet_ntop(AF_INET6, &((struct sockaddr_in6 *)peer)->sin6_addr,
186 ipaddr, sizeof(ipaddr));
187 lua_pushstring(L, ipaddr);
188 if (peer->sa_family == AF_INET)
189 lua_pushnumber(L, ntohs(((struct sockaddr_in *)peer)->sin_port));
190 else if (peer->sa_family == AF_INET6)
191 lua_pushnumber(L, ntohs(((struct sockaddr_in6 *)peer)->sin6_port));
192 free(peer);
180 } 193 }
181 return 2; 194 return 2;
182} 195}