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

systemd / systemd / 15263807472

26 May 2025 08:53PM UTC coverage: 72.046% (-0.002%) from 72.048%
15263807472

push

github

yuwata
src/core/manager.c: log preset activity on first boot

This gives us a little more information about what units were enabled
or disabled on that first boot and will be useful for OS developers
tracking down the source of unit state.

An example with this enabled looks like:

```
NET: Registered PF_VSOCK protocol family
systemd[1]: Applying preset policy.
systemd[1]: Unit /etc/systemd/system/dnsmasq.service is masked, ignoring.
systemd[1]: Unit /etc/systemd/system/systemd-repart.service is masked, ignoring.
systemd[1]: Removed '/etc/systemd/system/sockets.target.wants/systemd-resolved-monitor.socket'.
systemd[1]: Removed '/etc/systemd/system/sockets.target.wants/systemd-resolved-varlink.socket'.
systemd[1]: Created symlink '/etc/systemd/system/multi-user.target.wants/var-mnt-workdir.mount' → '/etc/systemd/system/var-mnt-workdir.mount'.
systemd[1]: Created symlink '/etc/systemd/system/multi-user.target.wants/var-mnt-workdir\x2dtmp.mount' → '/etc/systemd/system/var-mnt-workdir\x2dtmp.mount'.
systemd[1]: Created symlink '/etc/systemd/system/afterburn-sshkeys.target.requires/afterburn-sshkeys@core.service' → '/usr/lib/systemd/system/afterburn-sshkeys@.service'.
systemd[1]: Created symlink '/etc/systemd/system/sockets.target.wants/systemd-resolved-varlink.socket' → '/usr/lib/systemd/system/systemd-resolved-varlink.socket'.
systemd[1]: Created symlink '/etc/systemd/system/sockets.target.wants/systemd-resolved-monitor.socket' → '/usr/lib/systemd/system/systemd-resolved-monitor.socket'.
systemd[1]: Populated /etc with preset unit settings.
```

Considering it only happens on first boot and not on every boot I think
the extra information is worth the extra verbosity in the logs just for
that boot.

5 of 6 new or added lines in 1 file covered. (83.33%)

5463 existing lines in 165 files now uncovered.

299151 of 415222 relevant lines covered (72.05%)

702386.45 hits per line

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

77.78
/src/basic/socket-util.h
1
/* SPDX-License-Identifier: LGPL-2.1-or-later */
2
#pragma once
3

4
#include <linux/if_ether.h>
5
#include <linux/if_infiniband.h>
6
#include <linux/if_packet.h>
7
#include <linux/netlink.h>
8
#include <linux/vm_sockets.h>
9
#include <netinet/in.h>
10
#include <sys/socket.h>
11
#include <sys/un.h>
12

13
#include "forward.h"
14
#include "memory-util.h"
15
#include "missing_network.h"
16
#include "missing_socket.h"
17

18
union sockaddr_union {
19
        /* The minimal, abstract version */
20
        struct sockaddr sa;
21

22
        /* The libc provided version that allocates "enough room" for every protocol */
23
        struct sockaddr_storage storage;
24

25
        /* Protocol-specific implementations */
26
        struct sockaddr_in in;
27
        struct sockaddr_in6 in6;
28
        struct sockaddr_un un;
29
        struct sockaddr_nl nl;
30
        struct sockaddr_ll ll;
31
        struct sockaddr_vm vm;
32

33
        /* Ensure there is enough space to store Infiniband addresses */
34
        uint8_t ll_buffer[offsetof(struct sockaddr_ll, sll_addr) + CONST_MAX(ETH_ALEN, INFINIBAND_ALEN)];
35

36
        /* Ensure there is enough space after the AF_UNIX sun_path for one more NUL byte, just to be sure that the path
37
         * component is always followed by at least one NUL byte. */
38
        uint8_t un_buffer[sizeof(struct sockaddr_un) + 1];
39
};
40

41
#define SUN_PATH_LEN (sizeof(((struct sockaddr_un){}).sun_path))
42

