• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

systemd / systemd / 14895667988

07 May 2025 08:57PM UTC coverage: 72.225% (-0.007%) from 72.232%
14895667988

push

github

yuwata
network: log_link_message_debug_errno() automatically append %m if necessary

Follow-up for d28746ef5.
Fixes CID#1609753.

0 of 1 new or added line in 1 file covered. (0.0%)

20297 existing lines in 338 files now uncovered.

297407 of 411780 relevant lines covered (72.22%)

695716.85 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

59.42
/src/network/networkd-util.c
1
/* SPDX-License-Identifier: LGPL-2.1-or-later */
2

3
#include "alloc-util.h"
4
#include "bitfield.h"
5
#include "condition.h"
6
#include "conf-parser.h"
7
#include "escape.h"
8
#include "logarithm.h"
9
#include "networkd-link.h"
10
#include "networkd-network.h"
11
#include "networkd-util.h"
12
#include "parse-util.h"
13
#include "string-table.h"
14
#include "string-util.h"
15
#include "web-util.h"
16

17
/* This is used in log messages, and never used in parsing settings. So, upper cases are OK. */
18
static const char * const network_config_source_table[_NETWORK_CONFIG_SOURCE_MAX] = {
19
        [NETWORK_CONFIG_SOURCE_FOREIGN] = "foreign",
20
        [NETWORK_CONFIG_SOURCE_STATIC]  = "static",
21
        [NETWORK_CONFIG_SOURCE_IPV4LL]  = "IPv4LL",
22
        [NETWORK_CONFIG_SOURCE_DHCP4]   = "DHCPv4",
23
        [NETWORK_CONFIG_SOURCE_DHCP6]   = "DHCPv6",
24
        [NETWORK_CONFIG_SOURCE_DHCP_PD] = "DHCP-PD",
25
        [NETWORK_CONFIG_SOURCE_NDISC]   = "NDisc",
26
        [NETWORK_CONFIG_SOURCE_RUNTIME] = "runtime",
27
};
28

29
DEFINE_STRING_TABLE_LOOKUP(network_config_source, NetworkConfigSource);
35,962✔
30

31
int network_config_state_to_string_alloc(NetworkConfigState s, char **ret) {
35,297✔
32
        static const char* states[] = {
35,297✔
33
                [LOG2U(NETWORK_CONFIG_STATE_REQUESTING)]  = "requesting",
34
                [LOG2U(NETWORK_CONFIG_STATE_CONFIGURING)] = "configuring",
35
                [LOG2U(NETWORK_CONFIG_STATE_CONFIGURED)]  = "configured",
36
                [LOG2U(NETWORK_CONFIG_STATE_MARKED)]      = "marked",
37
                [LOG2U(NETWORK_CONFIG_STATE_REMOVING)]    = "removing",
38
        };
39
        _cleanup_free_ char *buf = NULL;
35,297✔
40

41
        assert(ret);
35,297✔
42

43
        for (size_t i = 0; i < ELEMENTSOF(states); i++)
211,782✔
44
                if (BIT_SET(s, i))
176,485✔
45
                        if (!strextend_with_separator(&buf, ",", ASSERT_PTR(states[i])))
26,775✔
46
                                return -ENOMEM;
47

48
        *ret = TAKE_PTR(buf);
35,297✔
49
        return 0;
35,297✔
50
}
51

52
static const char * const address_family_table[_ADDRESS_FAMILY_MAX] = {
53
        [ADDRESS_FAMILY_NO]   = "no",
54
        [ADDRESS_FAMILY_YES]  = "yes",
55
        [ADDRESS_FAMILY_IPV4] = "ipv4",
56
        [ADDRESS_FAMILY_IPV6] = "ipv6",
57
};
58

59
static const char * const routing_policy_rule_address_family_table[_ADDRESS_FAMILY_MAX] = {
60
        [ADDRESS_FAMILY_YES]  = "both",
61
        [ADDRESS_FAMILY_IPV4] = "ipv4",
62
        [ADDRESS_FAMILY_IPV6] = "ipv6",
63
};
64

65
static const char * const nexthop_address_family_table[_ADDRESS_FAMILY_MAX] = {
66
        [ADDRESS_FAMILY_IPV4] = "ipv4",
67
        [ADDRESS_FAMILY_IPV6] = "ipv6",
68
};
69

