• 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

90.57
/src/basic/unit-def.c
1
/* SPDX-License-Identifier: LGPL-2.1-or-later */
2

3
#include "alloc-util.h"
4
#include "bus-label.h"
5
#include "glyph-util.h"
6
#include "string-table.h"
7
#include "string-util.h"
8
#include "unit-def.h"
9
#include "unit-name.h"
10

11
char* unit_dbus_path_from_name(const char *name) {
104,425✔
12
        _cleanup_free_ char *e = NULL;
104,425✔
13

14
        assert(name);
104,425✔
15

16
        e = bus_label_escape(name);
104,425✔
17
        if (!e)
104,425✔
18
                return NULL;
19

20
        return strjoin("/org/freedesktop/systemd1/unit/", e);
104,425✔
21
}
22

23
int unit_name_from_dbus_path(const char *path, char **name) {
439,809✔
24
        const char *e;
439,809✔
25
        char *n;
439,809✔
26

27
        e = startswith(path, "/org/freedesktop/systemd1/unit/");
439,809✔
28
        if (!e)
439,809✔
29
                return -EINVAL;
30

31
        n = bus_label_unescape(e);
432,592✔
32
        if (!n)
432,592✔
33
                return -ENOMEM;
34

35
        *name = n;
432,592✔
36
        return 0;
432,592✔
37
}
38

39
const char* unit_dbus_interface_from_type(UnitType t) {
184,702✔
40

41
        static const char *const table[_UNIT_TYPE_MAX] = {
184,702✔
42
                [UNIT_SERVICE]   = "org.freedesktop.systemd1.Service",
43
                [UNIT_SOCKET]    = "org.freedesktop.systemd1.Socket",
44
                [UNIT_TARGET]    = "org.freedesktop.systemd1.Target",
45
                [UNIT_DEVICE]    = "org.freedesktop.systemd1.Device",
46
                [UNIT_MOUNT]     = "org.freedesktop.systemd1.Mount",
47
                [UNIT_AUTOMOUNT] = "org.freedesktop.systemd1.Automount",
48
                [UNIT_SWAP]      = "org.freedesktop.systemd1.Swap",
49
                [UNIT_TIMER]     = "org.freedesktop.systemd1.Timer",
50
                [UNIT_PATH]      = "org.freedesktop.systemd1.Path",
51
                [UNIT_SLICE]     = "org.freedesktop.systemd1.Slice",
52
                [UNIT_SCOPE]     = "org.freedesktop.systemd1.Scope",
53
        };
54

55
        if (t < 0)
184,702✔
56
                return NULL;
57
        if (t >= _UNIT_TYPE_MAX)
184,702✔
58
                return NULL;
59

60
        return table[t];
184,702✔
61
}
62

63
const char* unit_dbus_interface_from_name(const char *name) {
27✔
64
        UnitType t;
27✔
65

66
        t = unit_name_to_type(name);
27✔
67
        if (t < 0)
27✔
68
                return NULL;
69

70
        return unit_dbus_interface_from_type(t);
27✔
71
}
72

73
static const char* const unit_type_table[_UNIT_TYPE_MAX] = {
74
        [UNIT_SERVICE]   = "service",
75
        [UNIT_SOCKET]    = "socket",
76
        [UNIT_TARGET]    = "target",
77
        [UNIT_DEVICE]    = "device",
78
        [UNIT_MOUNT]     = "mount",
79
        [UNIT_AUTOMOUNT] = "automount",
80
        [UNIT_SWAP]      = "swap",
81
        [UNIT_TIMER]     = "timer",
82
        [UNIT_PATH]      = "path",
83
        [UNIT_SLICE]     = "slice",
84
        [UNIT_SCOPE]     = "scope",
85
};
86

87
DEFINE_STRING_TABLE_LOOKUP(unit_type, UnitType);
75,492,517✔
88

89
static const char* const unit_load_state_table[_UNIT_LOAD_STATE_MAX] = {
90
        [UNIT_STUB]        = "stub",
91
        [UNIT_LOADED]      = "loaded",
92
        [UNIT_NOT_FOUND]   = "not-found",
93
        [UNIT_BAD_SETTING] = "bad-setting",
94
        [UNIT_ERROR]       = "error",
95
        [UNIT_MERGED]      = "merged",
96
        [UNIT_MASKED]      = "masked",
97
};
98

