]>
Commit | Line | Data |
---|---|---|
db9ecf05 | 1 | /* SPDX-License-Identifier: LGPL-2.1-or-later */ |
84e51726 | 2 | |
b5efdb8a | 3 | #include "alloc-util.h" |
3ffd4af2 | 4 | #include "fd-util.h" |
84e51726 | 5 | #include "network-util.h" |
2cd6b932 | 6 | #include "string-table.h" |
3ffd4af2 | 7 | #include "strv.h" |
84e51726 LP |
8 | |
9 | bool network_is_online(void) { | |
1a650937 | 10 | _cleanup_free_ char *carrier_state = NULL, *addr_state = NULL; |
84e51726 LP |
11 | int r; |
12 | ||
1a650937 | 13 | r = sd_network_get_carrier_state(&carrier_state); |
84e51726 LP |
14 | if (r < 0) /* if we don't know anything, we consider the system online */ |
15 | return true; | |
16 | ||
1a650937 YW |
17 | r = sd_network_get_address_state(&addr_state); |
18 | if (r < 0) /* if we don't know anything, we consider the system online */ | |
19 | return true; | |
20 | ||
21 | if (STR_IN_SET(carrier_state, "degraded-carrier", "carrier") && | |
22 | STR_IN_SET(addr_state, "routable", "degraded")) | |
84e51726 LP |
23 | return true; |
24 | ||
25 | return false; | |
26 | } | |
2cd6b932 YW |
27 | |
28 | static const char* const link_operstate_table[_LINK_OPERSTATE_MAX] = { | |
5cbaf95e | 29 | [LINK_OPERSTATE_MISSING] = "missing", |
c9cc0383 YW |
30 | [LINK_OPERSTATE_OFF] = "off", |
31 | [LINK_OPERSTATE_NO_CARRIER] = "no-carrier", | |
32 | [LINK_OPERSTATE_DORMANT] = "dormant", | |
33 | [LINK_OPERSTATE_DEGRADED_CARRIER] = "degraded-carrier", | |
34 | [LINK_OPERSTATE_CARRIER] = "carrier", | |
35 | [LINK_OPERSTATE_DEGRADED] = "degraded", | |
36 | [LINK_OPERSTATE_ENSLAVED] = "enslaved", | |
37 | [LINK_OPERSTATE_ROUTABLE] = "routable", | |
2cd6b932 YW |
38 | }; |
39 | ||
40 | DEFINE_STRING_TABLE_LOOKUP(link_operstate, LinkOperationalState); | |
35c5a9ca YW |
41 | |
42 | static const char* const link_carrier_state_table[_LINK_CARRIER_STATE_MAX] = { | |
43 | [LINK_CARRIER_STATE_OFF] = "off", | |
44 | [LINK_CARRIER_STATE_NO_CARRIER] = "no-carrier", | |
45 | [LINK_CARRIER_STATE_DORMANT] = "dormant", | |
46 | [LINK_CARRIER_STATE_DEGRADED_CARRIER] = "degraded-carrier", | |
47 | [LINK_CARRIER_STATE_CARRIER] = "carrier", | |
48 | [LINK_CARRIER_STATE_ENSLAVED] = "enslaved", | |
49 | }; | |
50 | ||
51 | DEFINE_STRING_TABLE_LOOKUP(link_carrier_state, LinkCarrierState); | |
52 | ||
53 | static const char* const link_address_state_table[_LINK_ADDRESS_STATE_MAX] = { | |
54 | [LINK_ADDRESS_STATE_OFF] = "off", | |
55 | [LINK_ADDRESS_STATE_DEGRADED] = "degraded", | |
56 | [LINK_ADDRESS_STATE_ROUTABLE] = "routable", | |
57 | }; | |
58 | ||
59 | DEFINE_STRING_TABLE_LOOKUP(link_address_state, LinkAddressState); | |
75cd4a5d DDM |
60 | |
61 | int parse_operational_state_range(const char *str, LinkOperationalStateRange *out) { | |
62 | LinkOperationalStateRange range = { _LINK_OPERSTATE_INVALID, _LINK_OPERSTATE_INVALID }; | |
63 | _cleanup_free_ const char *min = NULL; | |
64 | const char *p; | |
65 | ||
66 | assert(str); | |
67 | assert(out); | |
68 | ||
69 | p = strchr(str, ':'); | |
70 | if (p) { | |
71 | min = strndup(str, p - str); | |
72 | ||
73 | if (!isempty(p + 1)) { | |
74 | range.max = link_operstate_from_string(p + 1); | |
75 | if (range.max < 0) | |
76 | return -EINVAL; | |
77 | } | |
78 | } else | |
79 | min = strdup(str); | |
80 | ||
81 | if (!min) | |
82 | return -ENOMEM; | |
83 | ||
84 | if (!isempty(min)) { | |
85 | range.min = link_operstate_from_string(min); | |
86 | if (range.min < 0) | |
87 | return -EINVAL; | |
88 | } | |
89 | ||
90 | /* Fail on empty strings. */ | |
91 | if (range.min == _LINK_OPERSTATE_INVALID && range.max == _LINK_OPERSTATE_INVALID) | |
92 | return -EINVAL; | |
93 | ||
94 | if (range.min == _LINK_OPERSTATE_INVALID) | |
5cbaf95e | 95 | range.min = LINK_OPERSTATE_MISSING; |
75cd4a5d DDM |
96 | if (range.max == _LINK_OPERSTATE_INVALID) |
97 | range.max = LINK_OPERSTATE_ROUTABLE; | |
98 | ||
99 | if (range.min > range.max) | |
100 | return -EINVAL; | |
101 | ||
102 | *out = range; | |
103 | ||
104 | return 0; | |
105 | } |