diff options
| author | Paul Aurich <paul@darkrain42.org> | 2011-07-03 14:28:12 -0700 |
|---|---|---|
| committer | Sam Roberts <vieuxtech@gmail.com> | 2012-04-11 13:33:34 -0700 |
| commit | 7893d9ece28399092e1a167de9c1e6c05e5721d0 (patch) | |
| tree | 39a251a797ffefc87a81a8ebaf406168c403592e /src | |
| parent | 8393c76180ca73c1bda4d8bbb96efc041bdc90cd (diff) | |
| download | luasocket-7893d9ece28399092e1a167de9c1e6c05e5721d0.tar.gz luasocket-7893d9ece28399092e1a167de9c1e6c05e5721d0.tar.bz2 luasocket-7893d9ece28399092e1a167de9c1e6c05e5721d0.zip | |
inet: refactor getpeername to allocate the struct on the stack
Diffstat (limited to 'src')
| -rw-r--r-- | src/inet.c | 36 |
1 files changed, 23 insertions, 13 deletions
| @@ -169,27 +169,37 @@ 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 *peer; | 172 | struct sockaddr_storage peer; |
| 173 | struct sockaddr *p = (struct sockaddr *)&peer; | ||
| 173 | socklen_t peer_len = sizeof(struct sockaddr_storage); | 174 | socklen_t peer_len = sizeof(struct sockaddr_storage); |
| 174 | char ipaddr[INET6_ADDRSTRLEN]; | ||
| 175 | 175 | ||
| 176 | peer = (struct sockaddr *) malloc(peer_len); | 176 | if (getpeername(*ps, p, &peer_len) < 0) { |
| 177 | if (!peer || (getpeername(*ps, (SA *) peer, &peer_len) < 0)) { | ||
| 178 | lua_pushnil(L); | 177 | lua_pushnil(L); |
| 179 | lua_pushstring(L, "getpeername failed"); | 178 | lua_pushstring(L, "getpeername failed"); |
| 180 | } else { | 179 | } else { |
| 181 | if (peer->sa_family == AF_INET) | 180 | char ipaddr[INET6_ADDRSTRLEN] = ""; |
| 182 | inet_ntop(AF_INET, &((struct sockaddr_in *)peer)->sin_addr, | 181 | unsigned short port = 0; |
| 182 | |||
| 183 | switch (p->sa_family) { | ||
| 184 | case AF_INET: | ||
| 185 | inet_ntop(AF_INET, &((struct sockaddr_in *)&peer)->sin_addr, | ||
| 183 | ipaddr, sizeof(ipaddr)); | 186 | ipaddr, sizeof(ipaddr)); |
| 184 | else if (peer->sa_family == AF_INET6) | 187 | port = ntohs(((struct sockaddr_in *)&peer)->sin_port); |
| 185 | inet_ntop(AF_INET6, &((struct sockaddr_in6 *)peer)->sin6_addr, | 188 | break; |
| 189 | case AF_INET6: | ||
| 190 | inet_ntop(AF_INET6, &((struct sockaddr_in6 *)&peer)->sin6_addr, | ||
| 186 | ipaddr, sizeof(ipaddr)); | 191 | ipaddr, sizeof(ipaddr)); |
| 192 | port = ntohs(((struct sockaddr_in6 *)&peer)->sin6_port); | ||
| 193 | break; | ||
| 194 | default: | ||
| 195 | lua_pushnil(L); | ||
| 196 | lua_pushstring(L, "Unknown address family"); | ||
| 197 | return 2; | ||
| 198 | break; | ||
| 199 | } | ||
| 200 | |||
| 187 | lua_pushstring(L, ipaddr); | 201 | lua_pushstring(L, ipaddr); |
| 188 | if (peer->sa_family == AF_INET) | 202 | lua_pushnumber(L, port); |
| 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); | ||
| 193 | } | 203 | } |
| 194 | return 2; | 204 | return 2; |
| 195 | } | 205 | } |
