util-src/net.c
author Kim Alvefur <zash@zash.se>
Sat, 30 Dec 2017 22:57:55 +0100
changeset 8502 549361c68f5a
parent 8429 8b612ec00e4a
child 9153 c1d5f52274cf
permissions -rw-r--r--
CHANGES: Mention PubSub persistence
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5699
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     1
/* Prosody IM
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     2
--
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     3
-- This project is MIT/X11 licensed. Please see the
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     4
-- COPYING file in the source package for more information.
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     5
--
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     6
-- Copyright (C) 2012 Paul Aurich
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     7
-- Copyright (C) 2013 Matthew Wild
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     8
-- Copyright (C) 2013 Florian Zeitz
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     9
--
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    10
*/
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    11
7934
b619b85e01aa util.pposix, configure: Move _GNU_SOURCE macro into source files
Kim Alvefur <zash@zash.se>
parents: 7892
diff changeset
    12
#define _GNU_SOURCE
5699
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    13
#include <stddef.h>
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    14
#include <string.h>
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    15
#include <errno.h>
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    16
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    17
#ifndef _WIN32
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    18
#include <sys/ioctl.h>
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    19
#include <sys/types.h>
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    20
#include <sys/socket.h>
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    21
#include <net/if.h>
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    22
#include <ifaddrs.h>
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    23
#include <arpa/inet.h>
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    24
#include <netinet/in.h>
5699
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    25
#endif
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    26
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    27
#include <lua.h>
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    28
#include <lauxlib.h>
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    29
6792
6b180e77c97a util-src/*.c: Invert Lua 5.2 compat to be 5.2+ by default and a macro to support 5.1
Kim Alvefur <zash@zash.se>
parents: 6618
diff changeset
    30
#if (LUA_VERSION_NUM == 501)
6b180e77c97a util-src/*.c: Invert Lua 5.2 compat to be 5.2+ by default and a macro to support 5.1
Kim Alvefur <zash@zash.se>
parents: 6618
diff changeset
    31
#define luaL_setfuncs(L, R, N) luaL_register(L, NULL, R)
6416
a552f4170aed util-src/*.c: Add macro for compiling with Lua 5.2
Kim Alvefur <zash@zash.se>
parents: 6414
diff changeset
    32
#endif
a552f4170aed util-src/*.c: Add macro for compiling with Lua 5.2
Kim Alvefur <zash@zash.se>
parents: 6414
diff changeset
    33
5699
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    34
/* Enumerate all locally configured IP addresses */
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    35
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7821
diff changeset
    36
const char *const type_strings[] = {
5699
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    37
	"both",
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    38
	"ipv4",
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    39
	"ipv6",
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    40
	NULL
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    41
};
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    42
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7821
diff changeset
    43
