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:
parent
54e6f97bc9
commit
a1fdbcbe3d
@ -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.");
|
||||||
|
}
|
||||||
|
@ -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) {
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user