99
DEFINE_STRING_TABLE_LOOKUP(unit_load_state, UnitLoadState);
5,229✔
100

101
/* Keep in sync with man/unit-states.xml */
102
static const char* const unit_active_state_table[_UNIT_ACTIVE_STATE_MAX] = {
103
        [UNIT_ACTIVE]       = "active",
104
        [UNIT_RELOADING]    = "reloading",
105
        [UNIT_INACTIVE]     = "inactive",
106
        [UNIT_FAILED]       = "failed",
107
        [UNIT_ACTIVATING]   = "activating",
108
        [UNIT_DEACTIVATING] = "deactivating",
109
        [UNIT_MAINTENANCE]  = "maintenance",
110
        [UNIT_REFRESHING]   = "refreshing",
111
};
112

113
DEFINE_STRING_TABLE_LOOKUP(unit_active_state, UnitActiveState);
29,108✔
114

115
static const char* const freezer_state_table[_FREEZER_STATE_MAX] = {
116
        [FREEZER_RUNNING]            = "running",
117
        [FREEZER_FREEZING]           = "freezing",
118
        [FREEZER_FREEZING_BY_PARENT] = "freezing-by-parent",
119
        [FREEZER_FROZEN]             = "frozen",
120
        [FREEZER_FROZEN_BY_PARENT]   = "frozen-by-parent",
121
        [FREEZER_THAWING]            = "thawing",
122
};
123

124
DEFINE_STRING_TABLE_LOOKUP(freezer_state, FreezerState);
53,102✔
125

126
/* Maps in-progress freezer states to the corresponding finished state */
127
static const FreezerState freezer_state_finish_table[_FREEZER_STATE_MAX] = {
128
        [FREEZER_FREEZING]           = FREEZER_FROZEN,
129
        [FREEZER_FREEZING_BY_PARENT] = FREEZER_FROZEN_BY_PARENT,
130
        [FREEZER_THAWING]            = FREEZER_RUNNING,
131

132
        /* Finished states trivially map to themselves */
133
        [FREEZER_RUNNING]            = FREEZER_RUNNING,
134
        [FREEZER_FROZEN]             = FREEZER_FROZEN,
135
        [FREEZER_FROZEN_BY_PARENT]   = FREEZER_FROZEN_BY_PARENT,
136
};
137

138
FreezerState freezer_state_finish(FreezerState state) {
×
UNCOV
139
        assert(state >= 0);
×
140
        assert(state < _FREEZER_STATE_MAX);
×
141

UNCOV
142
        return freezer_state_finish_table[state];
×
143
}
144

145
static const char* const unit_marker_table[_UNIT_MARKER_MAX] = {
146
        [UNIT_MARKER_NEEDS_RELOAD]  = "needs-reload",
147
        [UNIT_MARKER_NEEDS_RESTART] = "needs-restart",
148
};
149

UNCOV
150
DEFINE_STRING_TABLE_LOOKUP(unit_marker, UnitMarker);
×
151

152
static const char* const automount_state_table[_AUTOMOUNT_STATE_MAX] = {
153
        [AUTOMOUNT_DEAD]    = "dead",
154
        [AUTOMOUNT_WAITING] = "waiting",
155
        [AUTOMOUNT_RUNNING] = "running",
156
        [AUTOMOUNT_FAILED]  = "failed",
157
};
158

159
DEFINE_STRING_TABLE_LOOKUP(automount_state, AutomountState);
367✔
160

161
static const char* const device_state_table[_DEVICE_STATE_MAX] = {
162
        [DEVICE_DEAD]      = "dead",
163
        [DEVICE_TENTATIVE] = "tentative",
164
        [DEVICE_PLUGGED]   = "plugged",
165
};
166

167
DEFINE_STRING_TABLE_LOOKUP(device_state, DeviceState);
73,583✔
168