static int lc_local_addresses(lua_State *L) {
5752
729c78581308 util.net: Fix compilation on Windows (outputs an empty list of addresses for now) (tested only in my head)
Matthew Wild <mwild1@gmail.com>
parents: 5750
diff changeset
    44
#ifndef _WIN32
5699
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    45
	/* Link-local IPv4 addresses; see RFC 3927 and RFC 5735 */
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    46
	const long ip4_linklocal = htonl(0xa9fe0000); /* 169.254.0.0 */
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    47
	const long ip4_mask      = htonl(0xffff0000);
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7821
diff changeset
    48
	struct ifaddrs *addr = NULL, *a;
5810
99ad8d42d0c9 util.net: Fix s2sout on Windows (return 0.0.0.0 and :: instead of an empty list)
Kim Alvefur <zash@zash.se>
parents: 5752
diff changeset
    49
#endif
5699
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    50
	int n = 1;
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    51
	int type = luaL_checkoption(L, 1, "both", type_strings);
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    52
	const char link_local = lua_toboolean(L, 2); /* defaults to 0 (false) */
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    53
	const char ipv4 = (type == 0 || type == 1);
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    54
	const char ipv6 = (type == 0 || type == 2);
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    55
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    56
#ifndef _WIN32
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    57
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    58
	if(getifaddrs(&addr) < 0) {
5699
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    59
		lua_pushnil(L);
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    60
		lua_pushfstring(L, "getifaddrs failed (%d): %s", errno,
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    61
		                strerror(errno));
5699
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    62
		return 2;
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    63
	}
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    64
5752
729c78581308 util.net: Fix compilation on Windows (outputs an empty list of addresses for now) (tested only in my head)
Matthew Wild <mwild1@gmail.com>
parents: 5750
diff changeset
    65
#endif
5699
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    66
	lua_newtable(L);
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    67
5752
729c78581308 util.net: Fix compilation on Windows (outputs an empty list of addresses for now) (tested only in my head)
Matthew Wild <mwild1@gmail.com>
parents: 5750
diff changeset
    68
#ifndef _WIN32
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    69
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    70
	for(a = addr; a; a = a->ifa_next) {
5699
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    71
		int family;
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    72
		char ipaddr[INET6_ADDRSTRLEN];
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7821
diff changeset
    73
		const char *tmp = NULL;
5699
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    74
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    75
		if(a->ifa_addr == NULL || a->ifa_flags & IFF_LOOPBACK) {
5699
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    76
			continue;
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    77
		}
5699
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    78
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    79
		family = a->ifa_addr->sa_family;
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    80
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    81
		if(ipv4 && family == AF_INET) {
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7821
diff changeset
    82
			struct sockaddr_in *sa = (struct sockaddr_in *)a->ifa_addr;
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    83
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    84
			if(!link_local && ((sa->sin_addr.s_addr & ip4_mask) == ip4_linklocal)) {
5699
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    85
				continue;
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    86
			}
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    87
5699
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    88
			tmp = inet_ntop(family, &sa->sin_addr, ipaddr, sizeof(ipaddr));
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    89
		} else if(ipv6 && family == AF_INET6) {
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7821
diff changeset
    90
			struct sockaddr_in6 *sa = (struct sockaddr_in6 *)a->ifa_addr;
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    91
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    92
			if(!link_local && IN6_IS_ADDR_LINKLOCAL(&sa->sin6_addr)) {
5699
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    93
				continue;
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    94
			}
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    95
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    96
			if(IN6_IS_ADDR_V4MAPPED(&sa->sin6_addr) || IN6_IS_ADDR_V4COMPAT(&sa->sin6_addr)) {
5699
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    97
				continue;
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    98
			}
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
    99
5699
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   100
			tmp = inet_ntop(family, &sa->sin6_addr, ipaddr, sizeof(ipaddr));
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   101
		}
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   102
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   103
		if(tmp != NULL) {
5699
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   104
			lua_pushstring(L, tmp);
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   105
			lua_rawseti(L, -2, n++);
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   106
		}
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   107
5699
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   108
		/* TODO: Error reporting? */
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   109
	}
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   110
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   111
	freeifaddrs(addr);
5810
99ad8d42d0c9 util.net: Fix s2sout on Windows (return 0.0.0.0 and :: instead of an empty list)
Kim Alvefur <zash@zash.se>
parents: 5752
diff changeset
   112
#else
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   113
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   114
	if(ipv4) {
5810
99ad8d42d0c9 util.net: Fix s2sout on Windows (return 0.0.0.0 and :: instead of an empty list)
Kim Alvefur <zash@zash.se>
parents: 5752
diff changeset
   115
		lua_pushstring(L, "0.0.0.0");
99ad8d42d0c9 util.net: Fix s2sout on Windows (return 0.0.0.0 and :: instead of an empty list)
Kim Alvefur <zash@zash.se>
parents: 5752
diff changeset
   116
		lua_rawseti(L, -2, n++);
99ad8d42d0c9 util.net: Fix s2sout on Windows (return 0.0.0.0 and :: instead of an empty list)
Kim Alvefur <zash@zash.se>
parents: 5752
diff changeset
   117
	}
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   118
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   119
	if(ipv6) {
5810
99ad8d42d0c9 util.net: Fix s2sout on Windows (return 0.0.0.0 and :: instead of an empty list)
Kim Alvefur <zash@zash.se>
parents: 5752
diff changeset
   120
		lua_pushstring(L, "::");
99ad8d42d0c9 util.net: Fix s2sout on Windows (return 0.0.0.0 and :: instead of an empty list)
Kim Alvefur <zash@zash.se>
parents: 5752
diff changeset
   121
		lua_rawseti(L, -2, n++);
99ad8d42d0c9 util.net: Fix s2sout on Windows (return 0.0.0.0 and :: instead of an empty list)
Kim Alvefur <zash@zash.se>
parents: 5752
diff changeset
   122
	}
6618
8e4572a642cb util-src/*.c: astyle --indent=tab --brackets=attach --indent-switches --break-blocks --pad-oper --unpad-paren --add-brackets --align-pointer=type --lineend=linux
Kim Alvefur <zash@zash.se>
parents: 6416
diff changeset
   123
5752
729c78581308 util.net: Fix compilation on Windows (outputs an empty list of addresses for now) (tested only in my head)
Matthew Wild <mwild1@gmail.com>
parents: 5750
diff changeset
   124
#endif
5699
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   125
	return 1;
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   126
}
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   127
8429
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   128
static int lc_pton(lua_State *L) {
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   129
	char buf[16];
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   130
	const char *ipaddr = luaL_checkstring(L, 1);
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   131
	int errno_ = 0;
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   132
	int family = strchr(ipaddr, ':') ? AF_INET6 : AF_INET;
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   133
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   134
	switch(inet_pton(family, ipaddr, &buf)) {
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   135
		case 1:
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   136
			lua_pushlstring(L, buf, family == AF_INET6 ? 16 : 4);
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   137
			return 1;
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   138
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   139
		case -1:
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   140
			errno_ = errno;
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   141
			lua_pushnil(L);
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   142
			lua_pushstring(L, strerror(errno_));
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   143
			lua_pushinteger(L, errno_);
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   144
			return 3;
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   145
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   146
		default:
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   147
		case 0:
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   148
			lua_pushnil(L);
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   149
			lua_pushstring(L, strerror(EINVAL));
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   150
			lua_pushinteger(L, EINVAL);
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   151
			return 3;
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   152
	}
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   153
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   154
}
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   155
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   156
static int lc_ntop(lua_State *L) {
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   157
	char buf[INET6_ADDRSTRLEN];
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   158
	int family;
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   159
	int errno_;
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   160
	size_t l;
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   161
	const char *ipaddr = luaL_checklstring(L, 1, &l);
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   162
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   163
	if(l == 16) {
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   164
		family = AF_INET6;
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   165
	}
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   166
	else if(l == 4) {
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   167
		family = AF_INET;
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   168
	}
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   169
	else {
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   170
		lua_pushnil(L);
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   171
		lua_pushstring(L, strerror(EAFNOSUPPORT));
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   172
		lua_pushinteger(L, EAFNOSUPPORT);
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   173
		return 3;
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   174
	}
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   175
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   176
	if(!inet_ntop(family, ipaddr, buf, INET6_ADDRSTRLEN))
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   177
	{
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   178
		errno_ = errno;
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   179
		lua_pushnil(L);
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   180
		lua_pushstring(L, strerror(errno_));
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   181
		lua_pushinteger(L, errno_);
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   182
		return 3;
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   183
	}
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   184
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   185
	lua_pushstring(L, (const char *)(&buf));
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   186
	return 1;
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   187
}
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   188
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7821
diff changeset
   189
int luaopen_util_net(lua_State *L) {
7821
54669df178c2 util-src: Make C modules assert that the Lua runtime matches what it was compiled for
Kim Alvefur <zash@zash.se>
parents: 6792
diff changeset
   190
#if (LUA_VERSION_NUM > 501)
54669df178c2 util-src: Make C modules assert that the Lua runtime matches what it was compiled for
Kim Alvefur <zash@zash.se>
parents: 6792
diff changeset
   191
	luaL_checkversion(L);
54669df178c2 util-src: Make C modules assert that the Lua runtime matches what it was compiled for
Kim Alvefur <zash@zash.se>
parents: 6792
diff changeset
   192
#endif
5699
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   193
	luaL_Reg exports[] = {
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   194
		{ "local_addresses", lc_local_addresses },
8429
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   195
		{ "pton", lc_pton },
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   196
		{ "ntop", lc_ntop },
5699
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   197
		{ NULL, NULL }
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   198
	};
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   199
7972
1c6a07606309 util-src: Specify size of various tables to be allocated
Kim Alvefur <zash@zash.se>
parents: 7934
diff changeset
   200
	lua_createtable(L, 0, 1);
6792
6b180e77c97a util-src/*.c: Invert Lua 5.2 compat to be 5.2+ by default and a macro to support 5.1
Kim Alvefur <zash@zash.se>
parents: 6618
diff changeset
   201
	luaL_setfuncs(L, exports, 0);
5699
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   202
	return 1;
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   203
}