diff options
| author | Diego Nehab <diego@tecgraf.puc-rio.br> | 2012-04-11 13:21:25 -0700 |
|---|---|---|
| committer | Sam Roberts <vieuxtech@gmail.com> | 2012-04-11 13:25:11 -0700 |
| commit | 2778766d678b147fc079d67dee036346381b4764 (patch) | |
| tree | da44507f62fb9c8cd078cf25f6dc24107e56af34 /src/inet.c | |
| parent | 3a8ba90dfb0c2eb224f317dd692ede426691e72a (diff) | |
| download | luasocket-2778766d678b147fc079d67dee036346381b4764.tar.gz luasocket-2778766d678b147fc079d67dee036346381b4764.tar.bz2 luasocket-2778766d678b147fc079d67dee036346381b4764.zip | |
Preliminary IPv6 support for v2.1
Diffstat (limited to 'src/inet.c')
| -rw-r--r-- | src/inet.c | 52 |
1 files changed, 49 insertions, 3 deletions
| @@ -2,7 +2,7 @@ | |||
| 2 | * Internet domain functions | 2 | * Internet domain functions |
| 3 | * LuaSocket toolkit | 3 | * LuaSocket toolkit |
| 4 | * | 4 | * |
| 5 | * RCS ID: $Id$ | 5 | * RCS ID: $Id: inet.c,v 1.28 2005/10/07 04:40:59 diego Exp $ |
| 6 | \*=========================================================================*/ | 6 | \*=========================================================================*/ |
| 7 | #include <stdio.h> | 7 | #include <stdio.h> |
| 8 | #include <string.h> | 8 | #include <string.h> |
| @@ -16,14 +16,16 @@ | |||
| 16 | * Internal function prototypes. | 16 | * Internal function prototypes. |
| 17 | \*=========================================================================*/ | 17 | \*=========================================================================*/ |
| 18 | static int inet_global_toip(lua_State *L); | 18 | static int inet_global_toip(lua_State *L); |
| 19 | static int inet_global_toip6(lua_State *L); | ||
| 19 | static int inet_global_tohostname(lua_State *L); | 20 | static int inet_global_tohostname(lua_State *L); |
| 20 | static void inet_pushresolved(lua_State *L, struct hostent *hp); | 21 | static void inet_pushresolved(lua_State *L, struct hostent *hp); |
| 21 | static int inet_global_gethostname(lua_State *L); | 22 | static int inet_global_gethostname(lua_State *L); |
| 22 | 23 | ||
| 23 | /* DNS functions */ | 24 | /* DNS functions */ |
| 24 | static luaL_reg func[] = { | 25 | static luaL_reg func[] = { |
| 25 | { "toip", inet_global_toip }, | 26 | { "toip", inet_global_toip}, |
| 26 | { "tohostname", inet_global_tohostname }, | 27 | { "toip6", inet_global_toip6}, |
| 28 | { "tohostname", inet_global_tohostname}, | ||
| 27 | { "gethostname", inet_global_gethostname}, | 29 | { "gethostname", inet_global_gethostname}, |
| 28 | { NULL, NULL} | 30 | { NULL, NULL} |
| 29 | }; | 31 | }; |
| @@ -95,6 +97,50 @@ static int inet_global_toip(lua_State *L) | |||
| 95 | return 2; | 97 | return 2; |
| 96 | } | 98 | } |
| 97 | 99 | ||
| 100 | static int inet_global_toip6(lua_State *L) | ||
| 101 | { | ||
| 102 | const char *hostname = luaL_checkstring(L, 1); | ||
| 103 | struct addrinfo *iterator = NULL, *resolved = NULL; | ||
| 104 | struct addrinfo hints; | ||
| 105 | int i = 1, ret = 0; | ||
| 106 | memset(&hints, 0, sizeof(hints)); | ||
| 107 | hints.ai_socktype = SOCK_STREAM; | ||
| 108 | hints.ai_family = PF_UNSPEC; | ||
| 109 | ret = getaddrinfo(hostname, NULL, &hints, &resolved); | ||
| 110 | if (ret != 0) { | ||
| 111 | lua_pushnil(L); | ||
| 112 | lua_pushstring(L, "getaddrinfo returned error"); | ||
| 113 | return 2; | ||
| 114 | } | ||
| 115 | lua_newtable(L); | ||
| 116 | for (iterator = resolved; iterator; iterator = iterator->ai_next) { | ||
| 117 | char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV]; | ||
| 118 | getnameinfo(iterator->ai_addr, iterator->ai_addrlen, hbuf, sizeof(hbuf), | ||
| 119 | sbuf, 0, NI_NUMERICHOST); | ||
| 120 | lua_pushnumber(L, i); | ||
| 121 | lua_newtable(L); | ||
| 122 | switch (iterator->ai_family) { | ||
| 123 | case AF_INET: | ||
| 124 | lua_pushliteral(L, "family"); | ||
| 125 | lua_pushliteral(L, "inet"); | ||
| 126 | lua_settable(L, -3); | ||
| 127 | break; | ||
| 128 | case AF_INET6: | ||
| 129 | lua_pushliteral(L, "family"); | ||
| 130 | lua_pushliteral(L, "inet6"); | ||
| 131 | lua_settable(L, -3); | ||
| 132 | break;; | ||
| 133 | } | ||
| 134 | lua_pushliteral(L, "addr"); | ||
| 135 | lua_pushstring(L, hbuf); | ||
| 136 | lua_settable(L, -3); | ||
| 137 | lua_settable(L, -3); | ||
| 138 | i++; | ||
| 139 | } | ||
| 140 | freeaddrinfo(resolved); | ||
| 141 | return 1; | ||
| 142 | } | ||
| 143 | |||
| 98 | 144 | ||
| 99 | /*-------------------------------------------------------------------------*\ | 145 | /*-------------------------------------------------------------------------*\ |
| 100 | * Gets the host name | 146 | * Gets the host name |
