Branch data Line data Source code
1 : : /* SPDX-License-Identifier: LGPL-2.1+ */
2 : :
3 : : #include <sys/time.h>
4 : :
5 : : #include "alloc-util.h"
6 : : #include "bus-dump.h"
7 : : #include "bus-internal.h"
8 : : #include "bus-message.h"
9 : : #include "bus-type.h"
10 : : #include "cap-list.h"
11 : : #include "capability-util.h"
12 : : #include "fileio.h"
13 : : #include "format-util.h"
14 : : #include "locale-util.h"
15 : : #include "macro.h"
16 : : #include "string-util.h"
17 : : #include "strv.h"
18 : : #include "terminal-util.h"
19 : : #include "util.h"
20 : :
21 : 3304 : static char *indent(unsigned level, unsigned flags) {
22 : : char *p;
23 : 3304 : unsigned n, i = 0;
24 : :
25 : 3304 : n = 0;
26 : :
27 [ - + # # ]: 3304 : if (flags & BUS_MESSAGE_DUMP_SUBTREE_ONLY && level > 0)
28 : 0 : level -= 1;
29 : :
30 [ + + ]: 3304 : if (flags & BUS_MESSAGE_DUMP_WITH_HEADER)
31 : 2344 : n += 2;
32 : :
33 : 3304 : p = new(char, n + level*8 + 1);
34 [ - + ]: 3304 : if (!p)
35 : 0 : return NULL;
36 : :
37 [ + + ]: 3304 : if (flags & BUS_MESSAGE_DUMP_WITH_HEADER) {
38 : 2344 : p[i++] = ' ';
39 : 2344 : p[i++] = ' ';
40 : : }
41 : :
42 : 3304 : memset(p + i, ' ', level*8);
43 : 3304 : p[i + level*8] = 0;
44 : :
45 : 3304 : return p;
46 : : }
47 : :
48 : 64 : int bus_message_dump(sd_bus_message *m, FILE *f, unsigned flags) {
49 : 64 : unsigned level = 1;
50 : : int r;
51 : :
52 [ - + ]: 64 : assert(m);
53 : :
54 [ + + ]: 64 : if (!f)
55 : 12 : f = stdout;
56 : :
57 [ + + ]: 64 : if (flags & BUS_MESSAGE_DUMP_WITH_HEADER) {
58 : 104 : fprintf(f,
59 : : "%s%s%s Type=%s%s%s Endian=%c Flags=%u Version=%u Priority=%"PRIi64,
60 [ - + ]: 52 : m->header->type == SD_BUS_MESSAGE_METHOD_ERROR ? ansi_highlight_red() :
61 [ + + ]: 96 : m->header->type == SD_BUS_MESSAGE_METHOD_RETURN ? ansi_highlight_green() :
62 [ + + ]: 44 : m->header->type != SD_BUS_MESSAGE_SIGNAL ? ansi_highlight() : "",
63 : : special_glyph(SPECIAL_GLYPH_TRIANGULAR_BULLET),
64 : : ansi_normal(),
65 : :
66 : : ansi_highlight(),
67 [ + - ]: 52 : bus_message_type_to_string(m->header->type) ?: "(unknown)",
68 : : ansi_normal(),
69 : :
70 : 52 : m->header->endian,
71 : 52 : m->header->flags,
72 : 52 : m->header->version,
73 : : m->priority);
74 : :
75 : : /* Display synthetic message serial number in a more readable
76 : : * format than (uint32_t) -1 */
77 [ - + ]: 52 : if (BUS_MESSAGE_COOKIE(m) == 0xFFFFFFFFULL)
78 : 0 : fprintf(f, " Cookie=-1");
79 : : else
80 : 52 : fprintf(f, " Cookie=%" PRIu64, BUS_MESSAGE_COOKIE(m));
81 : :
82 [ + + ]: 52 : if (m->reply_cookie != 0)
83 : 8 : fprintf(f, " ReplyCookie=%" PRIu64, m->reply_cookie);
84 : :
85 : 52 : fputs("\n", f);
86 : :
87 [ - + ]: 52 : if (m->sender)
88 : 0 : fprintf(f, " Sender=%s%s%s", ansi_highlight(), m->sender, ansi_normal());
89 [ + + ]: 52 : if (m->destination)
90 : 20 : fprintf(f, " Destination=%s%s%s", ansi_highlight(), m->destination, ansi_normal());
91 [ + + ]: 52 : if (m->path)
92 : 44 : fprintf(f, " Path=%s%s%s", ansi_highlight(), m->path, ansi_normal());
93 [ + + ]: 52 : if (m->interface)
94 : 44 : fprintf(f, " Interface=%s%s%s", ansi_highlight(), m->interface, ansi_normal());
95 [ + + ]: 52 : if (m->member)
96 : 44 : fprintf(f, " Member=%s%s%s", ansi_highlight(), m->member, ansi_normal());
97 : :
98 [ + - + + : 52 : if (m->sender || m->destination || m->path || m->interface || m->member)
+ + + - -
+ ]
99 : 44 : fputs("\n", f);
100 : :
101 [ - + ]: 52 : if (sd_bus_error_is_set(&m->error))
102 : 0 : fprintf(f,
103 : : " ErrorName=%s%s%s"
104 : : " ErrorMessage=%s\"%s\"%s\n",
105 : : ansi_highlight_red(), strna(m->error.name), ansi_normal(),
106 : : ansi_highlight_red(), strna(m->error.message), ansi_normal());
107 : :
108 [ - + ]: 52 : if (m->monotonic != 0)
109 : 0 : fprintf(f, " Monotonic="USEC_FMT, m->monotonic);
110 [ - + ]: 52 : if (m->realtime != 0)
111 : 0 : fprintf(f, " Realtime="USEC_FMT, m->realtime);
112 [ - + ]: 52 : if (m->seqnum != 0)
113 : 0 : fprintf(f, " SequenceNumber=%"PRIu64, m->seqnum);
114 : :
115 [ + - + - : 52 : if (m->monotonic != 0 || m->realtime != 0 || m->seqnum != 0)
- + ]
116 : 0 : fputs("\n", f);
117 : :
118 : 52 : bus_creds_dump(&m->creds, f, true);
119 : : }
120 : :
121 : 64 : r = sd_bus_message_rewind(m, !(flags & BUS_MESSAGE_DUMP_SUBTREE_ONLY));
122 [ - + ]: 64 : if (r < 0)
123 [ # # ]: 0 : return log_error_errno(r, "Failed to rewind: %m");
124 : :
125 [ + - ]: 64 : if (!(flags & BUS_MESSAGE_DUMP_SUBTREE_ONLY)) {
126 [ + - ]: 64 : _cleanup_free_ char *prefix = NULL;
127 : :
128 : 64 : prefix = indent(0, flags);
129 [ - + ]: 64 : if (!prefix)
130 : 0 : return log_oom();
131 : :
132 : 64 : fprintf(f, "%sMESSAGE \"%s\" {\n", prefix, strempty(m->root_container.signature));
133 : : }
134 : :
135 : 3176 : for (;;) {
136 [ + - + + ]: 3240 : _cleanup_free_ char *prefix = NULL;
137 : 3240 : const char *contents = NULL;
138 : : char type;
139 : : union {
140 : : uint8_t u8;
141 : : uint16_t u16;
142 : : int16_t s16;
143 : : uint32_t u32;
144 : : int32_t s32;
145 : : uint64_t u64;
146 : : int64_t s64;
147 : : double d64;
148 : : const char *string;
149 : : int i;
150 : : } basic;
151 : :
152 : 3240 : r = sd_bus_message_peek_type(m, &type, &contents);
153 [ - + ]: 3240 : if (r < 0)
154 [ # # ]: 0 : return log_error_errno(r, "Failed to peek type: %m");
155 : :
156 [ + + ]: 3240 : if (r == 0) {
157 [ + + ]: 988 : if (level <= 1)
158 : 64 : break;
159 : :
160 : 924 : r = sd_bus_message_exit_container(m);
161 [ - + ]: 924 : if (r < 0)
162 [ # # ]: 0 : return log_error_errno(r, "Failed to exit container: %m");
163 : :
164 : 924 : level--;
165 : :
166 : 924 : prefix = indent(level, flags);
167 [ - + ]: 924 : if (!prefix)
168 : 0 : return log_oom();
169 : :
170 : 924 : fprintf(f, "%s};\n", prefix);
171 : 924 : continue;
172 : : }
173 : :
174 : 2252 : prefix = indent(level, flags);
175 [ - + ]: 2252 : if (!prefix)
176 : 0 : return log_oom();
177 : :
178 [ + + ]: 2252 : if (bus_type_is_container(type) > 0) {
179 : 924 : r = sd_bus_message_enter_container(m, type, contents);
180 [ - + ]: 924 : if (r < 0)
181 [ # # ]: 0 : return log_error_errno(r, "Failed to enter container: %m");
182 : :
183 [ + + ]: 924 : if (type == SD_BUS_TYPE_ARRAY)
184 : 316 : fprintf(f, "%sARRAY \"%s\" {\n", prefix, contents);
185 [ + + ]: 608 : else if (type == SD_BUS_TYPE_VARIANT)
186 : 176 : fprintf(f, "%sVARIANT \"%s\" {\n", prefix, contents);
187 [ + + ]: 432 : else if (type == SD_BUS_TYPE_STRUCT)
188 : 184 : fprintf(f, "%sSTRUCT \"%s\" {\n", prefix, contents);
189 [ + - ]: 248 : else if (type == SD_BUS_TYPE_DICT_ENTRY)
190 : 248 : fprintf(f, "%sDICT_ENTRY \"%s\" {\n", prefix, contents);
191 : :
192 : 924 : level++;
193 : :
194 : 924 : continue;
195 : : }
196 : :
197 : 1328 : r = sd_bus_message_read_basic(m, type, &basic);
198 [ - + ]: 1328 : if (r < 0)
199 [ # # ]: 0 : return log_error_errno(r, "Failed to get basic: %m");
200 : :
201 [ - + ]: 1328 : assert(r > 0);
202 : :
203 [ + + - - : 1328 : switch (type) {
+ + - + +
+ + + -
- ]
204 : :
205 : 140 : case SD_BUS_TYPE_BYTE:
206 : 140 : fprintf(f, "%sBYTE %s%u%s;\n", prefix, ansi_highlight(), basic.u8, ansi_normal());
207 : 140 : break;
208 : :
209 : 20 : case SD_BUS_TYPE_BOOLEAN:
210 : 20 : fprintf(f, "%sBOOLEAN %s%s%s;\n", prefix, ansi_highlight(), true_false(basic.i), ansi_normal());
211 : 20 : break;
212 : :
213 : 0 : case SD_BUS_TYPE_INT16:
214 : 0 : fprintf(f, "%sINT16 %s%i%s;\n", prefix, ansi_highlight(), basic.s16, ansi_normal());
215 : 0 : break;
216 : :
217 : 0 : case SD_BUS_TYPE_UINT16:
218 : 0 : fprintf(f, "%sUINT16 %s%u%s;\n", prefix, ansi_highlight(), basic.u16, ansi_normal());
219 : 0 : break;
220 : :
221 : 116 : case SD_BUS_TYPE_INT32:
222 : 116 : fprintf(f, "%sINT32 %s%i%s;\n", prefix, ansi_highlight(), basic.s32, ansi_normal());
223 : 116 : break;
224 : :
225 : 48 : case SD_BUS_TYPE_UINT32:
226 : 48 : fprintf(f, "%sUINT32 %s%u%s;\n", prefix, ansi_highlight(), basic.u32, ansi_normal());
227 : 48 : break;
228 : :
229 : 0 : case SD_BUS_TYPE_INT64:
230 : 0 : fprintf(f, "%sINT64 %s%"PRIi64"%s;\n", prefix, ansi_highlight(), basic.s64, ansi_normal());
231 : 0 : break;
232 : :
233 : 68 : case SD_BUS_TYPE_UINT64:
234 : 68 : fprintf(f, "%sUINT64 %s%"PRIu64"%s;\n", prefix, ansi_highlight(), basic.u64, ansi_normal());
235 : 68 : break;
236 : :
237 : 20 : case SD_BUS_TYPE_DOUBLE:
238 : 20 : fprintf(f, "%sDOUBLE %s%g%s;\n", prefix, ansi_highlight(), basic.d64, ansi_normal());
239 : 20 : break;
240 : :
241 : 848 : case SD_BUS_TYPE_STRING:
242 : 848 : fprintf(f, "%sSTRING \"%s%s%s\";\n", prefix, ansi_highlight(), basic.string, ansi_normal());
243 : 848 : break;
244 : :
245 : 48 : case SD_BUS_TYPE_OBJECT_PATH:
246 : 48 : fprintf(f, "%sOBJECT_PATH \"%s%s%s\";\n", prefix, ansi_highlight(), basic.string, ansi_normal());
247 : 48 : break;
248 : :
249 : 20 : case SD_BUS_TYPE_SIGNATURE:
250 : 20 : fprintf(f, "%sSIGNATURE \"%s%s%s\";\n", prefix, ansi_highlight(), basic.string, ansi_normal());
251 : 20 : break;
252 : :
253 : 0 : case SD_BUS_TYPE_UNIX_FD:
254 : 0 : fprintf(f, "%sUNIX_FD %s%i%s;\n", prefix, ansi_highlight(), basic.i, ansi_normal());
255 : 0 : break;
256 : :
257 : 0 : default:
258 : 0 : assert_not_reached("Unknown basic type.");
259 : : }
260 : : }
261 : :
262 [ + - ]: 64 : if (!(flags & BUS_MESSAGE_DUMP_SUBTREE_ONLY)) {
263 [ + - ]: 64 : _cleanup_free_ char *prefix = NULL;
264 : :
265 : 64 : prefix = indent(0, flags);
266 [ - + ]: 64 : if (!prefix)
267 : 0 : return log_oom();
268 : :
269 : 64 : fprintf(f, "%s};\n\n", prefix);
270 : : }
271 : :
272 : 64 : return 0;
273 : : }
274 : :
275 : 240 : static void dump_capabilities(
276 : : sd_bus_creds *c,
277 : : FILE *f,
278 : : const char *name,
279 : : bool terse,
280 : : int (*has)(sd_bus_creds *c, int capability)) {
281 : :
282 : : unsigned long i, last_cap;
283 : 240 : unsigned n = 0;
284 : : int r;
285 : :
286 [ - + ]: 240 : assert(c);
287 [ - + ]: 240 : assert(f);
288 [ - + ]: 240 : assert(name);
289 [ - + ]: 240 : assert(has);
290 : :
291 : 240 : i = 0;
292 : 240 : r = has(c, i);
293 [ + + ]: 240 : if (r < 0)
294 : 208 : return;
295 : :
296 [ - + + - ]: 32 : fprintf(f, "%s%s=%s", terse ? " " : "", name, terse ? "" : ansi_highlight());
297 : 32 : last_cap = cap_last_cap();
298 : :
299 : : for (;;) {
300 [ + + ]: 1216 : if (r > 0) {
301 : :
302 [ + + ]: 608 : if (n > 0)
303 : 592 : fputc(' ', f);
304 [ + + ]: 608 : if (n % 4 == 3)
305 [ + - ]: 144 : fprintf(f, terse ? "\n " : "\n ");
306 : :
307 : 608 : fprintf(f, "%s", strna(capability_to_name(i)));
308 : 608 : n++;
309 : : }
310 : :
311 : 1216 : i++;
312 : :
313 [ + + ]: 1216 : if (i > last_cap)
314 : 32 : break;
315 : :
316 : 1184 : r = has(c, i);
317 : : }
318 : :
319 : 32 : fputs("\n", f);
320 : :
321 [ - + ]: 32 : if (!terse)
322 : 0 : fputs(ansi_normal(), f);
323 : : }
324 : :
325 : 60 : int bus_creds_dump(sd_bus_creds *c, FILE *f, bool terse) {
326 : : uid_t owner, audit_loginuid;
327 : : uint32_t audit_sessionid;
328 : 60 : char **cmdline = NULL, **well_known = NULL;
329 : : const char *prefix, *color, *suffix, *s;
330 : : int r, q, v, w, z;
331 : :
332 [ - + ]: 60 : assert(c);
333 : :
334 [ + + ]: 60 : if (!f)
335 : 8 : f = stdout;
336 : :
337 [ + - ]: 60 : if (terse) {
338 : 60 : prefix = " ";
339 : 60 : suffix = "";
340 : 60 : color = "";
341 : : } else {
342 : : const char *off;
343 : :
344 : 0 : prefix = "";
345 : 0 : color = ansi_highlight();
346 : :
347 : 0 : off = ansi_normal();
348 [ # # # # : 0 : suffix = strjoina(off, "\n");
# # # # #
# # # ]
349 : : }
350 : :
351 [ + + ]: 60 : if (c->mask & SD_BUS_CREDS_PID)
352 : 8 : fprintf(f, "%sPID=%s"PID_FMT"%s", prefix, color, c->pid, suffix);
353 [ - + ]: 60 : if (c->mask & SD_BUS_CREDS_TID)
354 : 0 : fprintf(f, "%sTID=%s"PID_FMT"%s", prefix, color, c->tid, suffix);
355 [ + + ]: 60 : if (c->mask & SD_BUS_CREDS_PPID) {
356 [ + + ]: 8 : if (c->ppid == 0)
357 : 4 : fprintf(f, "%sPPID=%sn/a%s", prefix, color, suffix);
358 : : else
359 : 4 : fprintf(f, "%sPPID=%s"PID_FMT"%s", prefix, color, c->ppid, suffix);
360 : : }
361 [ + + ]: 60 : if (c->mask & SD_BUS_CREDS_TTY)
362 : 8 : fprintf(f, "%sTTY=%s%s%s", prefix, color, strna(c->tty), suffix);
363 : :
364 [ + - + + ]: 60 : if (terse && ((c->mask & (SD_BUS_CREDS_PID|SD_BUS_CREDS_TID|SD_BUS_CREDS_PPID|SD_BUS_CREDS_TTY))))
365 : 8 : fputs("\n", f);
366 : :
367 [ + + ]: 60 : if (c->mask & SD_BUS_CREDS_UID)
368 : 8 : fprintf(f, "%sUID=%s"UID_FMT"%s", prefix, color, c->uid, suffix);
369 [ + + ]: 60 : if (c->mask & SD_BUS_CREDS_EUID)
370 : 8 : fprintf(f, "%sEUID=%s"UID_FMT"%s", prefix, color, c->euid, suffix);
371 [ + + ]: 60 : if (c->mask & SD_BUS_CREDS_SUID)
372 : 8 : fprintf(f, "%sSUID=%s"UID_FMT"%s", prefix, color, c->suid, suffix);
373 [ + + ]: 60 : if (c->mask & SD_BUS_CREDS_FSUID)
374 : 8 : fprintf(f, "%sFSUID=%s"UID_FMT"%s", prefix, color, c->fsuid, suffix);
375 : 60 : r = sd_bus_creds_get_owner_uid(c, &owner);
376 [ + + ]: 60 : if (r >= 0)
377 : 4 : fprintf(f, "%sOwnerUID=%s"UID_FMT"%s", prefix, color, owner, suffix);
378 [ + + ]: 60 : if (c->mask & SD_BUS_CREDS_GID)
379 : 8 : fprintf(f, "%sGID=%s"GID_FMT"%s", prefix, color, c->gid, suffix);
380 [ + + ]: 60 : if (c->mask & SD_BUS_CREDS_EGID)
381 : 8 : fprintf(f, "%sEGID=%s"GID_FMT"%s", prefix, color, c->egid, suffix);
382 [ + + ]: 60 : if (c->mask & SD_BUS_CREDS_SGID)
383 : 8 : fprintf(f, "%sSGID=%s"GID_FMT"%s", prefix, color, c->sgid, suffix);
384 [ + + ]: 60 : if (c->mask & SD_BUS_CREDS_FSGID)
385 : 8 : fprintf(f, "%sFSGID=%s"GID_FMT"%s", prefix, color, c->fsgid, suffix);
386 : :
387 [ + + ]: 60 : if (c->mask & SD_BUS_CREDS_SUPPLEMENTARY_GIDS) {
388 : : unsigned i;
389 : :
390 : 8 : fprintf(f, "%sSupplementaryGIDs=%s", prefix, color);
391 [ + + ]: 44 : for (i = 0; i < c->n_supplementary_gids; i++)
392 [ + + ]: 36 : fprintf(f, "%s" GID_FMT, i > 0 ? " " : "", c->supplementary_gids[i]);
393 : 8 : fprintf(f, "%s", suffix);
394 : : }
395 : :
396 [ + - + + ]: 60 : if (terse && ((c->mask & (SD_BUS_CREDS_UID|SD_BUS_CREDS_EUID|SD_BUS_CREDS_SUID|SD_BUS_CREDS_FSUID|
397 : : SD_BUS_CREDS_GID|SD_BUS_CREDS_EGID|SD_BUS_CREDS_SGID|SD_BUS_CREDS_FSGID|
398 [ - + ]: 52 : SD_BUS_CREDS_SUPPLEMENTARY_GIDS)) || r >= 0))
399 : 8 : fputs("\n", f);
400 : :
401 [ + + ]: 60 : if (c->mask & SD_BUS_CREDS_COMM)
402 : 8 : fprintf(f, "%sComm=%s%s%s", prefix, color, c->comm, suffix);
403 [ - + ]: 60 : if (c->mask & SD_BUS_CREDS_TID_COMM)
404 : 0 : fprintf(f, "%sTIDComm=%s%s%s", prefix, color, c->tid_comm, suffix);
405 [ + + ]: 60 : if (c->mask & SD_BUS_CREDS_EXE)
406 : 4 : fprintf(f, "%sExe=%s%s%s", prefix, color, strna(c->exe), suffix);
407 : :
408 [ + - + + ]: 60 : if (terse && (c->mask & (SD_BUS_CREDS_EXE|SD_BUS_CREDS_COMM|SD_BUS_CREDS_TID_COMM)))
409 : 8 : fputs("\n", f);
410 : :
411 : 60 : r = sd_bus_creds_get_cmdline(c, &cmdline);
412 [ + + ]: 60 : if (r >= 0) {
413 : : char **i;
414 : :
415 : 8 : fprintf(f, "%sCommandLine=%s", prefix, color);
416 [ + - + + ]: 32 : STRV_FOREACH(i, cmdline) {
417 [ + + ]: 24 : if (i != cmdline)
418 : 16 : fputc(' ', f);
419 : :
420 : 24 : fputs(*i, f);
421 : : }
422 : :
423 : 8 : fprintf(f, "%s", suffix);
424 [ - + ]: 52 : } else if (r != -ENODATA)
425 : 0 : fprintf(f, "%sCommandLine=%sn/a%s", prefix, color, suffix);
426 : :
427 [ + + ]: 60 : if (c->mask & SD_BUS_CREDS_SELINUX_CONTEXT)
428 : 8 : fprintf(f, "%sLabel=%s%s%s", prefix, color, c->label, suffix);
429 [ - + ]: 60 : if (c->mask & SD_BUS_CREDS_DESCRIPTION)
430 : 0 : fprintf(f, "%sDescription=%s%s%s", prefix, color, c->description, suffix);
431 : :
432 [ + - + + ]: 60 : if (terse && (c->mask & (SD_BUS_CREDS_SELINUX_CONTEXT|SD_BUS_CREDS_DESCRIPTION)))
433 : 8 : fputs("\n", f);
434 : :
435 [ + + ]: 60 : if (c->mask & SD_BUS_CREDS_CGROUP)
436 : 8 : fprintf(f, "%sCGroup=%s%s%s", prefix, color, c->cgroup, suffix);
437 : 60 : s = NULL;
438 : 60 : r = sd_bus_creds_get_unit(c, &s);
439 [ + + ]: 60 : if (r != -ENODATA)
440 : 8 : fprintf(f, "%sUnit=%s%s%s", prefix, color, strna(s), suffix);
441 : 60 : s = NULL;
442 : 60 : v = sd_bus_creds_get_slice(c, &s);
443 [ + + ]: 60 : if (v != -ENODATA)
444 : 8 : fprintf(f, "%sSlice=%s%s%s", prefix, color, strna(s), suffix);
445 : 60 : s = NULL;
446 : 60 : q = sd_bus_creds_get_user_unit(c, &s);
447 [ + + ]: 60 : if (q != -ENODATA)
448 : 8 : fprintf(f, "%sUserUnit=%s%s%s", prefix, color, strna(s), suffix);
449 : 60 : s = NULL;
450 : 60 : w = sd_bus_creds_get_user_slice(c, &s);
451 [ + + ]: 60 : if (w != -ENODATA)
452 : 8 : fprintf(f, "%sUserSlice=%s%s%s", prefix, color, strna(s), suffix);
453 : 60 : s = NULL;
454 : 60 : z = sd_bus_creds_get_session(c, &s);
455 [ + + ]: 60 : if (z != -ENODATA)
456 : 8 : fprintf(f, "%sSession=%s%s%s", prefix, color, strna(s), suffix);
457 : :
458 [ + - + + : 60 : if (terse && ((c->mask & SD_BUS_CREDS_CGROUP) || r != -ENODATA || q != -ENODATA || v != -ENODATA || w != -ENODATA || z != -ENODATA))
+ - + - +
- + - -
+ ]
459 : 8 : fputs("\n", f);
460 : :
461 : 60 : r = sd_bus_creds_get_audit_login_uid(c, &audit_loginuid);
462 [ + + ]: 60 : if (r >= 0)
463 : 4 : fprintf(f, "%sAuditLoginUID=%s"UID_FMT"%s", prefix, color, audit_loginuid, suffix);
464 [ + + ]: 56 : else if (r != -ENODATA)
465 : 4 : fprintf(f, "%sAuditLoginUID=%sn/a%s", prefix, color, suffix);
466 : 60 : q = sd_bus_creds_get_audit_session_id(c, &audit_sessionid);
467 [ + + ]: 60 : if (q >= 0)
468 : 4 : fprintf(f, "%sAuditSessionID=%s%"PRIu32"%s", prefix, color, audit_sessionid, suffix);
469 [ + + ]: 56 : else if (q != -ENODATA)
470 : 4 : fprintf(f, "%sAuditSessionID=%sn/a%s", prefix, color, suffix);
471 : :
472 [ + - + + : 60 : if (terse && (r != -ENODATA || q != -ENODATA))
- + ]
473 : 8 : fputs("\n", f);
474 : :
475 [ - + ]: 60 : if (c->mask & SD_BUS_CREDS_UNIQUE_NAME)
476 : 0 : fprintf(f, "%sUniqueName=%s%s%s", prefix, color, c->unique_name, suffix);
477 : :
478 [ - + ]: 60 : if (sd_bus_creds_get_well_known_names(c, &well_known) >= 0) {
479 : : char **i;
480 : :
481 : 0 : fprintf(f, "%sWellKnownNames=%s", prefix, color);
482 [ # # # # ]: 0 : STRV_FOREACH(i, well_known) {
483 [ # # ]: 0 : if (i != well_known)
484 : 0 : fputc(' ', f);
485 : :
486 : 0 : fputs(*i, f);
487 : : }
488 : :
489 : 0 : fprintf(f, "%s", suffix);
490 : : }
491 : :
492 [ + - + - : 60 : if (terse && (c->mask & SD_BUS_CREDS_UNIQUE_NAME || well_known))
- + ]
493 : 0 : fputc('\n', f);
494 : :
495 : 60 : dump_capabilities(c, f, "EffectiveCapabilities", terse, sd_bus_creds_has_effective_cap);
496 : 60 : dump_capabilities(c, f, "PermittedCapabilities", terse, sd_bus_creds_has_permitted_cap);
497 : 60 : dump_capabilities(c, f, "InheritableCapabilities", terse, sd_bus_creds_has_inheritable_cap);
498 : 60 : dump_capabilities(c, f, "BoundingCapabilities", terse, sd_bus_creds_has_bounding_cap);
499 : :
500 : 60 : return 0;
501 : : }
502 : :
503 : : /*
504 : : * For details about the file format, see:
505 : : *
506 : : * http://wiki.wireshark.org/Development/LibpcapFileFormat
507 : : */
508 : :
509 : : typedef struct _packed_ pcap_hdr_s {
510 : : uint32_t magic_number; /* magic number */
511 : : uint16_t version_major; /* major version number */
512 : : uint16_t version_minor; /* minor version number */
513 : : int32_t thiszone; /* GMT to local correction */
514 : : uint32_t sigfigs; /* accuracy of timestamps */
515 : : uint32_t snaplen; /* max length of captured packets, in octets */
516 : : uint32_t network; /* data link type */
517 : : } pcap_hdr_t ;
518 : :
519 : : typedef struct _packed_ pcaprec_hdr_s {
520 : : uint32_t ts_sec; /* timestamp seconds */
521 : : uint32_t ts_usec; /* timestamp microseconds */
522 : : uint32_t incl_len; /* number of octets of packet saved in file */
523 : : uint32_t orig_len; /* actual length of packet */
524 : : } pcaprec_hdr_t;
525 : :
526 : 0 : int bus_pcap_header(size_t snaplen, FILE *f) {
527 : :
528 : 0 : pcap_hdr_t hdr = {
529 : : .magic_number = 0xa1b2c3d4U,
530 : : .version_major = 2,
531 : : .version_minor = 4,
532 : : .thiszone = 0, /* UTC */
533 : : .sigfigs = 0,
534 : : .network = 231, /* D-Bus */
535 : : };
536 : :
537 [ # # ]: 0 : if (!f)
538 : 0 : f = stdout;
539 : :
540 [ # # ]: 0 : assert(snaplen > 0);
541 [ # # ]: 0 : assert((size_t) (uint32_t) snaplen == snaplen);
542 : :
543 : 0 : hdr.snaplen = (uint32_t) snaplen;
544 : :
545 : 0 : fwrite(&hdr, 1, sizeof(hdr), f);
546 : :
547 : 0 : return fflush_and_check(f);
548 : : }
549 : :
550 : 0 : int bus_message_pcap_frame(sd_bus_message *m, size_t snaplen, FILE *f) {
551 : : struct bus_body_part *part;
552 : 0 : pcaprec_hdr_t hdr = {};
553 : : struct timeval tv;
554 : : unsigned i;
555 : : size_t w;
556 : :
557 [ # # ]: 0 : if (!f)
558 : 0 : f = stdout;
559 : :
560 [ # # ]: 0 : assert(m);
561 [ # # ]: 0 : assert(snaplen > 0);
562 [ # # ]: 0 : assert((size_t) (uint32_t) snaplen == snaplen);
563 : :
564 [ # # ]: 0 : if (m->realtime != 0)
565 : 0 : timeval_store(&tv, m->realtime);
566 : : else
567 [ # # ]: 0 : assert_se(gettimeofday(&tv, NULL) >= 0);
568 : :
569 : 0 : hdr.ts_sec = tv.tv_sec;
570 : 0 : hdr.ts_usec = tv.tv_usec;
571 : 0 : hdr.orig_len = BUS_MESSAGE_SIZE(m);
572 : 0 : hdr.incl_len = MIN(hdr.orig_len, snaplen);
573 : :
574 : : /* write the pcap header */
575 : 0 : fwrite(&hdr, 1, sizeof(hdr), f);
576 : :
577 : : /* write the dbus header */
578 : 0 : w = MIN(BUS_MESSAGE_BODY_BEGIN(m), snaplen);
579 : 0 : fwrite(m->header, 1, w, f);
580 : 0 : snaplen -= w;
581 : :
582 : : /* write the dbus body */
583 [ # # ]: 0 : MESSAGE_FOREACH_PART(part, i, m) {
584 [ # # ]: 0 : if (snaplen <= 0)
585 : 0 : break;
586 : :
587 : 0 : w = MIN(part->size, snaplen);
588 : 0 : fwrite(part->data, 1, w, f);
589 : 0 : snaplen -= w;
590 : : }
591 : :
592 : 0 : return fflush_and_check(f);
593 : : }
|