aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Aurich <paul@darkrain42.org>2011-07-03 14:28:12 -0700
committerSam Roberts <vieuxtech@gmail.com>2012-04-11 13:33:34 -0700
commit7893d9ece28399092e1a167de9c1e6c05e5721d0 (patch)
tree39a251a797ffefc87a81a8ebaf406168c403592e
parent8393c76180ca73c1bda4d8bbb96efc041bdc90cd (diff)
downloadluasocket-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.c36
1 files changed, 23 insertions, 13 deletions
diff --git a/src/inet.c b/src/inet.c
index c8a2c4d..aefad27 100644
--- a/src/inet.c
+++ b/src/inet.c
@@ -169,27 +169,37 @@ 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 *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}