X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flibsystemd%2Fsd-bus%2Fbus-dump.c;h=b13bc4b119b756c270611c2b4c27055db4ea0151;hp=0e415497377582b21b83009f2230d2e33f506d9e;hb=455971c1493fc6dc3125d235cf4ea6102cac626d;hpb=ca7b42c81652c342288a3e0a10abd885c66ac5b2 diff --git a/src/libsystemd/sd-bus/bus-dump.c b/src/libsystemd/sd-bus/bus-dump.c index 0e4154973..b13bc4b11 100644 --- a/src/libsystemd/sd-bus/bus-dump.c +++ b/src/libsystemd/sd-bus/bus-dump.c @@ -23,6 +23,7 @@ #include "capability.h" #include "strv.h" #include "audit.h" +#include "macro.h" #include "bus-message.h" #include "bus-internal.h" @@ -54,7 +55,7 @@ int bus_message_dump(sd_bus_message *m, FILE *f, bool with_header) { if (with_header) { fprintf(f, - "%s%s%sType=%s%s%s Endian=%c Flags=%u Version=%u Priority=%lli", + "%s%s%s Type=%s%s%s Endian=%c Flags=%u Version=%u Priority=%lli", m->header->type == SD_BUS_MESSAGE_METHOD_ERROR ? ansi_highlight_red() : m->header->type == SD_BUS_MESSAGE_METHOD_RETURN ? ansi_highlight_green() : m->header->type != SD_BUS_MESSAGE_SIGNAL ? ansi_highlight() : "", draw_special_char(DRAW_TRIANGULAR_BULLET), ansi_highlight_off(), @@ -69,10 +70,10 @@ int bus_message_dump(sd_bus_message *m, FILE *f, bool with_header) { if (BUS_MESSAGE_COOKIE(m) == 0xFFFFFFFFULL) fprintf(f, " Cookie=-1"); else - fprintf(f, " Cookie=%lu", (unsigned long) BUS_MESSAGE_COOKIE(m)); + fprintf(f, " Cookie=%" PRIu64, BUS_MESSAGE_COOKIE(m)); if (m->reply_cookie != 0) - fprintf(f, " ReplyCookie=%lu", (unsigned long) m->reply_cookie); + fprintf(f, " ReplyCookie=%" PRIu64, m->reply_cookie); fputs("\n", f); @@ -98,11 +99,11 @@ int bus_message_dump(sd_bus_message *m, FILE *f, bool with_header) { ansi_highlight_red(), strna(m->error.message), ansi_highlight_off()); if (m->monotonic != 0) - fprintf(f, " Monotonic=%llu", (unsigned long long) m->monotonic); + fprintf(f, " Monotonic="USEC_FMT, m->monotonic); if (m->realtime != 0) - fprintf(f, " Realtime=%llu", (unsigned long long) m->realtime); + fprintf(f, " Realtime="USEC_FMT, m->realtime); if (m->seqnum != 0) - fprintf(f, " SequenceNumber=%llu", (unsigned long long) m->seqnum); + fprintf(f, " SequenceNumber=%"PRIu64, m->seqnum); if (m->monotonic != 0 || m->realtime != 0 || m->seqnum != 0) fputs("\n", f); @@ -221,11 +222,11 @@ int bus_message_dump(sd_bus_message *m, FILE *f, bool with_header) { break; case SD_BUS_TYPE_INT64: - fprintf(f, "%sINT64 %s%lli%s;\n", prefix, ansi_highlight(), (long long) basic.s64, ansi_highlight_off()); + fprintf(f, "%sINT64 %s%"PRIi64"%s;\n", prefix, ansi_highlight(), basic.s64, ansi_highlight_off()); break; case SD_BUS_TYPE_UINT64: - fprintf(f, "%sUINT64 %s%llu%s;\n", prefix, ansi_highlight(), (unsigned long long) basic.u64, ansi_highlight_off()); + fprintf(f, "%sUINT64 %s%"PRIu64"%s;\n", prefix, ansi_highlight(), basic.u64, ansi_highlight_off()); break; case SD_BUS_TYPE_DOUBLE: @@ -319,18 +320,18 @@ int bus_creds_dump(sd_bus_creds *c, FILE *f) { f = stdout; if (c->mask & SD_BUS_CREDS_PID) - fprintf(f, " PID=%lu", (unsigned long) c->pid); + fprintf(f, " PID="PID_FMT, c->pid); if (c->mask & SD_BUS_CREDS_PID_STARTTIME) - fprintf(f, " PIDStartTime=%llu", (unsigned long long) c->pid_starttime); + fprintf(f, " PIDStartTime="USEC_FMT, c->pid_starttime); if (c->mask & SD_BUS_CREDS_TID) - fprintf(f, " TID=%lu", (unsigned long) c->tid); + fprintf(f, " TID="PID_FMT, c->tid); if (c->mask & SD_BUS_CREDS_UID) - fprintf(f, " UID=%lu", (unsigned long) c->uid); + fprintf(f, " UID="UID_FMT, c->uid); r = sd_bus_creds_get_owner_uid(c, &owner); if (r >= 0) - fprintf(f, " OwnerUID=%lu", (unsigned long) owner); + fprintf(f, " OwnerUID="UID_FMT, owner); if (c->mask & SD_BUS_CREDS_GID) - fprintf(f, " GID=%lu", (unsigned long) c->gid); + fprintf(f, " GID="GID_FMT, c->gid); if ((c->mask & (SD_BUS_CREDS_PID|SD_BUS_CREDS_PID_STARTTIME|SD_BUS_CREDS_TID|SD_BUS_CREDS_UID|SD_BUS_CREDS_GID)) || r >= 0) fputs("\n", f); @@ -347,10 +348,10 @@ int bus_creds_dump(sd_bus_creds *c, FILE *f) { if (c->mask & SD_BUS_CREDS_SELINUX_CONTEXT) fprintf(f, " Label=%s", c->label); - if (c->mask & SD_BUS_CREDS_CONNECTION_NAME) - fprintf(f, " ConnectionName=%s", c->conn_name); + if (c->mask & SD_BUS_CREDS_DESCRIPTION) + fprintf(f, " Description=%s", c->description); - if (c->mask & (SD_BUS_CREDS_SELINUX_CONTEXT|SD_BUS_CREDS_CONNECTION_NAME)) + if (c->mask & (SD_BUS_CREDS_SELINUX_CONTEXT|SD_BUS_CREDS_DESCRIPTION)) fputs("\n", f); if (sd_bus_creds_get_cmdline(c, &cmdline) >= 0) { @@ -387,11 +388,11 @@ int bus_creds_dump(sd_bus_creds *c, FILE *f) { if (sd_bus_creds_get_audit_login_uid(c, &audit_loginuid) >= 0) { audit_loginuid_is_set = true; - fprintf(f, " AuditLoginUID=%lu", (unsigned long) audit_loginuid); + fprintf(f, " AuditLoginUID="UID_FMT, audit_loginuid); } if (sd_bus_creds_get_audit_session_id(c, &audit_sessionid) >= 0) { audit_sessionid_is_set = true; - fprintf(f, " AuditSessionID=%lu", (unsigned long) audit_sessionid); + fprintf(f, " AuditSessionID=%"PRIu32, audit_sessionid); } if (audit_loginuid_is_set || audit_sessionid_is_set) @@ -424,3 +425,98 @@ int bus_creds_dump(sd_bus_creds *c, FILE *f) { return 0; } + +/* + * For details about the file format, see: + * + * http://wiki.wireshark.org/Development/LibpcapFileFormat + */ + +typedef struct _packed_ pcap_hdr_s { + uint32_t magic_number; /* magic number */ + uint16_t version_major; /* major version number */ + uint16_t version_minor; /* minor version number */ + int32_t thiszone; /* GMT to local correction */ + uint32_t sigfigs; /* accuracy of timestamps */ + uint32_t snaplen; /* max length of captured packets, in octets */ + uint32_t network; /* data link type */ +} pcap_hdr_t ; + +typedef struct _packed_ pcaprec_hdr_s { + uint32_t ts_sec; /* timestamp seconds */ + uint32_t ts_usec; /* timestamp microseconds */ + uint32_t incl_len; /* number of octets of packet saved in file */ + uint32_t orig_len; /* actual length of packet */ +} pcaprec_hdr_t; + +int bus_pcap_header(size_t snaplen, FILE *f) { + + pcap_hdr_t hdr = { + .magic_number = 0xa1b2c3d4U, + .version_major = 2, + .version_minor = 4, + .thiszone = 0, /* UTC */ + .sigfigs = 0, + .network = 231, /* D-Bus */ + }; + + if (!f) + f = stdout; + + assert(snaplen > 0); + assert((size_t) (uint32_t) snaplen == snaplen); + + hdr.snaplen = (uint32_t) snaplen; + + fwrite(&hdr, 1, sizeof(hdr), f); + fflush(f); + + return 0; +} + +int bus_message_pcap_frame(sd_bus_message *m, size_t snaplen, FILE *f) { + struct bus_body_part *part; + pcaprec_hdr_t hdr = {}; + struct timeval tv; + unsigned i; + size_t w; + + if (!f) + f = stdout; + + assert(m); + assert(snaplen > 0); + assert((size_t) (uint32_t) snaplen == snaplen); + + if (m->realtime != 0) + timeval_store(&tv, m->realtime); + else + assert_se(gettimeofday(&tv, NULL) >= 0); + + hdr.ts_sec = tv.tv_sec; + hdr.ts_usec = tv.tv_usec; + hdr.orig_len = BUS_MESSAGE_SIZE(m); + hdr.incl_len = MIN(hdr.orig_len, snaplen); + + /* write the pcap header */ + fwrite(&hdr, 1, sizeof(hdr), f); + + /* write the dbus header */ + w = MIN(BUS_MESSAGE_BODY_BEGIN(m), snaplen); + fwrite(m->header, 1, w, f); + snaplen -= w; + + /* write the dbus body */ + MESSAGE_FOREACH_PART(part, i, m) { + if (snaplen <= 0) + break; + + w = MIN(part->size, snaplen); + fwrite(part->data, 1, w, f); + snaplen -= w; + } + + fflush(f); + + return 0; +}