diff options
| author | Florian Zeitz <florob@babelmonkeys.de> | 2011-06-30 21:49:39 +0200 |
|---|---|---|
| committer | Sam Roberts <vieuxtech@gmail.com> | 2012-04-11 13:33:34 -0700 |
| commit | 8393c76180ca73c1bda4d8bbb96efc041bdc90cd (patch) | |
| tree | 1bf801cb8c4400acda80d5cd89702d438dbfecac | |
| parent | 594f826aa129f8b497c37fe08429eff5651dac9d (diff) | |
| download | luasocket-8393c76180ca73c1bda4d8bbb96efc041bdc90cd.tar.gz luasocket-8393c76180ca73c1bda4d8bbb96efc041bdc90cd.tar.bz2 luasocket-8393c76180ca73c1bda4d8bbb96efc041bdc90cd.zip | |
Fix getpeername to work with IPv6 addresses
| -rw-r--r-- | src/inet.c | 23 |
1 files changed, 18 insertions, 5 deletions
| @@ -169,14 +169,27 @@ static int inet_global_gethostname(lua_State *L) | |||
| 169 | \*-------------------------------------------------------------------------*/ | 169 | \*-------------------------------------------------------------------------*/ |
| 170 | int inet_meth_getpeername(lua_State *L, p_socket ps) | 170 | int 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 | } |
