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

systemd / systemd / 14872145375

06 May 2025 09:07PM UTC coverage: 72.232% (+0.02%) from 72.214%
14872145375

push

github

DaanDeMeyer
string-table: annotate _to_string and _from_string with _const_ and _pure_, respectively

Follow-up for c94f6ab1b

297286 of 411572 relevant lines covered (72.23%)

695615.99 hits per line

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

83.66
/src/shared/bus-message-util.c
1
/* SPDX-License-Identifier: LGPL-2.1-or-later */
2

3
#include <unistd.h>
4

5
#include "bus-message-util.h"
6
#include "bus-util.h"
7
#include "copy.h"
8
#include "resolve-util.h"
9

10
int bus_message_read_id128(sd_bus_message *m, sd_id128_t *ret) {
1,239✔
11
        const void *a;
1,239✔
12
        size_t sz;
1,239✔
13
        int r;
1,239✔
14

15
        assert(m);
1,239✔
16

17
        r = sd_bus_message_read_array(m, 'y', &a, &sz);
1,239✔
18
        if (r < 0)
1,239✔
19
                return r;
1,239✔
20

21
        switch (sz) {
1,239✔
22

23
        case 0:
276✔
24
                if (ret)
276✔
25
                        *ret = SD_ID128_NULL;
276✔
26
                return 0;
27

28
        case sizeof(sd_id128_t):
963✔
29
                if (ret)
963✔
30
                        memcpy(ret, a, sz);
963✔
31
                return !memeqzero(a, sz); /* This mimics sd_id128_is_null(), but ret may be NULL,
963✔
32
                                           * and a may be misaligned, so use memeqzero() here. */
33

34
        default:
35
                return -EINVAL;
36
        }
37
}
38