43
typedef struct SocketAddress {
44
        union sockaddr_union sockaddr;
45

46
        /* We store the size here explicitly due to the weird
47
         * sockaddr_un semantics for abstract sockets */
48
        socklen_t size;
49

50
        /* Socket type, i.e. SOCK_STREAM, SOCK_DGRAM, ... */
51
        int type;
52

53
        /* Socket protocol, IPPROTO_xxx, usually 0, except for netlink */
54
        int protocol;
55
} SocketAddress;
56

57
typedef enum SocketAddressBindIPv6Only {
58
        SOCKET_ADDRESS_DEFAULT,
59
        SOCKET_ADDRESS_BOTH,
60
        SOCKET_ADDRESS_IPV6_ONLY,
61
        _SOCKET_ADDRESS_BIND_IPV6_ONLY_MAX,
62
        _SOCKET_ADDRESS_BIND_IPV6_ONLY_INVALID = -EINVAL,
63
} SocketAddressBindIPv6Only;
64

65
#define socket_address_family(a) ((a)->sockaddr.sa.sa_family)
66

67
const char* socket_address_type_to_string(int t) _const_;
68
int socket_address_type_from_string(const char *s) _pure_;
69

70
int sockaddr_un_unlink(const struct sockaddr_un *sa);
71

72
static inline int socket_address_unlink(const SocketAddress *a) {
41✔
73
        return socket_address_family(a) == AF_UNIX ? sockaddr_un_unlink(&a->sockaddr.un) : 0;
41✔
74
}
75

76
bool socket_address_can_accept(const SocketAddress *a) _pure_;
77

78
int socket_address_listen(
79
                const SocketAddress *a,
80
                int flags,
81
                int backlog,
82
                SocketAddressBindIPv6Only only,
83
                const char *bind_to_device,
84
                bool reuse_port,
85
                bool free_bind,
86
                bool transparent,
87
                mode_t directory_mode,
88
                mode_t socket_mode,
89
                const char *label);
90

91
int socket_address_verify(const SocketAddress *a, bool strict) _pure_;
92
int socket_address_print(const SocketAddress *a, char **p);
93
bool socket_address_matches_fd(const SocketAddress *a, int fd);
94

95
bool socket_address_equal(const SocketAddress *a, const SocketAddress *b) _pure_;
96

97
const char* socket_address_get_path(const SocketAddress *a);
98

99
bool socket_ipv6_is_supported(void);
100
bool socket_ipv6_is_enabled(void);
101

102
int sockaddr_port(const struct sockaddr *_sa, unsigned *port);
103
const union in_addr_union *sockaddr_in_addr(const struct sockaddr *sa);
104
int sockaddr_set_in_addr(union sockaddr_union *u, int family, const union in_addr_union *a, uint16_t port);
105

106
int sockaddr_pretty(const struct sockaddr *_sa, socklen_t salen, bool translate_ipv6, bool include_port, char **ret);
107
int getpeername_pretty(int fd, bool include_port, char **ret);
108
int getsockname_pretty(int fd, char **ret);
109

110
int socknameinfo_pretty(const struct sockaddr *sa, socklen_t salen, char **_ret);
111

112
const char* socket_address_bind_ipv6_only_to_string(SocketAddressBindIPv6Only b) _const_;
113
SocketAddressBindIPv6Only socket_address_bind_ipv6_only_from_string(const char *s) _pure_;
114
SocketAddressBindIPv6Only socket_address_bind_ipv6_only_or_bool_from_string(const char *s);
115

116
int netlink_family_to_string_alloc(int b, char **s);
117
int netlink_family_from_string(const char *s) _pure_;
118

119
bool sockaddr_equal(const union sockaddr_union *a, const union sockaddr_union *b);
120

121
int fd_set_sndbuf(int fd, size_t n, bool increase);
122
static inline int fd_inc_sndbuf(int fd, size_t n) {
406,300✔
123
        return fd_set_sndbuf(fd, n, true);
406,300✔
124
}
125
int fd_set_rcvbuf(int fd, size_t n, bool increase);
126
static inline int fd_increase_rxbuf(int fd, size_t n) {
29,624✔
127
        return fd_set_rcvbuf(fd, n, true);
29,624✔
128
}
129

