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

systemd / systemd / 14554080340

19 Apr 2025 11:46AM UTC coverage: 72.101% (-0.03%) from 72.13%
14554080340

push

github

web-flow
Add two new paragraphs to coding style about header files (#37188)

296880 of 411754 relevant lines covered (72.1%)

687547.52 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 "format-ifname.h"
4
#include "in-addr-util.h"
5
#include "local-addresses.h"
6
#include "log.h"
7
#include "networkctl-dump-util.h"
8
#include "stdio-util.h"
9
#include "strv.h"
10

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

14
        assert(table);
9,701✔
15
        assert(key);
9,701✔
16

17
        if (strv_isempty(l))
9,701✔
18
                return 0;
19

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

26
        return 0;
27
}
28

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

36
        assert(ret);
1,062✔
37

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

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

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

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

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

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

57
        return 0;
9✔
58
}
59

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

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

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

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

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

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

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

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

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

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

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

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

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

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

132
                switch (fam) {
×
133

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

139
                        break;
140

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

146
                        break;
147

148
                default:
×
149
                        assert_not_reached();
×
150
                }
151

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

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

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

163
                return 0;
×
164
        }
165

166
        return -ENODATA;
167
}
168

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

174
        assert(rtnl);
1,200✔
175
        assert(table);
1,200✔
176

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

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

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

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

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

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

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

214
        assert(rtnl);
1,200✔
215
        assert(table);
1,200✔
216

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

221
        if (lease)
1,024✔
222
                (void) sd_dhcp_lease_get_address(lease, &dhcp4_address);
87✔
223

224
        FOREACH_ARRAY(local, local_addrs, n) {
4,246✔
225
                struct in_addr server_address;
3,222✔
226
                bool dhcp4 = false;
3,222✔
227

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

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

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