1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2013 Lennart Poettering
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
22 #include <sys/capability.h>
25 #include "capability.h"
28 #include "bus-message.h"
29 #include "bus-internal.h"
33 int bus_message_dump(sd_bus_message *m, FILE *f, bool with_header) {
34 const char *u = NULL, *uu = NULL, *s = NULL;
35 char **cmdline = NULL;
38 uid_t owner, audit_loginuid;
39 uint32_t audit_sessionid;
48 "%sEndian=%c Type=%s%s%s Flags=%u Version=%u Serial=%u ",
49 draw_special_char(DRAW_TRIANGULAR_BULLET),
51 ansi_highlight(), bus_message_type_to_string(m->header->type), ansi_highlight_off(),
54 BUS_MESSAGE_SERIAL(m));
56 if (m->reply_serial != 0)
57 fprintf(f, " ReplySerial=%u", m->reply_serial);
62 fprintf(f, " Sender=%s%s%s", ansi_highlight(), m->sender, ansi_highlight_off());
64 fprintf(f, " Destination=%s%s%s", ansi_highlight(), m->destination, ansi_highlight_off());
66 fprintf(f, " Path=%s%s%s", ansi_highlight(), m->path, ansi_highlight_off());
68 fprintf(f, " Interface=%s%s%s", ansi_highlight(), m->interface, ansi_highlight_off());
70 fprintf(f, " Member=%s%s%s", ansi_highlight(), m->member, ansi_highlight_off());
72 if (m->sender || m->destination || m->path || m->interface || m->member)
75 if (sd_bus_error_is_set(&m->error))
78 " ErrorMessage=%s\"%s\"%s\n",
79 ansi_highlight_red(), strna(m->error.name), ansi_highlight_off(),
80 ansi_highlight_red(), strna(m->error.message), ansi_highlight_off());
83 fprintf(f, " PID=%lu", (unsigned long) m->pid);
84 if (m->pid_starttime != 0)
85 fprintf(f, " PIDStartTime=%llu", (unsigned long long) m->pid_starttime);
87 fprintf(f, " TID=%lu", (unsigned long) m->tid);
89 fprintf(f, " UID=%lu", (unsigned long) m->uid);
90 r = sd_bus_message_get_owner_uid(m, &owner);
92 fprintf(f, " OwnerUID=%lu", (unsigned long) owner);
94 fprintf(f, " GID=%lu", (unsigned long) m->gid);
96 if (m->pid != 0 || m->pid_starttime != 0 || m->tid != 0 || m->uid_valid || r >= 0 || m->gid_valid)
99 if (m->monotonic != 0)
100 fprintf(f, " Monotonic=%llu", (unsigned long long) m->monotonic);
101 if (m->realtime != 0)
102 fprintf(f, " Realtime=%llu", (unsigned long long) m->realtime);
104 if (m->monotonic != 0 || m->realtime != 0)
108 fprintf(f, " Exe=%s", m->exe);
110 fprintf(f, " Comm=%s", m->comm);
112 fprintf(f, " TIDComm=%s", m->tid_comm);
114 fprintf(f, " Label=%s", m->label);
116 if (m->exe || m->comm || m->tid_comm || m->label)
119 if (sd_bus_message_get_cmdline(m, &cmdline) >= 0) {
122 fputs(" CommandLine=[", f);
123 STRV_FOREACH(c, cmdline) {
134 fprintf(f, " CGroup=%s\n", m->cgroup);
136 sd_bus_message_get_unit(m, &u);
138 fprintf(f, " Unit=%s", u);
139 sd_bus_message_get_user_unit(m, &uu);
141 fprintf(f, " UserUnit=%s", uu);
142 sd_bus_message_get_session(m, &s);
144 fprintf(f, " Session=%s", s);
145 if (sd_bus_message_get_audit_loginuid(m, &audit_loginuid) >= 0)
146 fprintf(f, " AuditLoginUID=%lu", (unsigned long) audit_loginuid);
147 if (sd_bus_message_get_audit_sessionid(m, &audit_sessionid) >= 0)
148 fprintf(f, " AuditSessionID=%lu", (unsigned long) audit_sessionid);
150 if (u || uu || s || audit_loginuid || audit_sessionid)
153 r = sd_bus_message_has_effective_cap(m, 0);
155 unsigned long c, last_cap;
157 fprintf(f, " Capabilities=%s", r ? cap_to_name(0) : "");
159 last_cap = cap_last_cap();
160 for (c = 0; c < last_cap; c++) {
161 r = sd_bus_message_has_effective_cap(m, c);
163 fprintf(f, "|%s", cap_to_name(c));
168 r = sd_bus_message_rewind(m, true);
170 log_error("Failed to rewind: %s", strerror(-r));
174 fprintf(f, "MESSAGE \"%s\" {\n", strempty(m->root_container.signature));
177 _cleanup_free_ char *prefix = NULL;
178 const char *contents = NULL;
193 r = sd_bus_message_peek_type(m, &type, &contents);
195 log_error("Failed to peek type: %s", strerror(-r));
203 r = sd_bus_message_exit_container(m);
205 log_error("Failed to exit container: %s", strerror(-r));
211 prefix = strrep("\t", level);
215 fprintf(f, "%s};\n", prefix);
219 prefix = strrep("\t", level);
223 if (bus_type_is_container(type) > 0) {
224 r = sd_bus_message_enter_container(m, type, contents);
226 log_error("Failed to enter container: %s", strerror(-r));
230 if (type == SD_BUS_TYPE_ARRAY)
231 fprintf(f, "%sARRAY \"%s\" {\n", prefix, contents);
232 else if (type == SD_BUS_TYPE_VARIANT)
233 fprintf(f, "%sVARIANT \"%s\" {\n", prefix, contents);
234 else if (type == SD_BUS_TYPE_STRUCT)
235 fprintf(f, "%sSTRUCT \"%s\" {\n", prefix, contents);
236 else if (type == SD_BUS_TYPE_DICT_ENTRY)
237 fprintf(f, "%sDICT_ENTRY \"%s\" {\n", prefix, contents);
244 r = sd_bus_message_read_basic(m, type, &basic);
246 log_error("Failed to get basic: %s", strerror(-r));
254 case SD_BUS_TYPE_BYTE:
255 fprintf(f, "%sBYTE %s%u%s;\n", prefix, ansi_highlight(), basic.u8, ansi_highlight_off());
258 case SD_BUS_TYPE_BOOLEAN:
259 fprintf(f, "%sBOOLEAN %s%s%s;\n", prefix, ansi_highlight(), yes_no(basic.i), ansi_highlight_off());
262 case SD_BUS_TYPE_INT16:
263 fprintf(f, "%sINT16 %s%i%s;\n", prefix, ansi_highlight(), basic.s16, ansi_highlight_off());
266 case SD_BUS_TYPE_UINT16:
267 fprintf(f, "%sUINT16 %s%u%s;\n", prefix, ansi_highlight(), basic.u16, ansi_highlight_off());
270 case SD_BUS_TYPE_INT32:
271 fprintf(f, "%sINT32 %s%i%s;\n", prefix, ansi_highlight(), basic.s32, ansi_highlight_off());
274 case SD_BUS_TYPE_UINT32:
275 fprintf(f, "%sUINT32 %s%u%s;\n", prefix, ansi_highlight(), basic.u32, ansi_highlight_off());
278 case SD_BUS_TYPE_INT64:
279 fprintf(f, "%sINT64 %s%lli%s;\n", prefix, ansi_highlight(), (long long) basic.s64, ansi_highlight_off());
282 case SD_BUS_TYPE_UINT64:
283 fprintf(f, "%sUINT64 %s%llu%s;\n", prefix, ansi_highlight(), (unsigned long long) basic.u64, ansi_highlight_off());
286 case SD_BUS_TYPE_DOUBLE:
287 fprintf(f, "%sDOUBLE %s%g%s;\n", prefix, ansi_highlight(), basic.d64, ansi_highlight_off());
290 case SD_BUS_TYPE_STRING:
291 fprintf(f, "%sSTRING \"%s%s%s\";\n", prefix, ansi_highlight(), basic.string, ansi_highlight_off());
294 case SD_BUS_TYPE_OBJECT_PATH:
295 fprintf(f, "%sOBJECT_PATH \"%s%s%s\";\n", prefix, ansi_highlight(), basic.string, ansi_highlight_off());
298 case SD_BUS_TYPE_SIGNATURE:
299 fprintf(f, "%sSIGNATURE \"%s%s%s\";\n", prefix, ansi_highlight(), basic.string, ansi_highlight_off());
302 case SD_BUS_TYPE_UNIX_FD:
303 fprintf(f, "%sUNIX_FD %s%i%s;\n", prefix, ansi_highlight(), basic.i, ansi_highlight_off());
307 assert_not_reached("Unknown basic type.");