70
static const char * const duplicate_address_detection_address_family_table[_ADDRESS_FAMILY_MAX] = {
71
        [ADDRESS_FAMILY_NO]   = "none",
72
        [ADDRESS_FAMILY_YES]  = "both",
73
        [ADDRESS_FAMILY_IPV4] = "ipv4",
74
        [ADDRESS_FAMILY_IPV6] = "ipv6",
75
};
76

77
static const char * const dhcp_deprecated_address_family_table[_ADDRESS_FAMILY_MAX] = {
78
        [ADDRESS_FAMILY_NO]   = "none",
79
        [ADDRESS_FAMILY_YES]  = "both",
80
        [ADDRESS_FAMILY_IPV4] = "v4",
81
        [ADDRESS_FAMILY_IPV6] = "v6",
82
};
83

84
static const char * const ip_masquerade_address_family_table[_ADDRESS_FAMILY_MAX] = {
85
        [ADDRESS_FAMILY_NO]   = "no",
86
        [ADDRESS_FAMILY_YES]  = "both",
87
        [ADDRESS_FAMILY_IPV4] = "ipv4",
88
        [ADDRESS_FAMILY_IPV6] = "ipv6",
89
};
90

91
static const char * const dhcp_lease_server_type_table[_SD_DHCP_LEASE_SERVER_TYPE_MAX] = {
92
        [SD_DHCP_LEASE_DNS]  = "DNS servers",
93
        [SD_DHCP_LEASE_NTP]  = "NTP servers",
94
        [SD_DHCP_LEASE_SIP]  = "SIP servers",
95
        [SD_DHCP_LEASE_POP3] = "POP3 servers",
96
        [SD_DHCP_LEASE_SMTP] = "SMTP servers",
97
        [SD_DHCP_LEASE_LPR]  = "LPR servers",
98
};
99

100
DEFINE_STRING_TABLE_LOOKUP_WITH_BOOLEAN(address_family, AddressFamily, ADDRESS_FAMILY_YES);
6,059✔
101

102
AddressFamily link_local_address_family_from_string(const char *s) {
4,603✔
103
        if (streq_ptr(s, "fallback"))         /* compat name */
4,603✔
104
                return ADDRESS_FAMILY_YES;
105
        if (streq_ptr(s, "fallback-ipv4"))    /* compat name */
4,603✔
106
                return ADDRESS_FAMILY_IPV4;
107
        return address_family_from_string(s);
4,603✔
108
}
109

110
DEFINE_STRING_TABLE_LOOKUP(routing_policy_rule_address_family, AddressFamily);
24✔
UNCOV
111
DEFINE_STRING_TABLE_LOOKUP(nexthop_address_family, AddressFamily);
×
112
DEFINE_STRING_TABLE_LOOKUP(duplicate_address_detection_address_family, AddressFamily);
3✔
113
DEFINE_CONFIG_PARSE_ENUM(config_parse_link_local_address_family, link_local_address_family, AddressFamily);
4,603✔
UNCOV
114
DEFINE_STRING_TABLE_LOOKUP_FROM_STRING(dhcp_deprecated_address_family, AddressFamily);
×
115
DEFINE_PRIVATE_STRING_TABLE_LOOKUP_FROM_STRING(ip_masquerade_address_family, AddressFamily);
2,216✔
116
DEFINE_STRING_TABLE_LOOKUP(dhcp_lease_server_type, sd_dhcp_lease_server_type_t);
87✔
117

