• 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

60.47
/src/network/networkctl-dump-util.c
1
/* SPDX-License-Identifier: LGPL-2.1-or-later */
2

3
#include "alloc-util.h"
4
#include "format-ifname.h"
5
#include "in-addr-util.h"
6
#include "local-addresses.h"
7
#include "log.h"
8
#include "networkctl-dump-util.h"
9
#include "stdio-util.h"
10
#include "strv.h"
11

12
int dump_list(Table *table, const char *key, char * const *l) {
9,628✔
13
        int r;
9,628✔
14

15
        assert(table);
9,628✔
16
        assert(key);
9,628✔
17

18
        if (strv_isempty(l))
9,628✔
19
                return 0;
20

21
        r = table_add_many(table,
1,470✔
22
                           TABLE_FIELD, key,
23
                           TABLE_STRV, l);
24
        if (r < 0)
1,470✔
UNCOV
25
                return table_log_add_error(r);
×
26

27
        return 0;
28
}
29

30
/* IEEE Organizationally Unique Identifier vendor string */
31
int ieee_oui(sd_hwdb *hwdb, const struct ether_addr *mac, char **ret) {
1,053✔
32
        _cleanup_free_ char *desc = NULL;
2,106✔
33
        const char *description;
1,053✔
34
        char modalias[STRLEN("OUI:XXYYXXYYXXYY") + 1];
1,053✔
35
        int r;
1,053✔
36

37
        assert(ret);
1,053✔
38

39
        if (!hwdb || !mac)
1,053✔
40
                return -EINVAL;
41

42
        /* skip commonly misused 00:00:00 (Xerox) prefix */
43
        if (memcmp(mac, "\0\0\0", 3) == 0)
1,053✔
44
                return -EINVAL;
45

46
        xsprintf(modalias, "OUI:" ETHER_ADDR_FORMAT_STR, ETHER_ADDR_FORMAT_VAL(*mac));
1,051✔
47

48
        r = sd_hwdb_get(hwdb, modalias, "ID_OUI_FROM_DATABASE", &description);
1,051✔
49
        if (r < 0)
1,051✔
50
                return r;
51

52
        desc = strdup(description);
9✔
53
        if (!desc)
9✔
54
                return -ENOMEM;
55

56
        *ret = TAKE_PTR(desc);
9✔
57

58
        return 0;
9✔
59
}
60

61
static int get_gateway_description(
341✔
62
                sd_netlink *rtnl,
63
                sd_hwdb *hwdb,
64
                int ifindex,
65
                int family,
66
                union in_addr_union *gateway,
67
                char **ret) {
68

69
        _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL, *reply = NULL;
682✔
70
        int r;
341✔
71

72
        assert(rtnl);
341✔
73
        assert(ifindex >= 0);
341✔
74
        assert(IN_SET(family, AF_INET, AF_INET6));
341✔
75
        assert(gateway);
341✔
76
        assert(ret);
341✔
77

78
        r = sd_rtnl_message_new_neigh(rtnl, &req, RTM_GETNEIGH, ifindex, family);
341✔
79
        if (r < 0)
341✔
80
                return r;
81

82
        r = sd_netlink_message_set_request_dump(req, true);
341✔
83
        if (r < 0)
341✔
84
                return r;
85

86
        r = sd_netlink_call(rtnl, req, 0, &reply);
341✔
87
        if (r < 0)
341✔
88
                return r;
89

90
        for (sd_netlink_message *m = reply; m; m = sd_netlink_message_next(m)) {
341✔
91
                union in_addr_union gw = IN_ADDR_NULL;
×
92
                struct ether_addr mac = ETHER_ADDR_NULL;
×
93
                uint16_t type;
×
UNCOV
94
                int ifi, fam;
×
95

96
                r = sd_netlink_message_get_errno(m);
×
97
                if (r < 0) {
×
98
                        log_error_errno(r, "Failed to get netlink message, ignoring: %m");
×
UNCOV
99
                        continue;
×
100
                }
101

102
                r = sd_netlink_message_get_type(m, &type);
×
103
                if (r < 0) {
×
104
                        log_error_errno(r, "Failed to get netlink message type, ignoring: %m");
×
UNCOV
105
                        continue;
×
106
                }
107

108
                if (type != RTM_NEWNEIGH) {
×
109
                        log_error("Got unexpected netlink message type %u, ignoring.", type);
×
UNCOV
110
                        continue;
×
111
                }
112

113
                r = sd_rtnl_message_neigh_get_family(m, &fam);
×
114
                if (r < 0) {
×
115
                        log_error_errno(r, "Failed to get rtnl family, ignoring: %m");
×
UNCOV
116
                        continue;
×
117
                }
118

119
                if (fam != family) {
×
120
                        log_error("Got invalid rtnl family %d, ignoring.", fam);
×
UNCOV
121
                        continue;
×
122
                }
123

124
                r = sd_rtnl_message_neigh_get_ifindex(m, &ifi);
×
125
                if (r < 0) {
×
126
                        log_error_errno(r, "Failed to get rtnl ifindex, ignoring: %m");
×
UNCOV
127
                        continue;
×
128
                }
129

130
                if (ifindex > 0 && ifi != ifindex)
×
UNCOV
131
                        continue;
×
132

UNCOV
133
                switch (fam) {
×
134

135
                case AF_INET:
×
136
                        r = sd_netlink_message_read_in_addr(m, NDA_DST, &gw.in);
×
137
                        if (r < 0)
×
UNCOV
138
                                continue;
×
139

140
                        break;
141

142
                case AF_INET6:
×
143
                        r = sd_netlink_message_read_in6_addr(m, NDA_DST, &gw.in6);
×
144
                        if (r < 0)
×
UNCOV
145
                                continue;
×
146

147
                        break;
148

149
                default:
×
UNCOV
150
                        assert_not_reached();
×
151
                }
152

153
                if (!in_addr_equal(fam, &gw, gateway))
×
UNCOV
154
                        continue;
×
155

156
                r = sd_netlink_message_read(m, NDA_LLADDR, sizeof(mac), &mac);
×
157
                if (r < 0)
×
UNCOV
158
                        continue;
×
159

160
                r = ieee_oui(hwdb, &mac, ret);
×
161
                if (r < 0)
×
UNCOV
162
                        continue;
×
163

UNCOV
164
                return 0;
×
165
        }
166

167
        return -ENODATA;
168
}
169