39
int bus_message_read_ifindex(sd_bus_message *message, sd_bus_error *error, int *ret) {
148✔
40
        int ifindex, r;
148✔
41

42
        assert(message);
148✔
43
        assert(ret);
148✔
44

45
        assert_cc(sizeof(int) == sizeof(int32_t));
148✔
46

47
        r = sd_bus_message_read(message, "i", &ifindex);
148✔
48
        if (r < 0)
148✔
49
                return r;
148✔
50

51
        if (ifindex <= 0)
148✔
52
                return sd_bus_error_set(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid interface index");
×
53

54
        *ret = ifindex;
148✔
55

56
        return 0;
148✔
57
}
58

59
int bus_message_read_family(sd_bus_message *message, sd_bus_error *error, int *ret) {
424✔
60
        int family, r;
424✔
61

62
        assert(message);
424✔
63
        assert(ret);
424✔
64

65
        assert_cc(sizeof(int) == sizeof(int32_t));
424✔
66

67
        r = sd_bus_message_read(message, "i", &family);
424✔
68
        if (r < 0)
424✔
69
                return r;
424✔
70

71
        if (!IN_SET(family, AF_INET, AF_INET6))
424✔
72
                return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Unknown address family %i", family);
156✔
73

74
        *ret = family;
268✔
75
        return 0;
268✔
76
}
77

78
int bus_message_read_in_addr_auto(sd_bus_message *message, sd_bus_error *error, int *ret_family, union in_addr_union *ret_addr) {
424✔
79
        int family, r;
424✔
80
        const void *d;
424✔
81
        size_t sz;
424✔
82

83
        assert(message);
424✔
84

85
        r = bus_message_read_family(message, error, &family);
424✔
86
        if (r < 0)
424✔
87
                return r;
424✔
88

89
        r = sd_bus_message_read_array(message, 'y', &d, &sz);
268✔
90
        if (r < 0)
268✔
91
                return r;
92

93
        if (sz != FAMILY_ADDRESS_SIZE(family))
268✔
94
                return sd_bus_error_set(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid address size");
×
95

96
        if (ret_family)
268✔
97
                *ret_family = family;
268✔
98
        if (ret_addr)
268✔
99
                memcpy(ret_addr, d, sz);
268✔
100
        return 0;
101
}
102

103
static int bus_message_read_dns_one(
51✔
104
                        sd_bus_message *message,
105
                        sd_bus_error *error,
106
                        bool extended,
107
                        int *ret_family,
108
                        union in_addr_union *ret_address,
109
                        uint16_t *ret_port,
110
                        const char **ret_server_name) {
111
        const char *server_name = NULL;
51✔
112
        union in_addr_union a;
51✔
113
        uint16_t port = 0;
51✔
114
        int family, r;
51✔
115

116
        assert(message);
51✔
117
        assert(ret_family);
51✔
118
        assert(ret_address);
51✔
119
        assert(ret_port);
51✔
120
        assert(ret_server_name);
51✔
121

122
        r = sd_bus_message_enter_container(message, 'r', extended ? "iayqs" : "iay");
51✔
123
        if (r <= 0)
51✔
124
                return r;
51✔
125

126
        r = bus_message_read_in_addr_auto(message, error, &family, &a);
32✔
127
        if (r < 0)
32✔
128
                return r;
129

130
        if (!dns_server_address_valid(family, &a)) {
32✔
131
                r = sd_bus_error_set(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid DNS server address");
×
132
                assert(r < 0);
×
133
                return r;
134
        }
135

136
        if (extended) {
32✔
137
                r = sd_bus_message_read(message, "q", &port);
32✔
138
                if (r < 0)
32✔
139
                        return r;
140

141
                if (IN_SET(port, 53, 853))
32✔
142
                        port = 0;
×
143

144
                r = sd_bus_message_read(message, "s", &server_name);
32✔
145
                if (r < 0)
32✔
146
                        return r;
147
        }
148

149
        r = sd_bus_message_exit_container(message);
32✔
150
        if (r < 0)
32✔
151
                return r;
152

153
        *ret_family = family;
32✔
154
        *ret_address = a;
32✔
155
        *ret_port = port;
32✔
156
        *ret_server_name = server_name;
32✔
157

158
        return 1;
32✔
159
}
160

161
int bus_message_read_dns_servers(
19✔
162
                        sd_bus_message *message,
163
                        sd_bus_error *error,
164
                        bool extended,
165
                        struct in_addr_full ***ret_dns,
166
                        size_t *ret_n_dns) {
167

168
        struct in_addr_full **dns = NULL;
19✔
169
        size_t n = 0;
19✔
170
        int r;
19✔
171

172
        assert(message);
19✔
173
        assert(ret_dns);
19✔
174
        assert(ret_n_dns);
19✔
175

176
        r = sd_bus_message_enter_container(message, 'a', extended ? "(iayqs)" : "(iay)");
19✔
177
        if (r < 0)
19✔
178
                return r;
19✔
179

180
        for (;;) {
83✔
181
                const char *server_name;
51✔
182
                union in_addr_union a;
51✔
183
                uint16_t port;
51✔
184
                int family;
51✔
185

186
                r = bus_message_read_dns_one(message, error, extended, &family, &a, &port, &server_name);
51✔
187
                if (r < 0)
51✔
188
                        goto clear;
×
189
                if (r == 0)
51✔
190
                        break;
191

192
                if (!GREEDY_REALLOC(dns, n+1)) {
32✔
193
                        r = -ENOMEM;
×
194
                        goto clear;
×
195
                }
196

197
                r = in_addr_full_new(family, &a, port, 0, server_name, dns + n);
32✔
198
                if (r < 0)
32✔
199
                        goto clear;
×
200

201
                n++;
32✔
202
        }
203

204
        *ret_dns = TAKE_PTR(dns);
19✔
205
        *ret_n_dns = n;
19✔
206
        return 0;
19✔
207

208
clear:
×
209
        for (size_t i = 0; i < n; i++)
×
210
                in_addr_full_free(dns[i]);
×
211
        free(dns);
×
212

213
        return r;
×
214
}
215

216
int bus_message_append_string_set(sd_bus_message *m, const Set *set) {
1,447✔
217
        int r;
1,447✔
218

219
        assert(m);
1,447✔
220

221
        r = sd_bus_message_open_container(m, 'a', "s");
1,447✔
222
        if (r < 0)
1,447✔
223
                return r;
1,447✔
224

225
        const char *s;
1,447✔
226
        SET_FOREACH(s, set) {
1,450✔
227
                r = sd_bus_message_append(m, "s", s);
3✔
228
                if (r < 0)
3✔
229
                        return r;
×
230
        }
231

232
        return sd_bus_message_close_container(m);
1,447✔
233
}
234

235
int bus_message_dump_string(sd_bus_message *message) {
×
236
        const char *s;
×
237
        int r;
×
238

239
        assert(message);
×
240

241
        r = sd_bus_message_read(message, "s", &s);
×
242
        if (r < 0)
×
243
                return bus_log_parse_error(r);
×
244

245
        fputs(s, stdout);
×
246
        return 0;
247
}
248

249
int bus_message_dump_fd(sd_bus_message *message) {
64✔
250
        int fd, r;
64✔
251

252
        assert(message);
64✔
253

254
        r = sd_bus_message_read(message, "h", &fd);
64✔
255
        if (r < 0)
64✔
256
                return bus_log_parse_error(r);
×
257

258
        fflush(stdout);
64✔
259
        r = copy_bytes(fd, STDOUT_FILENO, UINT64_MAX, 0);
64✔
260
        if (r < 0)
64✔
261
                return log_error_errno(r, "Failed to dump contents in received file descriptor: %m");
×
262

263
        return 0;
264
}
265

266
DEFINE_HASH_OPS_WITH_VALUE_DESTRUCTOR(bus_message_hash_ops,
73✔
267
                                      void, trivial_hash_func, trivial_compare_func,
268
                                      sd_bus_message, sd_bus_message_unref);
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