130
int ip_tos_to_string_alloc(int i, char **s);
131
int ip_tos_from_string(const char *s);
132

133
typedef enum {
134
        IFNAME_VALID_ALTERNATIVE = 1 << 0, /* Allow "altnames" too */
135
        IFNAME_VALID_NUMERIC     = 1 << 1, /* Allow decimal formatted ifindexes too */
136
        IFNAME_VALID_SPECIAL     = 1 << 2, /* Allow the special names "all" and "default" */
137
        _IFNAME_VALID_ALL        = IFNAME_VALID_ALTERNATIVE | IFNAME_VALID_NUMERIC | IFNAME_VALID_SPECIAL,
138
} IfnameValidFlags;
139
bool ifname_valid_char(char a);
140
bool ifname_valid_full(const char *p, IfnameValidFlags flags);
141
static inline bool ifname_valid(const char *p) {
5,164✔
142
        return ifname_valid_full(p, 0);
5,164✔
143
}
144
bool address_label_valid(const char *p);
145

146
int getpeercred(int fd, struct ucred *ucred);
147
int getpeersec(int fd, char **ret);
148
int getpeergroups(int fd, gid_t **ret);
149
int getpeerpidfd(int fd);
150
int getpeerpidref(int fd, PidRef *ret);
151

152
ssize_t send_many_fds_iov_sa(
153
                int transport_fd,
154
                int *fds_array, size_t n_fds_array,
155
                const struct iovec *iov, size_t iovlen,
156
                const struct sockaddr *sa, socklen_t len,
157
                int flags);
158
static inline ssize_t send_many_fds_iov(
1✔
159
                int transport_fd,
160
                int *fds_array, size_t n_fds_array,
161
                const struct iovec *iov, size_t iovlen,
162
                int flags) {
163

164
        return send_many_fds_iov_sa(transport_fd, fds_array, n_fds_array, iov, iovlen, NULL, 0, flags);
1✔
165
}
166
static inline int send_many_fds(
167
                int transport_fd,
168
                int *fds_array,
169
                size_t n_fds_array,
170
                int flags) {
171

172
        return send_many_fds_iov_sa(transport_fd, fds_array, n_fds_array, NULL, 0, NULL, 0, flags);
173
}
174
ssize_t send_one_fd_iov_sa(
175
                int transport_fd,
176
                int fd,
177
                const struct iovec *iov, size_t iovlen,
178
                const struct sockaddr *sa, socklen_t len,
179
                int flags);
180
int send_one_fd_sa(int transport_fd,
181
                   int fd,
182
                   const struct sockaddr *sa, socklen_t len,
183
                   int flags);
184
#define send_one_fd_iov(transport_fd, fd, iov, iovlen, flags) send_one_fd_iov_sa(transport_fd, fd, iov, iovlen, NULL, 0, flags)
185
#define send_one_fd(transport_fd, fd, flags) send_one_fd_iov_sa(transport_fd, fd, NULL, 0, NULL, 0, flags)
186
ssize_t receive_one_fd_iov(int transport_fd, struct iovec *iov, size_t iovlen, int flags, int *ret_fd);
187
int receive_one_fd(int transport_fd, int flags);
188
ssize_t receive_many_fds_iov(int transport_fd, struct iovec *iov, size_t iovlen, int **ret_fds_array, size_t *ret_n_fds_array, int flags);
189
int receive_many_fds(int transport_fd, int **ret_fds_array, size_t *ret_n_fds_array, int flags);
190

191
ssize_t next_datagram_size_fd(int fd);
192

193
int flush_accept(int fd);
194
ssize_t flush_mqueue(int fd);
195

196
#define CMSG_FOREACH(cmsg, mh)                                          \
197
        for ((cmsg) = CMSG_FIRSTHDR(mh); (cmsg); (cmsg) = CMSG_NXTHDR((mh), (cmsg)))
198