170
int dump_gateways(sd_netlink *rtnl, sd_hwdb *hwdb, Table *table, int ifindex) {
1,191✔
171
        _cleanup_free_ struct local_address *local_addrs = NULL;
1,191✔
172
        _cleanup_strv_free_ char **buf = NULL;
1,191✔
173
        int r, n;
1,191✔
174

175
        assert(rtnl);
1,191✔
176
        assert(table);
1,191✔
177

178
        n = local_gateways(rtnl, ifindex, AF_UNSPEC, &local_addrs);
1,191✔
179
        if (n <= 0)
1,191✔
180
                return n;
181

182
        FOREACH_ARRAY(local, local_addrs, n) {
594✔
183
                _cleanup_free_ char *description = NULL;
341✔
184

185
                r = get_gateway_description(rtnl, hwdb, local->ifindex, local->family, &local->address, &description);
341✔
186
                if (r < 0)
341✔
187
                        log_debug_errno(r, "Could not get description of gateway, ignoring: %m");
341✔
188

189
                /* Show interface name for the entry if we show entries for all interfaces */
190
                r = strv_extendf(&buf, "%s%s%s%s%s%s",
1,364✔
191
                                 IN_ADDR_TO_STRING(local->family, &local->address),
341✔
192
                                 description ? " (" : "",
193
                                 strempty(description),
194
                                 description ? ")" : "",
341✔
195
                                 ifindex <= 0 ? " on " : "",
196
                                 ifindex <= 0 ? FORMAT_IFNAME_FULL(local->ifindex, FORMAT_IFNAME_IFINDEX_WITH_PERCENT) : "");
341✔
197
                if (r < 0)
341✔
UNCOV
198
                        return log_oom();
×
199
        }
200

201
        return dump_list(table, "Gateway", buf);
253✔
202
}
203

204
int dump_addresses(
1,191✔
205
                sd_netlink *rtnl,
206
                sd_dhcp_lease *lease,
207
                Table *table,
208
                int ifindex) {
209

210
        _cleanup_free_ struct local_address *local_addrs = NULL;
1,191✔
211
        _cleanup_strv_free_ char **buf = NULL;
1,191✔
212
        struct in_addr dhcp4_address = {};
1,191✔
213
        int r, n;
1,191✔
214

215
        assert(rtnl);
1,191✔
216
        assert(table);
1,191✔
217

218
        n = local_addresses(rtnl, ifindex, AF_UNSPEC, &local_addrs);
1,191✔
219
        if (n <= 0)
1,191✔
220
                return n;
221

222
        if (lease)
1,014✔
223
                (void) sd_dhcp_lease_get_address(lease, &dhcp4_address);
87✔
224

225
        FOREACH_ARRAY(local, local_addrs, n) {
4,259✔
226
                struct in_addr server_address;
3,245✔
227
                bool dhcp4 = false;
3,245✔
228

229
                if (local->family == AF_INET && in4_addr_equal(&local->address.in, &dhcp4_address))
3,245✔
230
                        dhcp4 = sd_dhcp_lease_get_server_identifier(lease, &server_address) >= 0;
87✔
231

232
                r = strv_extendf(&buf, "%s%s%s%s%s%s",
6,490✔
233
                                 IN_ADDR_TO_STRING(local->family, &local->address),
3,245✔
234
                                 dhcp4 ? " (DHCPv4 via " : "",
235
                                 dhcp4 ? IN4_ADDR_TO_STRING(&server_address) : "",
87✔
236
                                 dhcp4 ? ")" : "",
237
                                 ifindex <= 0 ? " on " : "",
238
                                 ifindex <= 0 ? FORMAT_IFNAME_FULL(local->ifindex, FORMAT_IFNAME_IFINDEX_WITH_PERCENT) : "");
3,245✔
239
                if (r < 0)
3,245✔
UNCOV
240
                        return log_oom();
×
241
        }
242

243
        return dump_list(table, "Address", buf);
1,014✔
244
}
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