169
static const char* const mount_state_table[_MOUNT_STATE_MAX] = {
170
        [MOUNT_DEAD]               = "dead",
171
        [MOUNT_MOUNTING]           = "mounting",
172
        [MOUNT_MOUNTING_DONE]      = "mounting-done",
173
        [MOUNT_MOUNTED]            = "mounted",
174
        [MOUNT_REMOUNTING]         = "remounting",
175
        [MOUNT_UNMOUNTING]         = "unmounting",
176
        [MOUNT_REMOUNTING_SIGTERM] = "remounting-sigterm",
177
        [MOUNT_REMOUNTING_SIGKILL] = "remounting-sigkill",
178
        [MOUNT_UNMOUNTING_SIGTERM] = "unmounting-sigterm",
179
        [MOUNT_UNMOUNTING_SIGKILL] = "unmounting-sigkill",
180
        [MOUNT_FAILED]             = "failed",
181
        [MOUNT_CLEANING]           = "cleaning",
182
};
183

184
DEFINE_STRING_TABLE_LOOKUP(mount_state, MountState);
21,371✔
185

186
static const char* const path_state_table[_PATH_STATE_MAX] = {
187
        [PATH_DEAD]    = "dead",
188
        [PATH_WAITING] = "waiting",
189
        [PATH_RUNNING] = "running",
190
        [PATH_FAILED]  = "failed",
191
};
192

193
DEFINE_STRING_TABLE_LOOKUP(path_state, PathState);
1,023✔
194

195
static const char* const scope_state_table[_SCOPE_STATE_MAX] = {
196
        [SCOPE_DEAD]         = "dead",
197
        [SCOPE_START_CHOWN]  = "start-chown",
198
        [SCOPE_RUNNING]      = "running",
199
        [SCOPE_ABANDONED]    = "abandoned",
200
        [SCOPE_STOP_SIGTERM] = "stop-sigterm",
201
        [SCOPE_STOP_SIGKILL] = "stop-sigkill",
202
        [SCOPE_FAILED]       = "failed",
203
};
204

205
DEFINE_STRING_TABLE_LOOKUP(scope_state, ScopeState);
1,127✔
206

207
static const char* const service_state_table[_SERVICE_STATE_MAX] = {
208
        [SERVICE_DEAD]                       = "dead",
209
        [SERVICE_CONDITION]                  = "condition",
210
        [SERVICE_START_PRE]                  = "start-pre",
211
        [SERVICE_START]                      = "start",
212
        [SERVICE_START_POST]                 = "start-post",
213
        [SERVICE_RUNNING]                    = "running",
214
        [SERVICE_EXITED]                     = "exited",
215
        [SERVICE_RELOAD]                     = "reload",
216
        [SERVICE_RELOAD_SIGNAL]              = "reload-signal",
217
        [SERVICE_RELOAD_NOTIFY]              = "reload-notify",
218
        [SERVICE_REFRESH_EXTENSIONS]         = "refresh-extensions",
219
        [SERVICE_STOP]                       = "stop",
220
        [SERVICE_STOP_WATCHDOG]              = "stop-watchdog",
221
        [SERVICE_STOP_SIGTERM]               = "stop-sigterm",
222
        [SERVICE_STOP_SIGKILL]               = "stop-sigkill",
223
        [SERVICE_STOP_POST]                  = "stop-post",
224
        [SERVICE_FINAL_WATCHDOG]             = "final-watchdog",
225
        [SERVICE_FINAL_SIGTERM]              = "final-sigterm",
226
        [SERVICE_FINAL_SIGKILL]              = "final-sigkill",
227
        [SERVICE_FAILED]                     = "failed",
228
        [SERVICE_DEAD_BEFORE_AUTO_RESTART]   = "dead-before-auto-restart",
229
        [SERVICE_FAILED_BEFORE_AUTO_RESTART] = "failed-before-auto-restart",
230
        [SERVICE_DEAD_RESOURCES_PINNED]      = "dead-resources-pinned",
231
        [SERVICE_AUTO_RESTART]               = "auto-restart",
232
        [SERVICE_AUTO_RESTART_QUEUED]        = "auto-restart-queued",
233
        [SERVICE_CLEANING]                   = "cleaning",
234
        [SERVICE_MOUNTING]                   = "mounting",
235
};
236

