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);