From: Lennart Poettering Date: Fri, 26 Mar 2021 17:11:41 +0000 (+0100) Subject: nss-myhostname: expose the "outbound" IP addresses under the synthetic "_outbound... X-Git-Tag: v249-rc1~275^2~2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a1fdbcbe3d0ab58ac274f5a6a0669752d5b4238b;p=thirdparty%2Fsystemd.git 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. --- diff --git a/src/basic/hostname-util.h b/src/basic/hostname-util.h index 576ca083e01..c3fc6752cba 100644 --- a/src/basic/hostname-util.h +++ b/src/basic/hostname-util.h @@ -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. */ 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."); +} diff --git a/src/nss-myhostname/nss-myhostname.c b/src/nss-myhostname/nss-myhostname.c index 6e37966da08..3536c5fc837 100644 --- a/src/nss-myhostname/nss-myhostname.c +++ b/src/nss-myhostname/nss-myhostname.c @@ -54,8 +54,7 @@ enum nss_status _nss_myhostname_gethostbyname4_r( assert(h_errnop); if (is_localhost(name)) { - /* We respond to 'localhost', so that /etc/hosts - * is optional */ + /* We respond to 'localhost', so that /etc/hosts is optional */ canonical = "localhost"; local_address_ipv4 = htobe32(INADDR_LOOPBACK); @@ -68,6 +67,14 @@ enum nss_status _nss_myhostname_gethostbyname4_r( 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 { hn = gethostname_malloc(); if (!hn) { @@ -343,6 +350,14 @@ enum nss_status _nss_myhostname_gethostbyname3_r( 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 { hn = gethostname_malloc(); if (!hn) { diff --git a/src/test/test-nss-hosts.c b/src/test/test-nss-hosts.c index e9bc6ecce61..42ed53adc35 100644 --- a/src/test/test-nss-hosts.c +++ b/src/test/test-nss-hosts.c @@ -455,8 +455,7 @@ static int parse_argv(int argc, char **argv, } else { _cleanup_free_ char *hostname; assert_se(hostname = gethostname_malloc()); - - assert_se(names = strv_new("localhost", "_gateway", "foo_no_such_host", hostname)); + assert_se(names = strv_new("localhost", "_gateway", "_outbound", "foo_no_such_host", hostname)); n = make_addresses(&addrs); assert_se(n >= 0);