]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/core/manager-dump.c
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
7 #include "manager-dump.h"
8 #include "memstream-util.h"
9 #include "unit-serialize.h"
12 void manager_dump_jobs(Manager
*s
, FILE *f
, char **patterns
, const char *prefix
) {
18 HASHMAP_FOREACH(j
, s
->jobs
) {
20 if (!strv_fnmatch_or_empty(patterns
, j
->unit
->id
, FNM_NOESCAPE
))
23 job_dump(j
, f
, prefix
);
27 int manager_get_dump_jobs_string(Manager
*m
, char **patterns
, const char *prefix
, char **ret
) {
28 _cleanup_(memstream_done
) MemStream ms
= {};
34 f
= memstream_init(&ms
);
38 manager_dump_jobs(m
, f
, patterns
, prefix
);
40 return memstream_finalize(&ms
, ret
, NULL
);
43 void manager_dump_units(Manager
*s
, FILE *f
, char **patterns
, const char *prefix
) {
50 HASHMAP_FOREACH_KEY(u
, t
, s
->units
) {
54 if (!strv_fnmatch_or_empty(patterns
, u
->id
, FNM_NOESCAPE
))
57 unit_dump(u
, f
, prefix
);
61 static void manager_dump_header(Manager
*m
, FILE *f
, const char *prefix
) {
63 /* NB: this is a debug interface for developers. It's not supposed to be machine readable or be
64 * stable between versions. We take the liberty to restructure it entirely between versions and
65 * add/remove fields at will. */
67 fprintf(f
, "%sManager: systemd " STRINGIFY(PROJECT_VERSION
) " (" GIT_VERSION
")\n", strempty(prefix
));
68 fprintf(f
, "%sFeatures: %s\n", strempty(prefix
), systemd_features
);
70 for (ManagerTimestamp q
= 0; q
< _MANAGER_TIMESTAMP_MAX
; q
++) {
71 const dual_timestamp
*t
= m
->timestamps
+ q
;
73 if (dual_timestamp_is_set(t
))
74 fprintf(f
, "%sTimestamp %s: %s\n",
76 manager_timestamp_to_string(q
),
77 timestamp_is_set(t
->realtime
) ? FORMAT_TIMESTAMP(t
->realtime
) :
78 FORMAT_TIMESPAN(t
->monotonic
, 1));
82 void manager_dump(Manager
*m
, FILE *f
, char **patterns
, const char *prefix
) {
86 /* If no pattern is provided, dump the full manager state including the manager version, features and
87 * so on. Otherwise limit the dump to the units/jobs matching the specified patterns. */
89 manager_dump_header(m
, f
, prefix
);
91 manager_dump_units(m
, f
, patterns
, prefix
);
92 manager_dump_jobs(m
, f
, patterns
, prefix
);
95 int manager_get_dump_string(Manager
*m
, char **patterns
, char **ret
) {
96 _cleanup_(memstream_done
) MemStream ms
= {};
102 f
= memstream_init(&ms
);
106 manager_dump(m
, f
, patterns
, NULL
);
108 return memstream_finalize(&ms
, ret
, NULL
);
111 void manager_test_summary(Manager
*m
) {
114 printf("-> By units:\n");
115 manager_dump_units(m
, stdout
, /* patterns= */ NULL
, "\t");
117 printf("-> By jobs:\n");
118 manager_dump_jobs(m
, stdout
, /* patterns= */ NULL
, "\t");