From 8f60c998abeabc7582abfe11d459f4391a298861 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sat, 24 Sep 2022 07:46:31 +0900 Subject: [PATCH 1/8] networkctl: handle all errors in sd_network_link_get_setup_state() as "unmanaged" We have already ignored all errors in other fields. --- src/network/networkctl.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/network/networkctl.c b/src/network/networkctl.c index 7ddf72ddcd..410e4dfc0d 100644 --- a/src/network/networkctl.c +++ b/src/network/networkctl.c @@ -836,9 +836,7 @@ static int list_links(int argc, char *argv[], void *userdata) { (void) sd_network_link_get_operational_state(links[i].ifindex, &operational_state); operational_state_to_color(links[i].name, operational_state, &on_color_operational, NULL); - r = sd_network_link_get_setup_state(links[i].ifindex, &setup_state); - if (r == -ENODATA) /* If there's no info available about this iface, it's unmanaged by networkd */ - setup_state = strdup("unmanaged"); + (void) sd_network_link_get_setup_state(links[i].ifindex, &setup_state); setup_state_to_color(setup_state, &on_color_setup, NULL); r = net_get_type_string(links[i].sd_device, links[i].iftype, &t); @@ -851,7 +849,7 @@ static int list_links(int argc, char *argv[], void *userdata) { TABLE_STRING, t, TABLE_STRING, operational_state, TABLE_SET_COLOR, on_color_operational, - TABLE_STRING, setup_state, + TABLE_STRING, setup_state ?: "unmanaged", TABLE_SET_COLOR, on_color_setup); if (r < 0) return table_log_add_error(r); @@ -1563,9 +1561,7 @@ static int link_status_one( (void) sd_network_link_get_online_state(info->ifindex, &online_state); online_state_to_color(online_state, &on_color_online, NULL); - r = sd_network_link_get_setup_state(info->ifindex, &setup_state); - if (r == -ENODATA) /* If there's no info available about this iface, it's unmanaged by networkd */ - setup_state = strdup("unmanaged"); + (void) sd_network_link_get_setup_state(info->ifindex, &setup_state); setup_state_to_color(setup_state, &on_color_setup, &off_color_setup); (void) sd_network_link_get_dns(info->ifindex, &dns); @@ -1646,7 +1642,7 @@ static int link_status_one( r = table_add_cell_stringf(table, NULL, "%s%s%s (%s%s%s)", on_color_operational, strna(operational_state), off_color_operational, - on_color_setup, strna(setup_state), off_color_setup); + on_color_setup, setup_state ?: "unmanaged", off_color_setup); if (r < 0) return table_log_add_error(r); From f1d07d83ab684bc92ac91f0973583e9e4de232c4 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sat, 24 Sep 2022 07:47:14 +0900 Subject: [PATCH 2/8] networkctl: use table_add_string_line() at one more place --- src/network/networkctl.c | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/src/network/networkctl.c b/src/network/networkctl.c index 410e4dfc0d..a2e216e779 100644 --- a/src/network/networkctl.c +++ b/src/network/networkctl.c @@ -1569,6 +1569,10 @@ static int link_status_one( (void) sd_network_link_get_route_domains(info->ifindex, &route_domains); (void) sd_network_link_get_ntp(info->ifindex, &ntp); (void) sd_network_link_get_sip(info->ifindex, &sip); + (void) sd_network_link_get_network_file(info->ifindex, &network); + (void) sd_network_link_get_carrier_bound_to(info->ifindex, &carrier_bound_to); + (void) sd_network_link_get_carrier_bound_by(info->ifindex, &carrier_bound_by); + (void) sd_network_link_get_activation_policy(info->ifindex, &activation_policy); if (info->sd_device) { (void) sd_device_get_property_value(info->sd_device, "ID_NET_LINK_FILE", &link); @@ -1586,11 +1590,6 @@ static int link_status_one( if (r == -ENOMEM) return log_oom(); - (void) sd_network_link_get_network_file(info->ifindex, &network); - - (void) sd_network_link_get_carrier_bound_to(info->ifindex, &carrier_bound_to); - (void) sd_network_link_get_carrier_bound_by(info->ifindex, &carrier_bound_by); - char lease_file[STRLEN("/run/systemd/netif/leases/") + DECIMAL_STR_MAX(int)]; xsprintf(lease_file, "/run/systemd/netif/leases/%i", info->ifindex); @@ -2184,15 +2183,9 @@ static int link_status_one( if (r < 0) return r; - r = sd_network_link_get_activation_policy(info->ifindex, &activation_policy); - if (r >= 0) { - r = table_add_many(table, - TABLE_EMPTY, - TABLE_STRING, "Activation Policy:", - TABLE_STRING, activation_policy); - if (r < 0) - return table_log_add_error(r); - } + r = table_add_string_line(table, "Activation Policy:", activation_policy); + if (r < 0) + return r; r = sd_network_link_get_required_for_online(info->ifindex); if (r >= 0) { From e7c1b3f73a281dd43ca250eebd76f30b614cd2c4 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sat, 24 Sep 2022 07:50:18 +0900 Subject: [PATCH 3/8] sd-network: rename function arguments for storing return value --- src/libsystemd/sd-network/sd-network.c | 109 ++++++++++++------------- src/systemd/sd-network.h | 66 +++++++-------- 2 files changed, 87 insertions(+), 88 deletions(-) diff --git a/src/libsystemd/sd-network/sd-network.c b/src/libsystemd/sd-network/sd-network.c index 408c0a1f47..d059cee637 100644 --- a/src/libsystemd/sd-network/sd-network.c +++ b/src/libsystemd/sd-network/sd-network.c @@ -37,28 +37,28 @@ static int network_get_string(const char *field, char **ret) { return 0; } -int sd_network_get_operational_state(char **state) { - return network_get_string("OPER_STATE", state); +int sd_network_get_operational_state(char **ret) { + return network_get_string("OPER_STATE", ret); } -int sd_network_get_carrier_state(char **state) { - return network_get_string("CARRIER_STATE", state); +int sd_network_get_carrier_state(char **ret) { + return network_get_string("CARRIER_STATE", ret); } -int sd_network_get_address_state(char **state) { - return network_get_string("ADDRESS_STATE", state); +int sd_network_get_address_state(char **ret) { + return network_get_string("ADDRESS_STATE", ret); } -int sd_network_get_ipv4_address_state(char **state) { - return network_get_string("IPV4_ADDRESS_STATE", state); +int sd_network_get_ipv4_address_state(char **ret) { + return network_get_string("IPV4_ADDRESS_STATE", ret); } -int sd_network_get_ipv6_address_state(char **state) { - return network_get_string("IPV6_ADDRESS_STATE", state); +int sd_network_get_ipv6_address_state(char **ret) { + return network_get_string("IPV6_ADDRESS_STATE", ret); } -int sd_network_get_online_state(char **state) { - return network_get_string("ONLINE_STATE", state); +int sd_network_get_online_state(char **ret) { + return network_get_string("ONLINE_STATE", ret); } static int network_get_strv(const char *key, char ***ret) { @@ -161,23 +161,23 @@ static int network_link_get_strv(int ifindex, const char *key, char ***ret) { return r; } -int sd_network_link_get_setup_state(int ifindex, char **state) { - return network_link_get_string(ifindex, "ADMIN_STATE", state); +int sd_network_link_get_setup_state(int ifindex, char **ret) { + return network_link_get_string(ifindex, "ADMIN_STATE", ret); } -int sd_network_link_get_network_file(int ifindex, char **filename) { - return network_link_get_string(ifindex, "NETWORK_FILE", filename); +int sd_network_link_get_network_file(int ifindex, char **ret) { + return network_link_get_string(ifindex, "NETWORK_FILE", ret); } -int sd_network_link_get_operational_state(int ifindex, char **state) { - return network_link_get_string(ifindex, "OPER_STATE", state); +int sd_network_link_get_operational_state(int ifindex, char **ret) { + return network_link_get_string(ifindex, "OPER_STATE", ret); } -int sd_network_link_get_required_family_for_online(int ifindex, char **state) { +int sd_network_link_get_required_family_for_online(int ifindex, char **ret) { _cleanup_free_ char *s = NULL; int r; - assert_return(state, -EINVAL); + assert_return(ret, -EINVAL); r = network_link_get_string(ifindex, "REQUIRED_FAMILY_FOR_ONLINE", &s); if (r < 0) { @@ -189,36 +189,36 @@ int sd_network_link_get_required_family_for_online(int ifindex, char **state) { return -ENOMEM; } - *state = TAKE_PTR(s); + *ret = TAKE_PTR(s); return 0; } -int sd_network_link_get_carrier_state(int ifindex, char **state) { - return network_link_get_string(ifindex, "CARRIER_STATE", state); +int sd_network_link_get_carrier_state(int ifindex, char **ret) { + return network_link_get_string(ifindex, "CARRIER_STATE", ret); } -int sd_network_link_get_address_state(int ifindex, char **state) { - return network_link_get_string(ifindex, "ADDRESS_STATE", state); +int sd_network_link_get_address_state(int ifindex, char **ret) { + return network_link_get_string(ifindex, "ADDRESS_STATE", ret); } -int sd_network_link_get_ipv4_address_state(int ifindex, char **state) { - return network_link_get_string(ifindex, "IPV4_ADDRESS_STATE", state); +int sd_network_link_get_ipv4_address_state(int ifindex, char **ret) { + return network_link_get_string(ifindex, "IPV4_ADDRESS_STATE", ret); } -int sd_network_link_get_ipv6_address_state(int ifindex, char **state) { - return network_link_get_string(ifindex, "IPV6_ADDRESS_STATE", state); +int sd_network_link_get_ipv6_address_state(int ifindex, char **ret) { + return network_link_get_string(ifindex, "IPV6_ADDRESS_STATE", ret); } -int sd_network_link_get_online_state(int ifindex, char **state) { - return network_link_get_string(ifindex, "ONLINE_STATE", state); +int sd_network_link_get_online_state(int ifindex, char **ret) { + return network_link_get_string(ifindex, "ONLINE_STATE", ret); } -int sd_network_link_get_dhcp6_client_iaid_string(int ifindex, char **iaid) { - return network_link_get_string(ifindex, "DHCP6_CLIENT_IAID", iaid); +int sd_network_link_get_dhcp6_client_iaid_string(int ifindex, char **ret) { + return network_link_get_string(ifindex, "DHCP6_CLIENT_IAID", ret); } -int sd_network_link_get_dhcp6_client_duid_string(int ifindex, char **duid) { - return network_link_get_string(ifindex, "DHCP6_CLIENT_DUID", duid); +int sd_network_link_get_dhcp6_client_duid_string(int ifindex, char **ret) { + return network_link_get_string(ifindex, "DHCP6_CLIENT_DUID", ret); } int sd_network_link_get_required_for_online(int ifindex) { @@ -236,11 +236,11 @@ int sd_network_link_get_required_for_online(int ifindex) { return parse_boolean(s); } -int sd_network_link_get_required_operstate_for_online(int ifindex, char **state) { +int sd_network_link_get_required_operstate_for_online(int ifindex, char **ret) { _cleanup_free_ char *s = NULL; int r; - assert_return(state, -EINVAL); + assert_return(ret, -EINVAL); r = network_link_get_string(ifindex, "REQUIRED_OPER_STATE_FOR_ONLINE", &s); if (r < 0) { @@ -253,15 +253,15 @@ int sd_network_link_get_required_operstate_for_online(int ifindex, char **state) return -ENOMEM; } - *state = TAKE_PTR(s); + *ret = TAKE_PTR(s); return 0; } -int sd_network_link_get_activation_policy(int ifindex, char **policy) { +int sd_network_link_get_activation_policy(int ifindex, char **ret) { _cleanup_free_ char *s = NULL; int r; - assert_return(policy, -EINVAL); + assert_return(ret, -EINVAL); r = network_link_get_string(ifindex, "ACTIVATION_POLICY", &s); if (r < 0) { @@ -274,28 +274,28 @@ int sd_network_link_get_activation_policy(int ifindex, char **policy) { return -ENOMEM; } - *policy = TAKE_PTR(s); + *ret = TAKE_PTR(s); return 0; } -int sd_network_link_get_llmnr(int ifindex, char **llmnr) { - return network_link_get_string(ifindex, "LLMNR", llmnr); +int sd_network_link_get_llmnr(int ifindex, char **ret) { + return network_link_get_string(ifindex, "LLMNR", ret); } -int sd_network_link_get_mdns(int ifindex, char **mdns) { - return network_link_get_string(ifindex, "MDNS", mdns); +int sd_network_link_get_mdns(int ifindex, char **ret) { + return network_link_get_string(ifindex, "MDNS", ret); } -int sd_network_link_get_dns_over_tls(int ifindex, char **dns_over_tls) { - return network_link_get_string(ifindex, "DNS_OVER_TLS", dns_over_tls); +int sd_network_link_get_dns_over_tls(int ifindex, char **ret) { + return network_link_get_string(ifindex, "DNS_OVER_TLS", ret); } -int sd_network_link_get_dnssec(int ifindex, char **dnssec) { - return network_link_get_string(ifindex, "DNSSEC", dnssec); +int sd_network_link_get_dnssec(int ifindex, char **ret) { + return network_link_get_string(ifindex, "DNSSEC", ret); } -int sd_network_link_get_dnssec_negative_trust_anchors(int ifindex, char ***nta) { - return network_link_get_strv(ifindex, "DNSSEC_NTA", nta); +int sd_network_link_get_dnssec_negative_trust_anchors(int ifindex, char ***ret) { + return network_link_get_strv(ifindex, "DNSSEC_NTA", ret); } int sd_network_link_get_dns(int ifindex, char ***ret) { @@ -520,14 +520,13 @@ int sd_network_monitor_get_events(sd_network_monitor *m) { return POLLIN; } -int sd_network_monitor_get_timeout(sd_network_monitor *m, uint64_t *timeout_usec) { - +int sd_network_monitor_get_timeout(sd_network_monitor *m, uint64_t *ret_usec) { assert_return(m, -EINVAL); - assert_return(timeout_usec, -EINVAL); + assert_return(ret_usec, -EINVAL); /* For now we will only return UINT64_MAX, since we don't * need any timeout. However, let's have this API to keep our * options open should we later on need it. */ - *timeout_usec = UINT64_MAX; + *ret_usec = UINT64_MAX; return 0; } diff --git a/src/systemd/sd-network.h b/src/systemd/sd-network.h index dfbbc28276..b89e035fd6 100644 --- a/src/systemd/sd-network.h +++ b/src/systemd/sd-network.h @@ -49,26 +49,26 @@ _SD_BEGIN_DECLARATIONS; * Possible return codes: * -ENODATA: networkd is not aware of any links */ -int sd_network_get_operational_state(char **state); -int sd_network_get_carrier_state(char **state); -int sd_network_get_address_state(char **state); -int sd_network_get_ipv4_address_state(char **state); -int sd_network_get_ipv6_address_state(char **state); -int sd_network_get_online_state(char **state); +int sd_network_get_operational_state(char **ret); +int sd_network_get_carrier_state(char **ret); +int sd_network_get_address_state(char **ret); +int sd_network_get_ipv4_address_state(char **ret); +int sd_network_get_ipv6_address_state(char **ret); +int sd_network_get_online_state(char **ret); /* Get DNS entries for all links. These are string representations of * IP addresses */ -int sd_network_get_dns(char ***dns); +int sd_network_get_dns(char ***ret); /* Get NTP entries for all links. These are domain names or string * representations of IP addresses */ -int sd_network_get_ntp(char ***ntp); +int sd_network_get_ntp(char ***ret); /* Get the search domains for all links. */ -int sd_network_get_search_domains(char ***domains); +int sd_network_get_search_domains(char ***ret); /* Get the search domains for all links. */ -int sd_network_get_route_domains(char ***domains); +int sd_network_get_route_domains(char ***ret); /* Get setup state from ifindex. * Possible states: @@ -81,7 +81,7 @@ int sd_network_get_route_domains(char ***domains); * Possible return codes: * -ENODATA: networkd is not aware of the link */ -int sd_network_link_get_setup_state(int ifindex, char **state); +int sd_network_link_get_setup_state(int ifindex, char **ret); /* Get operational state from ifindex. * Possible states: @@ -94,14 +94,14 @@ int sd_network_link_get_setup_state(int ifindex, char **state); * Possible return codes: * -ENODATA: networkd is not aware of the link */ -int sd_network_link_get_operational_state(int ifindex, char **state); -int sd_network_link_get_required_operstate_for_online(int ifindex, char **state); -int sd_network_link_get_required_family_for_online(int ifindex, char **state); -int sd_network_link_get_carrier_state(int ifindex, char **state); -int sd_network_link_get_address_state(int ifindex, char **state); -int sd_network_link_get_ipv4_address_state(int ifindex, char **state); -int sd_network_link_get_ipv6_address_state(int ifindex, char **state); -int sd_network_link_get_online_state(int ifindex, char **state); +int sd_network_link_get_operational_state(int ifindex, char **ret); +int sd_network_link_get_required_operstate_for_online(int ifindex, char **ret); +int sd_network_link_get_required_family_for_online(int ifindex, char **ret); +int sd_network_link_get_carrier_state(int ifindex, char **ret); +int sd_network_link_get_address_state(int ifindex, char **ret); +int sd_network_link_get_ipv4_address_state(int ifindex, char **ret); +int sd_network_link_get_ipv6_address_state(int ifindex, char **ret); +int sd_network_link_get_online_state(int ifindex, char **ret); /* Indicates whether the network is relevant to being online. * Possible return codes: @@ -114,10 +114,10 @@ int sd_network_link_get_required_for_online(int ifindex); /* Get activation policy for ifindex. * Possible values are as specified for ActivationPolicy= */ -int sd_network_link_get_activation_policy(int ifindex, char **policy); +int sd_network_link_get_activation_policy(int ifindex, char **ret); /* Get path to .network file applied to link */ -int sd_network_link_get_network_file(int ifindex, char **filename); +int sd_network_link_get_network_file(int ifindex, char **ret); /* Get DNS entries for a given link. These are string representations of * IP addresses */ @@ -136,7 +136,7 @@ int sd_network_link_get_sip(int ifindex, char ***ret); * Possible return codes: * -ENODATA: networkd is not aware of the link */ -int sd_network_link_get_llmnr(int ifindex, char **llmnr); +int sd_network_link_get_llmnr(int ifindex, char **ret); /* Indicates whether or not MulticastDNS should be enabled for the * link. @@ -144,7 +144,7 @@ int sd_network_link_get_llmnr(int ifindex, char **llmnr); * Possible return codes: * -ENODATA: networkd is not aware of the link */ -int sd_network_link_get_mdns(int ifindex, char **mdns); +int sd_network_link_get_mdns(int ifindex, char **ret); /* Indicates whether or not DNS-over-TLS should be enabled for the * link. @@ -152,41 +152,41 @@ int sd_network_link_get_mdns(int ifindex, char **mdns); * Possible return codes: * -ENODATA: networkd is not aware of the link */ -int sd_network_link_get_dns_over_tls(int ifindex, char **dns_over_tls); +int sd_network_link_get_dns_over_tls(int ifindex, char **ret); /* Indicates whether or not DNSSEC should be enabled for the link * Possible levels of support: yes, no, allow-downgrade * Possible return codes: * -ENODATA: networkd is not aware of the link */ -int sd_network_link_get_dnssec(int ifindex, char **dnssec); +int sd_network_link_get_dnssec(int ifindex, char **ret); /* Returns the list of per-interface DNSSEC negative trust anchors * Possible return codes: * -ENODATA: networkd is not aware of the link, or has no such data */ -int sd_network_link_get_dnssec_negative_trust_anchors(int ifindex, char ***nta); +int sd_network_link_get_dnssec_negative_trust_anchors(int ifindex, char ***ret); /* Get the search DNS domain names for a given link. */ -int sd_network_link_get_search_domains(int ifindex, char ***domains); +int sd_network_link_get_search_domains(int ifindex, char ***ret); /* Get the route DNS domain names for a given link. */ -int sd_network_link_get_route_domains(int ifindex, char ***domains); +int sd_network_link_get_route_domains(int ifindex, char ***ret); /* Get whether this link shall be used as 'default route' for DNS queries */ int sd_network_link_get_dns_default_route(int ifindex); /* Get the carrier interface indexes to which current link is bound to. */ -int sd_network_link_get_carrier_bound_to(int ifindex, int **ifindexes); +int sd_network_link_get_carrier_bound_to(int ifindex, int **ret); /* Get the CARRIERS that are bound to current link. */ -int sd_network_link_get_carrier_bound_by(int ifindex, int **ifindexes); +int sd_network_link_get_carrier_bound_by(int ifindex, int **ret); /* Get DHCPv6 client IAID for a given link. */ -int sd_network_link_get_dhcp6_client_iaid_string(int ifindex, char **iaid); +int sd_network_link_get_dhcp6_client_iaid_string(int ifindex, char **ret); /* Get DHCPv6 client DUID for a given link. */ -int sd_network_link_get_dhcp6_client_duid_string(int ifindex, char **duid); +int sd_network_link_get_dhcp6_client_duid_string(int ifindex, char **ret); int sd_network_link_get_stat(int ifindex, struct stat *ret); @@ -209,7 +209,7 @@ int sd_network_monitor_get_fd(sd_network_monitor *m); int sd_network_monitor_get_events(sd_network_monitor *m); /* Get timeout for poll(), as usec value relative to CLOCK_MONOTONIC's epoch */ -int sd_network_monitor_get_timeout(sd_network_monitor *m, uint64_t *timeout_usec); +int sd_network_monitor_get_timeout(sd_network_monitor *m, uint64_t *ret_usec); _SD_DEFINE_POINTER_CLEANUP_FUNC(sd_network_monitor, sd_network_monitor_unref); From ce2e75021c33e0a21fee1a467761bec7c5950fc3 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sat, 24 Sep 2022 09:01:58 +0900 Subject: [PATCH 4/8] sd-network: propagate -ENOENT On -ENOENT, it suggests that network-manager is not running, and interfaces are not unmanaged. Such information may be useful for callers. --- src/libsystemd/sd-network/sd-network.c | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/src/libsystemd/sd-network/sd-network.c b/src/libsystemd/sd-network/sd-network.c index d059cee637..e4f5f9bc03 100644 --- a/src/libsystemd/sd-network/sd-network.c +++ b/src/libsystemd/sd-network/sd-network.c @@ -25,15 +25,12 @@ static int network_get_string(const char *field, char **ret) { assert_return(ret, -EINVAL); r = parse_env_file(NULL, "/run/systemd/netif/state", field, &s); - if (r == -ENOENT) - return -ENODATA; if (r < 0) return r; if (isempty(s)) return -ENODATA; *ret = TAKE_PTR(s); - return 0; } @@ -69,8 +66,6 @@ static int network_get_strv(const char *key, char ***ret) { assert_return(ret, -EINVAL); r = parse_env_file(NULL, "/run/systemd/netif/state", key, &s); - if (r == -ENOENT) - return -ENODATA; if (r < 0) return r; if (isempty(s)) { @@ -86,7 +81,6 @@ static int network_get_strv(const char *key, char ***ret) { r = (int) strv_length(a); *ret = TAKE_PTR(a); - return r; } @@ -117,15 +111,12 @@ static int network_link_get_string(int ifindex, const char *field, char **ret) { xsprintf(path, "/run/systemd/netif/links/%i", ifindex); r = parse_env_file(NULL, path, field, &s); - if (r == -ENOENT) - return -ENODATA; if (r < 0) return r; if (isempty(s)) return -ENODATA; *ret = TAKE_PTR(s); - return 0; } @@ -140,8 +131,6 @@ static int network_link_get_strv(int ifindex, const char *key, char ***ret) { xsprintf(path, "/run/systemd/netif/links/%i", ifindex); r = parse_env_file(NULL, path, key, &s); - if (r == -ENOENT) - return -ENODATA; if (r < 0) return r; if (isempty(s)) { @@ -157,7 +146,6 @@ static int network_link_get_strv(int ifindex, const char *key, char ***ret) { r = (int) strv_length(a); *ret = TAKE_PTR(a); - return r; } @@ -328,8 +316,6 @@ int sd_network_link_get_dns_default_route(int ifindex) { xsprintf(path, "/run/systemd/netif/links/%i", ifindex); r = parse_env_file(NULL, path, "DNS_DEFAULT_ROUTE", &s); - if (r == -ENOENT) - return -ENODATA; if (r < 0) return r; if (isempty(s)) @@ -349,8 +335,6 @@ static int network_link_get_ifindexes(int ifindex, const char *key, int **ret) { xsprintf(path, "/run/systemd/netif/links/%i", ifindex); r = parse_env_file(NULL, path, key, &s); - if (r == -ENOENT) - return -ENODATA; if (r < 0) return r; @@ -375,7 +359,6 @@ static int network_link_get_ifindexes(int ifindex, const char *key, int **ret) { ifis[c] = 0; /* Let's add a 0 ifindex to the end, to be nice */ *ret = TAKE_PTR(ifis); - return c; } @@ -503,14 +486,12 @@ int sd_network_monitor_flush(sd_network_monitor *m) { } int sd_network_monitor_get_fd(sd_network_monitor *m) { - assert_return(m, -EINVAL); return MONITOR_TO_FD(m); } int sd_network_monitor_get_events(sd_network_monitor *m) { - assert_return(m, -EINVAL); /* For now we will only return POLLIN here, since we don't From 27b13df45ad08a74da1efb333c9f3d2cfbdffa22 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sat, 24 Sep 2022 09:05:05 +0900 Subject: [PATCH 5/8] sd-network: accept all space-like separators --- src/libsystemd/sd-network/sd-network.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libsystemd/sd-network/sd-network.c b/src/libsystemd/sd-network/sd-network.c index e4f5f9bc03..92ee8bc073 100644 --- a/src/libsystemd/sd-network/sd-network.c +++ b/src/libsystemd/sd-network/sd-network.c @@ -73,7 +73,7 @@ static int network_get_strv(const char *key, char ***ret) { return 0; } - a = strv_split(s, " "); + a = strv_split(s, NULL); if (!a) return -ENOMEM; @@ -138,7 +138,7 @@ static int network_link_get_strv(int ifindex, const char *key, char ***ret) { return 0; } - a = strv_split(s, " "); + a = strv_split(s, NULL); if (!a) return -ENOMEM; From c9d22489ca9ef1322b40437e318a65c0c4265d45 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sat, 24 Sep 2022 09:20:36 +0900 Subject: [PATCH 6/8] sd-network: introduce network_link_get_boolean() helper function --- src/libsystemd/sd-network/sd-network.c | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/libsystemd/sd-network/sd-network.c b/src/libsystemd/sd-network/sd-network.c index 92ee8bc073..9d00470fe1 100644 --- a/src/libsystemd/sd-network/sd-network.c +++ b/src/libsystemd/sd-network/sd-network.c @@ -120,6 +120,17 @@ static int network_link_get_string(int ifindex, const char *field, char **ret) { return 0; } +static int network_link_get_boolean(int ifindex, const char *key) { + _cleanup_free_ char *s = NULL; + int r; + + r = network_link_get_string(ifindex, key, &s); + if (r < 0) + return r; + + return parse_boolean(s); +} + static int network_link_get_strv(int ifindex, const char *key, char ***ret) { char path[STRLEN("/run/systemd/netif/links/") + DECIMAL_STR_MAX(ifindex)]; _cleanup_strv_free_ char **a = NULL; @@ -307,20 +318,7 @@ int sd_network_link_get_route_domains(int ifindex, char ***ret) { } int sd_network_link_get_dns_default_route(int ifindex) { - char path[STRLEN("/run/systemd/netif/links/") + DECIMAL_STR_MAX(ifindex)]; - _cleanup_free_ char *s = NULL; - int r; - - assert_return(ifindex > 0, -EINVAL); - - xsprintf(path, "/run/systemd/netif/links/%i", ifindex); - - r = parse_env_file(NULL, path, "DNS_DEFAULT_ROUTE", &s); - if (r < 0) - return r; - if (isempty(s)) - return -ENODATA; - return parse_boolean(s); + return network_link_get_boolean(ifindex, "DNS_DEFAULT_ROUTE"); } static int network_link_get_ifindexes(int ifindex, const char *key, int **ret) { From 778e3da95ef16302956087e6f10ccf7d42499aec Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sat, 24 Sep 2022 09:22:03 +0900 Subject: [PATCH 7/8] sd-network: drop fallback values MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This drops spurious lines in `networkctl status` for unmanaged interfaces. Before: ``` $ networkctl status --lines 0 lo ● 1: lo Link File: n/a Network File: n/a Type: loopback State: carrier (unmanaged) Online state: unknown HW Address: 00:00:00:00:00:00 MTU: 65536 QDisc: noqueue IPv6 Address Generation Mode: eui64 Queue Length (Tx/Rx): 1/1 Address: 127.0.0.1 ::1 Activation Policy: up Required For Online: yes ``` After: ``` $ networkctl status --lines 0 lo ● 1: lo Link File: n/a Network File: n/a State: carrier (unmanaged) Online state: unknown Type: loopback Hardware Address: 00:00:00:00:00:00 MTU: 65536 QDisc: noqueue IPv6 Address Generation Mode: eui64 Number of Queues (Tx/Rx): 1/1 Address: 127.0.0.1 ::1 ``` That is, the lines for Activation Policy and Required For Online are dropped. --- src/libsystemd/sd-network/sd-network.c | 69 ++------------------------ src/network/wait-online/link.c | 10 ++-- 2 files changed, 9 insertions(+), 70 deletions(-) diff --git a/src/libsystemd/sd-network/sd-network.c b/src/libsystemd/sd-network/sd-network.c index 9d00470fe1..4fd4c2502b 100644 --- a/src/libsystemd/sd-network/sd-network.c +++ b/src/libsystemd/sd-network/sd-network.c @@ -173,23 +173,7 @@ int sd_network_link_get_operational_state(int ifindex, char **ret) { } int sd_network_link_get_required_family_for_online(int ifindex, char **ret) { - _cleanup_free_ char *s = NULL; - int r; - - assert_return(ret, -EINVAL); - - r = network_link_get_string(ifindex, "REQUIRED_FAMILY_FOR_ONLINE", &s); - if (r < 0) { - if (r != -ENODATA) - return r; - - s = strdup("any"); - if (!s) - return -ENOMEM; - } - - *ret = TAKE_PTR(s); - return 0; + return network_link_get_string(ifindex, "REQUIRED_FAMILY_FOR_ONLINE", ret); } int sd_network_link_get_carrier_state(int ifindex, char **ret) { @@ -221,60 +205,15 @@ int sd_network_link_get_dhcp6_client_duid_string(int ifindex, char **ret) { } int sd_network_link_get_required_for_online(int ifindex) { - _cleanup_free_ char *s = NULL; - int r; - - r = network_link_get_string(ifindex, "REQUIRED_FOR_ONLINE", &s); - if (r < 0) { - /* Handle -ENODATA as RequiredForOnline=yes, for compatibility */ - if (r == -ENODATA) - return true; - return r; - } - - return parse_boolean(s); + return network_link_get_boolean(ifindex, "REQUIRED_FOR_ONLINE"); } int sd_network_link_get_required_operstate_for_online(int ifindex, char **ret) { - _cleanup_free_ char *s = NULL; - int r; - - assert_return(ret, -EINVAL); - - r = network_link_get_string(ifindex, "REQUIRED_OPER_STATE_FOR_ONLINE", &s); - if (r < 0) { - if (r != -ENODATA) - return r; - - /* For compatibility, assuming degraded. */ - s = strdup("degraded"); - if (!s) - return -ENOMEM; - } - - *ret = TAKE_PTR(s); - return 0; + return network_link_get_string(ifindex, "REQUIRED_OPER_STATE_FOR_ONLINE", ret); } int sd_network_link_get_activation_policy(int ifindex, char **ret) { - _cleanup_free_ char *s = NULL; - int r; - - assert_return(ret, -EINVAL); - - r = network_link_get_string(ifindex, "ACTIVATION_POLICY", &s); - if (r < 0) { - if (r != -ENODATA) - return r; - - /* For compatibility, assuming up. */ - s = strdup("up"); - if (!s) - return -ENOMEM; - } - - *ret = TAKE_PTR(s); - return 0; + return network_link_get_string(ifindex, "ACTIVATION_POLICY", ret); } int sd_network_link_get_llmnr(int ifindex, char **ret) { diff --git a/src/network/wait-online/link.c b/src/network/wait-online/link.c index ce6c8b181c..836d713f79 100644 --- a/src/network/wait-online/link.c +++ b/src/network/wait-online/link.c @@ -107,14 +107,14 @@ int link_update_monitor(Link *l) { r = sd_network_link_get_required_for_online(l->ifindex); if (r < 0) ret = log_link_debug_errno(l, r, "Failed to determine whether the link is required for online or not, " - "ignoring: %m"); - else - l->required_for_online = r > 0; + "assuming required: %m"); + l->required_for_online = r != 0; r = sd_network_link_get_required_operstate_for_online(l->ifindex, &required_operstate); - if (r < 0) + if (r < 0) { ret = log_link_debug_errno(l, r, "Failed to get required operational state, ignoring: %m"); - else if (isempty(required_operstate)) + l->required_operstate = LINK_OPERSTATE_RANGE_DEFAULT; + } else if (isempty(required_operstate)) l->required_operstate = LINK_OPERSTATE_RANGE_DEFAULT; else { r = parse_operational_state_range(required_operstate, &l->required_operstate); From e05dd7718d0b32e039c9e0f7bf3875079d1a359d Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sat, 24 Sep 2022 09:31:00 +0900 Subject: [PATCH 8/8] sd-network: make sd_network_link_get_dns() or friends return -ENODATA To make them consistent with other functions. --- src/libsystemd/sd-network/sd-network.c | 18 ++++-------------- src/resolve/resolved-link.c | 2 +- src/timesync/timesyncd-manager.c | 2 +- 3 files changed, 6 insertions(+), 16 deletions(-) diff --git a/src/libsystemd/sd-network/sd-network.c b/src/libsystemd/sd-network/sd-network.c index 4fd4c2502b..3d6b07f39f 100644 --- a/src/libsystemd/sd-network/sd-network.c +++ b/src/libsystemd/sd-network/sd-network.c @@ -68,10 +68,8 @@ static int network_get_strv(const char *key, char ***ret) { r = parse_env_file(NULL, "/run/systemd/netif/state", key, &s); if (r < 0) return r; - if (isempty(s)) { - *ret = NULL; - return 0; - } + if (isempty(s)) + return -ENODATA; a = strv_split(s, NULL); if (!a) @@ -132,7 +130,6 @@ static int network_link_get_boolean(int ifindex, const char *key) { } static int network_link_get_strv(int ifindex, const char *key, char ***ret) { - char path[STRLEN("/run/systemd/netif/links/") + DECIMAL_STR_MAX(ifindex)]; _cleanup_strv_free_ char **a = NULL; _cleanup_free_ char *s = NULL; int r; @@ -140,14 +137,9 @@ static int network_link_get_strv(int ifindex, const char *key, char ***ret) { assert_return(ifindex > 0, -EINVAL); assert_return(ret, -EINVAL); - xsprintf(path, "/run/systemd/netif/links/%i", ifindex); - r = parse_env_file(NULL, path, key, &s); + r = network_link_get_string(ifindex, key, &s); if (r < 0) return r; - if (isempty(s)) { - *ret = NULL; - return 0; - } a = strv_split(s, NULL); if (!a) @@ -261,7 +253,6 @@ int sd_network_link_get_dns_default_route(int ifindex) { } static int network_link_get_ifindexes(int ifindex, const char *key, int **ret) { - char path[STRLEN("/run/systemd/netif/links/") + DECIMAL_STR_MAX(ifindex)]; _cleanup_free_ int *ifis = NULL; _cleanup_free_ char *s = NULL; size_t c = 0; @@ -270,8 +261,7 @@ static int network_link_get_ifindexes(int ifindex, const char *key, int **ret) { assert_return(ifindex > 0, -EINVAL); assert_return(ret, -EINVAL); - xsprintf(path, "/run/systemd/netif/links/%i", ifindex); - r = parse_env_file(NULL, path, key, &s); + r = network_link_get_string(ifindex, key, &s); if (r < 0) return r; diff --git a/src/resolve/resolved-link.c b/src/resolve/resolved-link.c index cd960e25b1..35b31a5317 100644 --- a/src/resolve/resolved-link.c +++ b/src/resolve/resolved-link.c @@ -469,7 +469,7 @@ static int link_update_dnssec_negative_trust_anchors(Link *l) { r = sd_network_link_get_dnssec_negative_trust_anchors(l->ifindex, &ntas); if (r == -ENODATA) - return r; + return 0; if (r < 0) return r; diff --git a/src/timesync/timesyncd-manager.c b/src/timesync/timesyncd-manager.c index 49eb228318..e9fa00aaca 100644 --- a/src/timesync/timesyncd-manager.c +++ b/src/timesync/timesyncd-manager.c @@ -972,7 +972,7 @@ static int manager_network_read_link_servers(Manager *m) { if (r < 0) { if (r == -ENOMEM) log_oom(); - else + else if (r != -ENODATA) log_debug_errno(r, "Failed to get link NTP servers: %m"); goto clear; }