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 | |
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
-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 | } |