From ac999bf07dcc9ed628115eacfcc7d94f582b5ad7 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 10 Jun 2019 04:56:03 +0900 Subject: [PATCH] sd-network: introduce functions for new link and manager states --- src/libsystemd/sd-network/sd-network.c | 28 ++++++++++++++++++++++---- src/network/networkd-link.c | 14 ++++++++++--- src/network/networkd-manager.c | 13 ++++++++++-- src/systemd/sd-network.h | 4 ++++ 4 files changed, 50 insertions(+), 9 deletions(-) diff --git a/src/libsystemd/sd-network/sd-network.c b/src/libsystemd/sd-network/sd-network.c index 2d715043e11..a3c0542d7a0 100644 --- a/src/libsystemd/sd-network/sd-network.c +++ b/src/libsystemd/sd-network/sd-network.c @@ -18,13 +18,13 @@ #include "strv.h" #include "util.h" -_public_ int sd_network_get_operational_state(char **state) { +static int network_get_string(const char *field, char **ret) { _cleanup_free_ char *s = NULL; int r; - assert_return(state, -EINVAL); + assert_return(ret, -EINVAL); - r = parse_env_file(NULL, "/run/systemd/netif/state", "OPER_STATE", &s); + r = parse_env_file(NULL, "/run/systemd/netif/state", field, &s); if (r == -ENOENT) return -ENODATA; if (r < 0) @@ -32,11 +32,23 @@ _public_ int sd_network_get_operational_state(char **state) { if (isempty(s)) return -ENODATA; - *state = TAKE_PTR(s); + *ret = TAKE_PTR(s); return 0; } +_public_ int sd_network_get_operational_state(char **state) { + return network_get_string("OPER_STATE", state); +} + +_public_ int sd_network_get_carrier_state(char **state) { + return network_get_string("CARRIER_STATE", state); +} + +_public_ int sd_network_get_address_state(char **state) { + return network_get_string("ADDRESS_STATE", state); +} + static int network_get_strv(const char *key, char ***ret) { _cleanup_strv_free_ char **a = NULL; _cleanup_free_ char *s = NULL; @@ -149,6 +161,14 @@ _public_ int sd_network_link_get_operational_state(int ifindex, char **state) { return network_link_get_string(ifindex, "OPER_STATE", state); } +_public_ int sd_network_link_get_carrier_state(int ifindex, char **state) { + return network_link_get_string(ifindex, "CARRIER_STATE", state); +} + +_public_ int sd_network_link_get_address_state(int ifindex, char **state) { + return network_link_get_string(ifindex, "ADDRESS_STATE", state); +} + _public_ int sd_network_link_get_required_for_online(int ifindex) { _cleanup_free_ char *s = NULL; int r; diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 6cf88f071e4..8859d5dda21 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -3607,7 +3607,7 @@ static void print_link_hashmap(FILE *f, const char *prefix, Hashmap* h) { int link_save(Link *link) { _cleanup_free_ char *temp_path = NULL; _cleanup_fclose_ FILE *f = NULL; - const char *admin_state, *oper_state; + const char *admin_state, *oper_state, *carrier_state, *address_state; Address *a; Route *route; Iterator i; @@ -3631,6 +3631,12 @@ int link_save(Link *link) { oper_state = link_operstate_to_string(link->operstate); assert(oper_state); + carrier_state = link_carrier_state_to_string(link->carrier_state); + assert(carrier_state); + + address_state = link_address_state_to_string(link->address_state); + assert(address_state); + r = fopen_temporary(link->state_file, &f, &temp_path); if (r < 0) goto fail; @@ -3640,8 +3646,10 @@ int link_save(Link *link) { fprintf(f, "# This is private data. Do not parse.\n" "ADMIN_STATE=%s\n" - "OPER_STATE=%s\n", - admin_state, oper_state); + "OPER_STATE=%s\n" + "CARRIER_STATE=%s\n" + "ADDRESS_STATE=%s\n", + admin_state, oper_state, carrier_state, address_state); if (link->network) { char **dhcp6_domains = NULL, **dhcp_domains = NULL; diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c index 39a6b17c101..a239d876cc4 100644 --- a/src/network/networkd-manager.c +++ b/src/network/networkd-manager.c @@ -1083,7 +1083,7 @@ static int manager_save(Manager *m) { LinkOperationalState operstate = LINK_OPERSTATE_OFF; LinkCarrierState carrier_state = LINK_CARRIER_STATE_OFF; LinkAddressState address_state = LINK_ADDRESS_STATE_OFF; - const char *operstate_str; + const char *operstate_str, *carrier_state_str, *address_state_str; int r; assert(m); @@ -1196,6 +1196,12 @@ static int manager_save(Manager *m) { operstate_str = link_operstate_to_string(operstate); assert(operstate_str); + carrier_state_str = link_carrier_state_to_string(carrier_state); + assert(carrier_state_str); + + address_state_str = link_address_state_to_string(address_state); + assert(address_state_str); + r = fopen_temporary(m->state_file, &f, &temp_path); if (r < 0) return r; @@ -1204,7 +1210,10 @@ static int manager_save(Manager *m) { fprintf(f, "# This is private data. Do not parse.\n" - "OPER_STATE=%s\n", operstate_str); + "OPER_STATE=%s\n" + "CARRIER_STATE=%s\n" + "ADDRESS_STATE=%s\n", + operstate_str, carrier_state_str, address_state_str); ordered_set_print(f, "DNS=", dns); ordered_set_print(f, "NTP=", ntp); diff --git a/src/systemd/sd-network.h b/src/systemd/sd-network.h index 166c30185a1..478e1705881 100644 --- a/src/systemd/sd-network.h +++ b/src/systemd/sd-network.h @@ -49,6 +49,8 @@ _SD_BEGIN_DECLARATIONS; * -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); /* Get DNS entries for all links. These are string representations of * IP addresses */ @@ -90,6 +92,8 @@ int sd_network_link_get_setup_state(int ifindex, char **state); */ 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_carrier_state(int ifindex, char **state); +int sd_network_link_get_address_state(int ifindex, char **state); /* Indicates whether the network is relevant to being online. * Possible return codes: -- 2.39.2