aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorenginix <wnd1024@gmail.com>2016-07-22 22:46:45 +0800
committerenginix <wnd1024@gmail.com>2016-07-22 22:52:13 +0800
commit2205c2053c9bdd270c90f93d23fe44c9674bad3e (patch)
treee23e0e39cb27a23c68233758dd69ea9574d71ec8
parentc87f953d81420e64cb5bb324ae3ca15f1bb28b1a (diff)
downloadluasocket-2205c2053c9bdd270c90f93d23fe44c9674bad3e.tar.gz
luasocket-2205c2053c9bdd270c90f93d23fe44c9674bad3e.tar.bz2
luasocket-2205c2053c9bdd270c90f93d23fe44c9674bad3e.zip
add getsockname api for unix {udp,tcp} socket
-rw-r--r--src/unixtcp.c18
-rw-r--r--src/unixudp.c18
2 files changed, 36 insertions, 0 deletions
diff --git a/src/unixtcp.c b/src/unixtcp.c
index a9c4962..747ef5f 100644
--- a/src/unixtcp.c
+++ b/src/unixtcp.c
@@ -33,6 +33,7 @@ static int meth_setfd(lua_State *L);
33static int meth_dirty(lua_State *L); 33static int meth_dirty(lua_State *L);
34static int meth_getstats(lua_State *L); 34static int meth_getstats(lua_State *L);
35static int meth_setstats(lua_State *L); 35static int meth_setstats(lua_State *L);
36static int meth_getsockname(lua_State *L);
36 37
37static const char *unixtcp_tryconnect(p_unix un, const char *path); 38static const char *unixtcp_tryconnect(p_unix un, const char *path);
38static const char *unixtcp_trybind(p_unix un, const char *path); 39static const char *unixtcp_trybind(p_unix un, const char *path);
@@ -56,6 +57,7 @@ static luaL_Reg unixtcp_methods[] = {
56 {"setoption", meth_setoption}, 57 {"setoption", meth_setoption},
57 {"setpeername", meth_connect}, 58 {"setpeername", meth_connect},
58 {"setsockname", meth_bind}, 59 {"setsockname", meth_bind},
60 {"getsockname", meth_getsockname},
59 {"settimeout", meth_settimeout}, 61 {"settimeout", meth_settimeout},
60 {"shutdown", meth_shutdown}, 62 {"shutdown", meth_shutdown},
61 {NULL, NULL} 63 {NULL, NULL}
@@ -215,6 +217,22 @@ static int meth_bind(lua_State *L) {
215 return 1; 217 return 1;
216} 218}
217 219
220static int meth_getsockname(lua_State *L)
221{
222 p_unix un = (p_unix) auxiliar_checkgroup(L, "unixtcp{any}", 1);
223 struct sockaddr_un peer = {0};
224 socklen_t peer_len = sizeof(peer);
225
226 if (getsockname(un->sock, (SA *) &peer, &peer_len) < 0) {
227 lua_pushnil(L);
228 lua_pushstring(L, socket_strerror(errno));
229 return 2;
230 }
231
232 lua_pushstring(L, peer.sun_path);
233 return 1;
234}
235
218/*-------------------------------------------------------------------------*\ 236/*-------------------------------------------------------------------------*\
219* Turns a master unixtcp object into a client object. 237* Turns a master unixtcp object into a client object.
220\*-------------------------------------------------------------------------*/ 238\*-------------------------------------------------------------------------*/
diff --git a/src/unixudp.c b/src/unixudp.c
index 1088c6b..0e0a19a 100644
--- a/src/unixudp.c
+++ b/src/unixudp.c
@@ -34,6 +34,7 @@ static int meth_setfd(lua_State *L);
34static int meth_dirty(lua_State *L); 34static int meth_dirty(lua_State *L);
35static int meth_receivefrom(lua_State *L); 35static int meth_receivefrom(lua_State *L);
36static int meth_sendto(lua_State *L); 36static int meth_sendto(lua_State *L);
37static int meth_getsockname(lua_State *L);
37 38
38static const char *unixudp_tryconnect(p_unix un, const char *path); 39static const char *unixudp_tryconnect(p_unix un, const char *path);
39static const char *unixudp_trybind(p_unix un, const char *path); 40static const char *unixudp_trybind(p_unix un, const char *path);
@@ -55,6 +56,7 @@ static luaL_Reg unixudp_methods[] = {
55 {"setoption", meth_setoption}, 56 {"setoption", meth_setoption},
56 {"setpeername", meth_connect}, 57 {"setpeername", meth_connect},
57 {"setsockname", meth_bind}, 58 {"setsockname", meth_bind},
59 {"getsockname", meth_getsockname},
58 {"settimeout", meth_settimeout}, 60 {"settimeout", meth_settimeout},
59 {"gettimeout", meth_gettimeout}, 61 {"gettimeout", meth_gettimeout},
60 {NULL, NULL} 62 {NULL, NULL}
@@ -290,6 +292,22 @@ static int meth_bind(lua_State *L)
290 return 1; 292 return 1;
291} 293}
292 294
295static int meth_getsockname(lua_State *L)
296{
297 p_unix un = (p_unix) auxiliar_checkgroup(L, "unixudp{any}", 1);
298 struct sockaddr_un peer = {0};
299 socklen_t peer_len = sizeof(peer);
300
301 if (getsockname(un->sock, (SA *) &peer, &peer_len) < 0) {
302 lua_pushnil(L);
303 lua_pushstring(L, socket_strerror(errno));
304 return 2;
305 }
306
307 lua_pushstring(L, peer.sun_path);
308 return 1;
309}
310
293/*-------------------------------------------------------------------------*\ 311/*-------------------------------------------------------------------------*\
294* Turns a master unixudp object into a client object. 312* Turns a master unixudp object into a client object.
295\*-------------------------------------------------------------------------*/ 313\*-------------------------------------------------------------------------*/