237
DEFINE_STRING_TABLE_LOOKUP(service_state, ServiceState);
36,097✔
238

239
static const char* const slice_state_table[_SLICE_STATE_MAX] = {
240
        [SLICE_DEAD]   = "dead",
241
        [SLICE_ACTIVE] = "active",
242
};
243

244
DEFINE_STRING_TABLE_LOOKUP(slice_state, SliceState);
7,290✔
245

246
static const char* const socket_state_table[_SOCKET_STATE_MAX] = {
247
        [SOCKET_DEAD]             = "dead",
248
        [SOCKET_START_PRE]        = "start-pre",
249
        [SOCKET_START_OPEN]       = "start-open",
250
        [SOCKET_START_CHOWN]      = "start-chown",
251
        [SOCKET_START_POST]       = "start-post",
252
        [SOCKET_LISTENING]        = "listening",
253
        [SOCKET_RUNNING]          = "running",
254
        [SOCKET_STOP_PRE]         = "stop-pre",
255
        [SOCKET_STOP_PRE_SIGTERM] = "stop-pre-sigterm",
256
        [SOCKET_STOP_PRE_SIGKILL] = "stop-pre-sigkill",
257
        [SOCKET_STOP_POST]        = "stop-post",
258
        [SOCKET_FINAL_SIGTERM]    = "final-sigterm",
259
        [SOCKET_FINAL_SIGKILL]    = "final-sigkill",
260
        [SOCKET_FAILED]           = "failed",
261
        [SOCKET_CLEANING]         = "cleaning",
262
};
263

264
DEFINE_STRING_TABLE_LOOKUP(socket_state, SocketState);
25,797✔
265

266
static const char* const swap_state_table[_SWAP_STATE_MAX] = {
267
        [SWAP_DEAD]                 = "dead",
268
        [SWAP_ACTIVATING]           = "activating",
269
        [SWAP_ACTIVATING_DONE]      = "activating-done",
270
        [SWAP_ACTIVE]               = "active",
271
        [SWAP_DEACTIVATING]         = "deactivating",
272
        [SWAP_DEACTIVATING_SIGTERM] = "deactivating-sigterm",
273
        [SWAP_DEACTIVATING_SIGKILL] = "deactivating-sigkill",
274
        [SWAP_FAILED]               = "failed",
275
        [SWAP_CLEANING]             = "cleaning",
276
};
277

278
DEFINE_STRING_TABLE_LOOKUP(swap_state, SwapState);
77✔
279

280
static const char* const target_state_table[_TARGET_STATE_MAX] = {
281
        [TARGET_DEAD]   = "dead",
282
        [TARGET_ACTIVE] = "active",
283
};
284

285
DEFINE_STRING_TABLE_LOOKUP(target_state, TargetState);
23,021✔
286

287
static const char* const timer_state_table[_TIMER_STATE_MAX] = {
288
        [TIMER_DEAD]    = "dead",
289
        [TIMER_WAITING] = "waiting",
290
        [TIMER_RUNNING] = "running",
291
        [TIMER_ELAPSED] = "elapsed",
292
        [TIMER_FAILED]  = "failed",
293
};
294

295
DEFINE_STRING_TABLE_LOOKUP(timer_state, TimerState);
2,135✔
296

