diff options
author | Alvin Šipraga <alsi@bang-olufsen.dk> | 2021-03-30 23:18:08 +0200 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2021-05-19 10:34:06 +0900 |
commit | 84a257ab65b0ce866e818cea202e13118056c370 (patch) | |
tree | 547b0b44f2a5d87e66566acc3b8117bb1a2cd511 /src/libsystemd/sd-network | |
parent | bcdcc59648dabefaed4267a2432a9e7928f93cb5 (diff) | |
download | systemd-84a257ab65b0ce866e818cea202e13118056c370.tar.gz |
network: use the overall online state in network_is_online()
Since networkd advertises a reliable online state, use it in
network_is_online(). If for some reason networkd does not know the
online state (e.g. it does not manage any of the network interfaces),
fall back to the original best-guess logic.
Diffstat (limited to 'src/libsystemd/sd-network')
-rw-r--r-- | src/libsystemd/sd-network/network-util.c | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/src/libsystemd/sd-network/network-util.c b/src/libsystemd/sd-network/network-util.c index b01f883666..4a648caa5d 100644 --- a/src/libsystemd/sd-network/network-util.c +++ b/src/libsystemd/sd-network/network-util.c @@ -13,20 +13,34 @@ #include "strv.h" bool network_is_online(void) { - _cleanup_free_ char *carrier_state = NULL, *addr_state = NULL; + _cleanup_free_ char *online_state = NULL; + LinkOnlineState state; int r; - r = sd_network_get_carrier_state(&carrier_state); - if (r < 0) /* if we don't know anything, we consider the system online */ - return true; + r = sd_network_get_online_state(&online_state); + if (r < 0) + state = _LINK_ONLINE_STATE_INVALID; + else + state = link_online_state_from_string(online_state); - r = sd_network_get_address_state(&addr_state); - if (r < 0) /* if we don't know anything, we consider the system online */ + if (state >= LINK_ONLINE_STATE_PARTIAL) return true; + else if (state < 0) { + _cleanup_free_ char *carrier_state = NULL, *addr_state = NULL; - if (STR_IN_SET(carrier_state, "degraded-carrier", "carrier") && - STR_IN_SET(addr_state, "routable", "degraded")) - return true; + r = sd_network_get_carrier_state(&carrier_state); + if (r < 0) /* if we don't know anything, we consider the system online */ + return true; + + r = sd_network_get_address_state(&addr_state); + if (r < 0) /* if we don't know anything, we consider the system online */ + return true; + + /* we don't know the online state for certain, so make an educated guess */ + if (STR_IN_SET(carrier_state, "degraded-carrier", "carrier") && + STR_IN_SET(addr_state, "routable", "degraded")) + return true; + } return false; } |