1
0
mirror of https://github.com/systemd/systemd.git synced 2024-11-01 00:51:24 +03:00

nss-myhostname: expose the "outbound" IP addresses under the synthetic "_outbound" hostname

I found myself often looking for a quick way to determine "the local IP
address", and then being lost in the "ip addr" output to find for the
right one to use. This is supposed to help a bit with that. Let's
introduce a new special hostname "_outbound" with semantics similar to
"_gateway" that resolves to addresses that are the closest I could come
up with that maps to "the" local IP address.
This commit is contained in:
Lennart Poettering 2021-03-26 18:11:41 +01:00
parent 54e6f97bc9
commit a1fdbcbe3d
3 changed files with 23 additions and 4 deletions

View File

@ -28,3 +28,8 @@ static inline bool is_gateway_hostname(const char *hostname) {
/* This tries to identify the valid syntaxes for the our synthetic "gateway" host. */ /* This tries to identify the valid syntaxes for the our synthetic "gateway" host. */
return STRCASE_IN_SET(hostname, "_gateway", "_gateway."); return STRCASE_IN_SET(hostname, "_gateway", "_gateway.");
} }
static inline bool is_outbound_hostname(const char *hostname) {
/* This tries to identify the valid syntaxes for the our synthetic "outbound" host. */
return STRCASE_IN_SET(hostname, "_outbound", "_outbound.");
}

View File

@ -54,8 +54,7 @@ enum nss_status _nss_myhostname_gethostbyname4_r(
assert(h_errnop); assert(h_errnop);
if (is_localhost(name)) { if (is_localhost(name)) {
/* We respond to 'localhost', so that /etc/hosts /* We respond to 'localhost', so that /etc/hosts is optional */
* is optional */
canonical = "localhost"; canonical = "localhost";
local_address_ipv4 = htobe32(INADDR_LOOPBACK); local_address_ipv4 = htobe32(INADDR_LOOPBACK);
@ -68,6 +67,14 @@ enum nss_status _nss_myhostname_gethostbyname4_r(
canonical = "_gateway"; canonical = "_gateway";
} else if (is_outbound_hostname(name)) {
n_addresses = local_outbounds(NULL, 0, AF_UNSPEC, &addresses);
if (n_addresses <= 0)
goto not_found;
canonical = "_outbound";
} else { } else {
hn = gethostname_malloc(); hn = gethostname_malloc();
if (!hn) { if (!hn) {
@ -343,6 +350,14 @@ enum nss_status _nss_myhostname_gethostbyname3_r(
canonical = "_gateway"; canonical = "_gateway";
} else if (is_outbound_hostname(name)) {
n_addresses = local_outbounds(NULL, 0, af, &addresses);
if (n_addresses <= 0)
goto not_found;
canonical = "_outbound";
} else { } else {
hn = gethostname_malloc(); hn = gethostname_malloc();
if (!hn) { if (!hn) {

View File

@ -455,8 +455,7 @@ static int parse_argv(int argc, char **argv,
} else { } else {
_cleanup_free_ char *hostname; _cleanup_free_ char *hostname;
assert_se(hostname = gethostname_malloc()); assert_se(hostname = gethostname_malloc());
assert_se(names = strv_new("localhost", "_gateway", "_outbound", "foo_no_such_host", hostname));
assert_se(names = strv_new("localhost", "_gateway", "foo_no_such_host", hostname));
n = make_addresses(&addrs); n = make_addresses(&addrs);
assert_se(n >= 0); assert_se(n >= 0);