util-src/net.c
author Matthew Wild <mwild1@gmail.com>
Wed, 27 Mar 2024 15:35:15 +0000
branch0.12
changeset 13469 54a936345aaa
parent 10925 6eb5d2bb11af
child 12579 1f6f05a98fcd
permissions -rw-r--r--
prosodyctl check: Warn about invalid domain names in the config file This ensures that domain names of virtual hosts and components are valid in XMPP, and that they are encoded correctly.
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
9153
c1d5f52274cf net, pposix, signal: Check for redefined defines, fix warnings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8429
diff changeset
    12
#ifndef _GNU_SOURCE
7934
b619b85e01aa util.pposix, configure: Move _GNU_SOURCE macro into source files
Kim Alvefur <zash@zash.se>
parents: 7892
diff changeset
    13
#define _GNU_SOURCE
9153
c1d5f52274cf net, pposix, signal: Check for redefined defines, fix warnings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8429
diff changeset
    14
#endif
c1d5f52274cf net, pposix, signal: Check for redefined defines, fix warnings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8429
diff changeset
    15
5699
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    16
#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
    17
#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
    18
#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
    19
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    20
#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
    21
#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
    22
#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
    23
#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
    24
#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
    25
#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
    26
#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
    27
#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
    28
#endif
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    29
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    30
#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
    31
#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
    32
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
    33
#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
    34
#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
    35
#endif
10925
6eb5d2bb11af util-src: Use the luaL_pushfail API added in Lua 5.4 to highlight all failure conditions
Kim Alvefur <zash@zash.se>
parents: 10641
diff changeset
    36
#if (LUA_VERSION_NUM < 504)
6eb5d2bb11af util-src: Use the luaL_pushfail API added in Lua 5.4 to highlight all failure conditions
Kim Alvefur <zash@zash.se>
parents: 10641
diff changeset
    37
#define luaL_pushfail lua_pushnil
6eb5d2bb11af util-src: Use the luaL_pushfail API added in Lua 5.4 to highlight all failure conditions
Kim Alvefur <zash@zash.se>
parents: 10641
diff changeset
    38
#endif
6416
a552f4170aed util-src/*.c: Add macro for compiling with Lua 5.2
Kim Alvefur <zash@zash.se>
parents: 6414
diff changeset
    39
5699
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    40
/* 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
    41
10484
94cacf9fd0ae util.*.c: Add static qualifiers everywhere
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9153
diff changeset
    42
static 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
    43
	"both",
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    44
	"ipv4",
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    45
	"ipv6",
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    46
	NULL
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    47
};
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    48
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7821
diff changeset
    49
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
    50
#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
    51
	/* Link-local IPv4 addresses; see RFC 3927 and RFC 5735 */
10641
aa304109fa1b util.net: Fix signedness warning on ARM
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 10484
diff changeset
    52
	const uint32_t ip4_linklocal = htonl(0xa9fe0000); /* 169.254.0.0 */
aa304109fa1b util.net: Fix signedness warning on ARM
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 10484
diff changeset
    53
	const uint32_t 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
    54
	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
    55
#endif
5699
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    56
	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
    57
	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
    58
	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
    59
	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
    60
	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
    61
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    62
#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
    63
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
	if(getifaddrs(&addr) < 0) {
10925
6eb5d2bb11af util-src: Use the luaL_pushfail API added in Lua 5.4 to highlight all failure conditions
Kim Alvefur <zash@zash.se>
parents: 10641
diff changeset
    65
		luaL_pushfail(L);
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_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
    67
		                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
    68
		return 2;
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    69
	}
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
    70
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
    71
#endif
5699
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    72
	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
    73
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
    74
#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
    75
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
    76
	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
    77
		int family;
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    78
		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
    79
		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
    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(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
    82
			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
    83
		}
5699
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    84
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    85
		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
    86
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
    87
		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
    88
			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
    89
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
    90
			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
    91
				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
    92
			}
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
    93
5699
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    94
			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
    95
		} 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
    96
			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
    97
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
			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
    99
				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
   100
			}
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
   101
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
   102
			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
   103
				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
   104
			}
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
   105
5699
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   106
			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
   107
		}
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   108
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
   109
		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
   110
			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
   111
			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
   112
		}
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
5699
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   114
		/* 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
   115
	}
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   116
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   117
	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
   118
#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
   119
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
   120
	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
   121
		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
   122
		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
   123
	}
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
   124
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
   125
	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
   126
		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
   127
		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
   128
	}
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
   129
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
   130
#endif
5699
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   131
	return 1;
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   132
}
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   133
8429
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   134
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
   135
	char buf[16];
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   136
	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
   137
	int errno_ = 0;
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   138
	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
   139
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   140
	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
   141
		case 1:
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   142
			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
   143
			return 1;
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   144
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   145
		case -1:
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   146
			errno_ = errno;
10925
6eb5d2bb11af util-src: Use the luaL_pushfail API added in Lua 5.4 to highlight all failure conditions
Kim Alvefur <zash@zash.se>
parents: 10641
diff changeset
   147
			luaL_pushfail(L);
8429
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   148
			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
   149
			lua_pushinteger(L, errno_);
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   150
			return 3;
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   151
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   152
		default:
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   153
		case 0:
10925
6eb5d2bb11af util-src: Use the luaL_pushfail API added in Lua 5.4 to highlight all failure conditions
Kim Alvefur <zash@zash.se>
parents: 10641
diff changeset
   154
			luaL_pushfail(L);
8429
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   155
			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
   156
			lua_pushinteger(L, EINVAL);
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   157
			return 3;
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   158
	}
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   159
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   160
}
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   161
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   162
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
   163
	char buf[INET6_ADDRSTRLEN];
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   164
	int family;
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   165
	int errno_;
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   166
	size_t l;
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   167
	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
   168
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   169
	if(l == 16) {
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   170
		family = AF_INET6;
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   171
	}
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   172
	else if(l == 4) {
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   173
		family = AF_INET;
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
	else {
10925
6eb5d2bb11af util-src: Use the luaL_pushfail API added in Lua 5.4 to highlight all failure conditions
Kim Alvefur <zash@zash.se>
parents: 10641
diff changeset
   176
		luaL_pushfail(L);
8429
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   177
		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
   178
		lua_pushinteger(L, EAFNOSUPPORT);
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   179
		return 3;
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   180
	}
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   181
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   182
	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
   183
	{
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   184
		errno_ = errno;
10925
6eb5d2bb11af util-src: Use the luaL_pushfail API added in Lua 5.4 to highlight all failure conditions
Kim Alvefur <zash@zash.se>
parents: 10641
diff changeset
   185
		luaL_pushfail(L);
8429
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   186
		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
   187
		lua_pushinteger(L, errno_);
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   188
		return 3;
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   189
	}
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   190
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   191
	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
   192
	return 1;
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   193
}
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   194
7892
b8d694646597 util-src/*.c: Attach pointer * to name instead of type
Kim Alvefur <zash@zash.se>
parents: 7821
diff changeset
   195
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
   196
#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
   197
	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
   198
#endif
5699
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   199
	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
   200
		{ "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
   201
		{ "pton", lc_pton },
8b612ec00e4a util.net: Add bindings to inet_ntop and inet_pton
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
   202
		{ "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
   203
		{ NULL, NULL }
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   204
	};
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   205
7972
1c6a07606309 util-src: Specify size of various tables to be allocated
Kim Alvefur <zash@zash.se>
parents: 7934
diff changeset
   206
	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
   207
	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
   208
	return 1;
e9f5384f5ff1 util.net: Add util.net, containing local_addresses() (removed from LuaSocket 3.0)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   209
}