199
/* Returns the cmsghdr's data pointer, but safely cast to the specified type. Does two alignment checks: one
200
 * at compile time, that the requested type has a smaller or same alignment as 'struct cmsghdr', and one
201
 * during runtime, that the actual pointer matches the alignment too. This is supposed to catch cases such as
202
 * 'struct timeval' is embedded into 'struct cmsghdr' on architectures where the alignment of the former is 8
203
 * bytes (because of a 64-bit time_t), but of the latter is 4 bytes (because size_t is 32 bits), such as
204
 * riscv32. */
205
#define CMSG_TYPED_DATA(cmsg, type)                                     \
206
        ({                                                              \
207
                struct cmsghdr *_cmsg = (cmsg);                         \
208
                assert_cc(alignof(type) <= alignof(struct cmsghdr));    \
209
                _cmsg ? CAST_ALIGN_PTR(type, CMSG_DATA(_cmsg)) : (type*) NULL; \
210
        })
211

212
struct cmsghdr* cmsg_find(struct msghdr *mh, int level, int type, socklen_t length);
213
void* cmsg_find_and_copy_data(struct msghdr *mh, int level, int type, void *buf, size_t buf_len);
214

215
/* Type-safe, dereferencing version of cmsg_find() */
216
#define CMSG_FIND_DATA(mh, level, type, ctype)                          \
217
        CMSG_TYPED_DATA(cmsg_find(mh, level, type, CMSG_LEN(sizeof(ctype))), ctype)
218

219
/* Type-safe version of cmsg_find_and_copy_data() */
220
#define CMSG_FIND_AND_COPY_DATA(mh, level, type, ctype)             \
221
        (ctype*) cmsg_find_and_copy_data(mh, level, type, &(ctype){}, sizeof(ctype))
222

223
/* Resolves to a type that can carry cmsghdr structures. Make sure things are properly aligned, i.e. the type
224
 * itself is placed properly in memory and the size is also aligned to what's appropriate for "cmsghdr"
225
 * structures. */
226
#define CMSG_BUFFER_TYPE(size)                                          \
227
        union {                                                         \
228
                struct cmsghdr cmsghdr;                                 \
229
                uint8_t buf[size];                                      \
230
                uint8_t align_check[(size) >= CMSG_SPACE(0) &&          \
231
                                    (size) == CMSG_ALIGN(size) ? 1 : -1]; \
232
        }
233

234
size_t sockaddr_ll_len(const struct sockaddr_ll *sa);
235

236
size_t sockaddr_un_len(const struct sockaddr_un *sa);
237

238
size_t sockaddr_len(const union sockaddr_union *sa);
239

240
int socket_ioctl_fd(void);
241

242
int sockaddr_un_set_path(struct sockaddr_un *ret, const char *path);
243

244
static inline int setsockopt_int(int fd, int level, int optname, int value) {
992,987✔
245
        if (setsockopt(fd, level, optname, &value, sizeof(value)) < 0)
992,987✔
246
                return -errno;
40,694✔
247

248
        return 0;
249
}
250

251
int getsockopt_int(int fd, int level, int optname, int *ret);
252

253
int socket_bind_to_ifname(int fd, const char *ifname);
254
int socket_bind_to_ifindex(int fd, int ifindex);
255

256
int socket_autobind(int fd, char **ret_name);
257

258
/* Define a 64-bit version of timeval/timespec in any case, even on 32-bit userspace. */
259
struct timeval_large {
260
        uint64_t tvl_sec, tvl_usec;
261
};
262
struct timespec_large {
263
        uint64_t tvl_sec, tvl_nsec;
264
};
265

266
/* glibc duplicates timespec/timeval on certain 32-bit arches, once in 32-bit and once in 64-bit.
267
 * See __convert_scm_timestamps() in glibc source code. Hence, we need additional buffer space for them
268
 * to prevent truncating control msg (recvmsg() MSG_CTRUNC). */
269
#define CMSG_SPACE_TIMEVAL                                              \
270
        ((sizeof(struct timeval) == sizeof(struct timeval_large)) ?     \
271
         CMSG_SPACE(sizeof(struct timeval)) :                           \
272
         CMSG_SPACE(sizeof(struct timeval)) +                           \
273
         CMSG_SPACE(sizeof(struct timeval_large)))