118
bool link_should_mark_config(Link *link, bool only_static, NetworkConfigSource source, uint8_t protocol) {
1,862✔
119
        /* Always mark static configs. */
120
        if (source == NETWORK_CONFIG_SOURCE_STATIC)
1,862✔
121
                return true;
122

123
        /* When 'only_static' is true, do not mark other configs. */
124
        if (only_static)
832✔
125
                return false;
126

127
        /* Always ignore dynamically assigned configs. */
128
        if (source != NETWORK_CONFIG_SOURCE_FOREIGN)
348✔
129
                return false;
130

131
        /* When only_static is false, the logic is conditionalized with KeepConfiguration=. Hence, the
132
         * interface needs to have a matching .network file. */
133
        assert(link);
62✔
134
        assert(link->network);
62✔
135

136
        /* When KeepConfiguration=yes, keep all foreign configs. */
137
        if (FLAGS_SET(link->network->keep_configuration, KEEP_CONFIGURATION_YES))
62✔
138
                return false;
139

140
        /* When static, keep all static configs. */
141
        if (FLAGS_SET(link->network->keep_configuration, KEEP_CONFIGURATION_STATIC) &&
61✔
142
            protocol == RTPROT_STATIC)
143
                return false;
144

145
        /* When dynamic, keep all dynamic configs. */
146
        if (FLAGS_SET(link->network->keep_configuration, KEEP_CONFIGURATION_DYNAMIC) &&
61✔
147
            IN_SET(protocol, RTPROT_DHCP, RTPROT_RA, RTPROT_REDIRECT))
2✔
148
                return false;
2✔
149

150
        /* Otherwise, mark the config. */
151
        return true;
152
}
153

154
int config_parse_ip_masquerade(
2,216✔
155
                const char *unit,
156
                const char *filename,
157
                unsigned line,
158
                const char *section,
159
                unsigned section_line,
160
                const char *lvalue,
161
                int ltype,
162
                const char *rvalue,
163
                void *data,
164
                void *userdata) {
165

166
        AddressFamily a, *ret = data;
2,216✔
167
        int r;
2,216✔
168

169
        if (isempty(rvalue)) {
2,216✔
170
                *ret = ADDRESS_FAMILY_NO;
×
UNCOV
171
                return 0;
×
172
        }
173

174
        r = parse_boolean(rvalue);
2,216✔
175
        if (r >= 0) {
2,216✔
176
                if (r)
×
UNCOV
177
                        log_syntax(unit, LOG_WARNING, filename, line, 0,
×
178
                                   "IPMasquerade=%s is deprecated, and it is handled as \"ipv4\" instead of \"both\". "
179
                                   "Please use \"ipv4\" or \"both\".",
180
                                   rvalue);
181

182
                *ret = r ? ADDRESS_FAMILY_IPV4 : ADDRESS_FAMILY_NO;
×
UNCOV
183
                return 0;
×
184
        }
185

186
        a = ip_masquerade_address_family_from_string(rvalue);
2,216✔
187
        if (a < 0) {
2,216✔
UNCOV
188
                log_syntax(unit, LOG_WARNING, filename, line, a,
×
189
                           "Failed to parse IPMasquerade= setting, ignoring assignment: %s", rvalue);
UNCOV
190
                return 0;
×
191
        }
192

193
        *ret = a;
2,216✔
194
        return 0;
2,216✔
195
}
196

UNCOV
197
int config_parse_mud_url(
×
198
                const char *unit,
199
                const char *filename,
200
                unsigned line,
201
                const char *section,
202
                unsigned section_line,
203
                const char *lvalue,
204
                int ltype,
205
                const char *rvalue,
206
                void *data,
207
                void *userdata) {
208

209
        _cleanup_free_ char *unescaped = NULL;
×
210
        char **url = ASSERT_PTR(data);
×
UNCOV
211
        ssize_t l;
×
212

213
        assert(filename);
×
214
        assert(lvalue);
×
UNCOV
215
        assert(rvalue);
×
216

217
        if (isempty(rvalue)) {
×
218
                *url = mfree(*url);
×
UNCOV
219
                return 0;
×
220
        }
221

222
        l = cunescape(rvalue, 0, &unescaped);
×
223
        if (l < 0) {
×
UNCOV
224
                log_syntax(unit, LOG_WARNING, filename, line, l,
×
225
                           "Failed to unescape MUD URL, ignoring: %s", rvalue);
UNCOV
226
                return 0;
×
227
        }
228

229
        if (l > UINT8_MAX || !http_url_is_valid(unescaped)) {
×
UNCOV
230
                log_syntax(unit, LOG_WARNING, filename, line, 0,
×
231
                           "Invalid MUD URL, ignoring: %s", rvalue);
UNCOV
232
                return 0;
×
233
        }
234

UNCOV
235
        return free_and_replace(*url, unescaped);
×
236
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc