diff options
| author | Diego Nehab <diego.nehab@gmail.com> | 2012-05-08 11:48:54 -0700 |
|---|---|---|
| committer | Diego Nehab <diego.nehab@gmail.com> | 2012-05-08 11:48:54 -0700 |
| commit | ee7c53c3e58350c51e5c622e1b9ff8acf02c0e59 (patch) | |
| tree | 062c4959756a6a51978a40fee36777be82487419 /src | |
| parent | 04be61f88df2277fd0d2010b2deb851d9b081923 (diff) | |
| parent | 0c3e067af17a21338e8aa3240b61d40934373939 (diff) | |
| download | luasocket-ee7c53c3e58350c51e5c622e1b9ff8acf02c0e59.tar.gz luasocket-ee7c53c3e58350c51e5c622e1b9ff8acf02c0e59.tar.bz2 luasocket-ee7c53c3e58350c51e5c622e1b9ff8acf02c0e59.zip | |
Merge pull request #6 from Florob/getnameinfo
Add a getnameinfo() wrapper
Diffstat (limited to 'src')
| -rw-r--r-- | src/inet.c | 48 |
1 files changed, 48 insertions, 0 deletions
| @@ -16,6 +16,7 @@ | |||
| 16 | static int inet_global_toip(lua_State *L); | 16 | static int inet_global_toip(lua_State *L); |
| 17 | static int inet_global_getaddrinfo(lua_State *L); | 17 | static int inet_global_getaddrinfo(lua_State *L); |
| 18 | static int inet_global_tohostname(lua_State *L); | 18 | static int inet_global_tohostname(lua_State *L); |
| 19 | static int inet_global_getnameinfo(lua_State *L); | ||
| 19 | static void inet_pushresolved(lua_State *L, struct hostent *hp); | 20 | static void inet_pushresolved(lua_State *L, struct hostent *hp); |
| 20 | static int inet_global_gethostname(lua_State *L); | 21 | static int inet_global_gethostname(lua_State *L); |
| 21 | 22 | ||
| @@ -24,6 +25,7 @@ static luaL_Reg func[] = { | |||
| 24 | { "toip", inet_global_toip}, | 25 | { "toip", inet_global_toip}, |
| 25 | { "getaddrinfo", inet_global_getaddrinfo}, | 26 | { "getaddrinfo", inet_global_getaddrinfo}, |
| 26 | { "tohostname", inet_global_tohostname}, | 27 | { "tohostname", inet_global_tohostname}, |
| 28 | { "getnameinfo", inet_global_getnameinfo}, | ||
| 27 | { "gethostname", inet_global_gethostname}, | 29 | { "gethostname", inet_global_gethostname}, |
| 28 | { NULL, NULL} | 30 | { NULL, NULL} |
| 29 | }; | 31 | }; |
| @@ -76,6 +78,52 @@ static int inet_global_tohostname(lua_State *L) { | |||
| 76 | return 2; | 78 | return 2; |
| 77 | } | 79 | } |
| 78 | 80 | ||
| 81 | static int inet_global_getnameinfo(lua_State *L) { | ||
| 82 | int i, ret; | ||
| 83 | char host[1024]; | ||
| 84 | char serv[32]; | ||
| 85 | struct addrinfo hints; | ||
| 86 | struct addrinfo *resolved, *iter; | ||
| 87 | const char *node = luaL_optstring(L, 1, NULL); | ||
| 88 | const char *service = luaL_optstring(L, 2, NULL); | ||
| 89 | |||
| 90 | if (!(node || service)) | ||
| 91 | luaL_error(L, "You have to specify a hostname, a service, or both"); | ||
| 92 | |||
| 93 | memset(&hints, 0, sizeof(hints)); | ||
| 94 | hints.ai_socktype = SOCK_STREAM; | ||
| 95 | hints.ai_family = PF_UNSPEC; | ||
| 96 | |||
| 97 | /* getaddrinfo must get a node and a service argument */ | ||
| 98 | ret = getaddrinfo(node ? node : "127.0.0.1", service ? service : "7", | ||
| 99 | &hints, &resolved); | ||
| 100 | if (ret != 0) { | ||
| 101 | lua_pushnil(L); | ||
| 102 | lua_pushstring(L, socket_gaistrerror(ret)); | ||
| 103 | return 2; | ||
| 104 | } | ||
| 105 | |||
| 106 | lua_newtable(L); | ||
| 107 | for (i = 1, iter = resolved; iter; i++, iter = iter->ai_next) { | ||
| 108 | getnameinfo(iter->ai_addr, iter->ai_addrlen, host, | ||
| 109 | node ? sizeof(host) : 0, serv, service ? sizeof(serv) : 0, 0); | ||
| 110 | |||
| 111 | if (node) { | ||
| 112 | lua_pushnumber(L, i); | ||
| 113 | lua_pushstring(L, host); | ||
| 114 | lua_settable(L, -3); | ||
| 115 | } | ||
| 116 | } | ||
| 117 | freeaddrinfo(resolved); | ||
| 118 | |||
| 119 | if (service) { | ||
| 120 | lua_pushstring(L, serv); | ||
| 121 | return 2; | ||
| 122 | } else { | ||
| 123 | return 1; | ||
| 124 | } | ||
| 125 | } | ||
| 126 | |||
| 79 | /*-------------------------------------------------------------------------*\ | 127 | /*-------------------------------------------------------------------------*\ |
| 80 | * Returns all information provided by the resolver given a host name | 128 | * Returns all information provided by the resolver given a host name |
| 81 | * or ip address | 129 | * or ip address |
