summaryrefslogtreecommitdiff
path: root/src/libsystemd/sd-network
diff options
context:
space:
mode:
authorAlvin Šipraga <alsi@bang-olufsen.dk>2021-03-30 23:18:08 +0200
committerYu Watanabe <watanabe.yu+github@gmail.com>2021-05-19 10:34:06 +0900
commit84a257ab65b0ce866e818cea202e13118056c370 (patch)
tree547b0b44f2a5d87e66566acc3b8117bb1a2cd511 /src/libsystemd/sd-network
parentbcdcc59648dabefaed4267a2432a9e7928f93cb5 (diff)
downloadsystemd-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.c32
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;
}