274
#define CMSG_SPACE_TIMESPEC                                             \
275
        ((sizeof(struct timespec) == sizeof(struct timespec_large)) ?   \
276
         CMSG_SPACE(sizeof(struct timespec)) :                          \
277
         CMSG_SPACE(sizeof(struct timespec)) +                          \
278
         CMSG_SPACE(sizeof(struct timespec_large)))
279

280
ssize_t recvmsg_safe(int sockfd, struct msghdr *msg, int flags);
281

282
int socket_get_family(int fd);
283
int socket_set_recvpktinfo(int fd, int af, bool b);
284
int socket_set_unicast_if(int fd, int af, int ifi);
285

286
int socket_set_option(int fd, int af, int opt_ipv4, int opt_ipv6, int val);
287
static inline int socket_set_recverr(int fd, int af, bool b) {
12,242✔
288
        return socket_set_option(fd, af, IP_RECVERR, IPV6_RECVERR, b);
12,242✔
289
}
290
static inline int socket_set_recvttl(int fd, int af, bool b) {
1,332✔
291
        return socket_set_option(fd, af, IP_RECVTTL, IPV6_RECVHOPLIMIT, b);
1,332✔
292
}
293
static inline int socket_set_ttl(int fd, int af, int ttl) {
1,011✔
294
        return socket_set_option(fd, af, IP_TTL, IPV6_UNICAST_HOPS, ttl);
1,011✔
295
}
UNCOV
296
static inline int socket_set_freebind(int fd, int af, bool b) {
×
UNCOV
297
        return socket_set_option(fd, af, IP_FREEBIND, IPV6_FREEBIND, b);
×
298
}
UNCOV
299
static inline int socket_set_transparent(int fd, int af, bool b) {
×
UNCOV
300
        return socket_set_option(fd, af, IP_TRANSPARENT, IPV6_TRANSPARENT, b);
×
301
}
302
static inline int socket_set_recvfragsize(int fd, int af, bool b) {
12,408✔
303
        return socket_set_option(fd, af, IP_RECVFRAGSIZE, IPV6_RECVFRAGSIZE, b);
12,408✔
304
}
305

306
int socket_get_mtu(int fd, int af, size_t *ret);
307

308
/* an initializer for struct ucred that initialized all fields to the invalid value appropriate for each */
309
#define UCRED_INVALID { .pid = 0, .uid = UID_INVALID, .gid = GID_INVALID }
310

311
int connect_unix_path(int fd, int dir_fd, const char *path);
312

UNCOV
313
static inline bool VSOCK_CID_IS_REGULAR(unsigned cid) {
×
314
        /* 0, 1, 2, UINT32_MAX are special, refuse those */
315
        return cid > 2 && cid < UINT32_MAX;
×
316
}
317

318
int vsock_parse_port(const char *s, unsigned *ret);
319
int vsock_parse_cid(const char *s, unsigned *ret);
320

321
/* Parses AF_UNIX and AF_VSOCK addresses. AF_INET[6] require some netlink calls, so it cannot be in
322
 * src/basic/ and is done from 'socket_local_address from src/shared/. Return -EPROTO in case of
323
 * protocol mismatch. */
324
int socket_address_parse_unix(SocketAddress *ret_address, const char *s);
325
int socket_address_parse_vsock(SocketAddress *ret_address, const char *s);
326
int socket_address_equal_unix(const char *a, const char *b);
327

328
/* libc's SOMAXCONN is defined to 128 or 4096 (at least on glibc). But actually, the value can be much
329
 * larger. In our codebase we want to set it to the max usually, since nowadays socket memory is properly
330
 * tracked by memcg, and hence we don't need to enforce extra limits here. Moreover, the kernel caps it to
331
 * /proc/sys/net/core/somaxconn anyway, thus by setting this to unbounded we just make that sysctl file
332
 * authoritative. */
333
#define SOMAXCONN_DELUXE INT_MAX
334

335
int vsock_get_local_cid(unsigned *ret);
336

337
int netlink_socket_get_multicast_groups(int fd, size_t *ret_len, uint32_t **ret_groups);
338

339
int socket_get_cookie(int fd, uint64_t *ret);
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