297
static const char* const unit_dependency_table[_UNIT_DEPENDENCY_MAX] = {
298
        [UNIT_REQUIRES]               = "Requires",
299
        [UNIT_REQUISITE]              = "Requisite",
300
        [UNIT_WANTS]                  = "Wants",
301
        [UNIT_BINDS_TO]               = "BindsTo",
302
        [UNIT_PART_OF]                = "PartOf",
303
        [UNIT_UPHOLDS]                = "Upholds",
304
        [UNIT_REQUIRED_BY]            = "RequiredBy",
305
        [UNIT_REQUISITE_OF]           = "RequisiteOf",
306
        [UNIT_WANTED_BY]              = "WantedBy",
307
        [UNIT_BOUND_BY]               = "BoundBy",
308
        [UNIT_UPHELD_BY]              = "UpheldBy",
309
        [UNIT_CONSISTS_OF]            = "ConsistsOf",
310
        [UNIT_CONFLICTS]              = "Conflicts",
311
        [UNIT_CONFLICTED_BY]          = "ConflictedBy",
312
        [UNIT_BEFORE]                 = "Before",
313
        [UNIT_AFTER]                  = "After",
314
        [UNIT_ON_SUCCESS]             = "OnSuccess",
315
        [UNIT_ON_SUCCESS_OF]          = "OnSuccessOf",
316
        [UNIT_ON_FAILURE]             = "OnFailure",
317
        [UNIT_ON_FAILURE_OF]          = "OnFailureOf",
318
        [UNIT_TRIGGERS]               = "Triggers",
319
        [UNIT_TRIGGERED_BY]           = "TriggeredBy",
320
        [UNIT_PROPAGATES_RELOAD_TO]   = "PropagatesReloadTo",
321
        [UNIT_RELOAD_PROPAGATED_FROM] = "ReloadPropagatedFrom",
322
        [UNIT_PROPAGATES_STOP_TO]     = "PropagatesStopTo",
323
        [UNIT_STOP_PROPAGATED_FROM]   = "StopPropagatedFrom",
324
        [UNIT_JOINS_NAMESPACE_OF]     = "JoinsNamespaceOf",
325
        [UNIT_REFERENCES]             = "References",
326
        [UNIT_REFERENCED_BY]          = "ReferencedBy",
327
        [UNIT_IN_SLICE]               = "InSlice",
328
        [UNIT_SLICE_OF]               = "SliceOf",
329
};
330

331
DEFINE_STRING_TABLE_LOOKUP(unit_dependency, UnitDependency);
58,019✔
332

333
static const char* const notify_access_table[_NOTIFY_ACCESS_MAX] = {
334
        [NOTIFY_NONE] = "none",
335
        [NOTIFY_MAIN] = "main",
336
        [NOTIFY_EXEC] = "exec",
337
        [NOTIFY_ALL]  = "all",
338
};
339

340
DEFINE_STRING_TABLE_LOOKUP(notify_access, NotifyAccess);
7,623✔
341

342
static const char* const job_mode_table[_JOB_MODE_MAX] = {
343
        [JOB_FAIL]                 = "fail",
344
        [JOB_REPLACE]              = "replace",
345
        [JOB_REPLACE_IRREVERSIBLY] = "replace-irreversibly",
346
        [JOB_ISOLATE]              = "isolate",
347
        [JOB_FLUSH]                = "flush",
348
        [JOB_IGNORE_DEPENDENCIES]  = "ignore-dependencies",
349
        [JOB_IGNORE_REQUIREMENTS]  = "ignore-requirements",
350
        [JOB_TRIGGERING]           = "triggering",
351
        [JOB_RESTART_DEPENDENCIES] = "restart-dependencies",
352
};
353

354
DEFINE_STRING_TABLE_LOOKUP(job_mode, JobMode);
7,521✔
355

356
Glyph unit_active_state_to_glyph(UnitActiveState state) {
775✔
357
        static const Glyph map[_UNIT_ACTIVE_STATE_MAX] = {
775✔
358
                [UNIT_ACTIVE]       = GLYPH_BLACK_CIRCLE,
359
                [UNIT_RELOADING]    = GLYPH_CIRCLE_ARROW,
360
                [UNIT_REFRESHING]   = GLYPH_CIRCLE_ARROW,
361
                [UNIT_INACTIVE]     = GLYPH_WHITE_CIRCLE,
362
                [UNIT_FAILED]       = GLYPH_MULTIPLICATION_SIGN,
363
                [UNIT_ACTIVATING]   = GLYPH_BLACK_CIRCLE,
364
                [UNIT_DEACTIVATING] = GLYPH_BLACK_CIRCLE,
365
                [UNIT_MAINTENANCE]  = GLYPH_WHITE_CIRCLE,
366
        };
367

368
        if (state < 0)
775✔
369
                return _GLYPH_INVALID;
370

371
        assert(state < _UNIT_ACTIVE_STATE_MAX);
775✔
372
        return map[state];
775✔
373
}
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