From f4161d5044be7ff264edd9a2f56e9f6a405f4bfb Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Sat, 7 Nov 2015 14:37:22 +0100 Subject: [PATCH] monitor: Add support for decoding user logging packets --- monitor/display.h | 4 ++- monitor/packet.c | 58 ++++++++++++++++++++++++++++++++++++++++++++ src/shared/btsnoop.h | 1 + 3 files changed, 62 insertions(+), 1 deletion(-) diff --git a/monitor/display.h b/monitor/display.h index 4ce5d3524..a7421804e 100644 --- a/monitor/display.h +++ b/monitor/display.h @@ -38,8 +38,10 @@ bool use_color(void); #define COLOR_WHITE_BG "\x1B[0;47;30m" #define COLOR_HIGHLIGHT "\x1B[1;39m" -#define COLOR_WARN "\x1B[1;30m" #define COLOR_ERROR "\x1B[1;31m" +#define COLOR_WARN "\x1B[1;30m" +#define COLOR_INFO "\x1B[0;30m" +#define COLOR_DEBUG "\x1B[0;37m" #define FALLBACK_TERMINAL_WIDTH 80 diff --git a/monitor/packet.c b/monitor/packet.c index 926e651a1..cbced9726 100644 --- a/monitor/packet.c +++ b/monitor/packet.c @@ -3691,6 +3691,61 @@ static void packet_system_note(struct timeval *tv, struct ucred *cred, "Note", data, NULL); } +static void packet_user_logging(struct timeval *tv, struct ucred *cred, + uint16_t index, const void *data, uint16_t size) +{ + char pid_str[128]; + uint8_t priority; + const char *color; + + if (size < 1) + return; + + priority = *((uint8_t *) data); + + switch (priority) { + case 0x03: + color = COLOR_ERROR; + break; + case 0x04: + color = COLOR_WARN; + break; + case 0x06: + color = COLOR_INFO; + break; + case 0x07: + color = COLOR_DEBUG; + break; + default: + color = COLOR_WHITE_BG; + break; + } + + if (cred) { + char *path = alloca(24); + char line[128]; + FILE *fp; + + snprintf(path, 23, "/proc/%u/comm", cred->pid); + + fp = fopen(path, "re"); + if (fp) { + if (fgets(line, sizeof(line), fp)) { + line[strcspn(line, "\r\n")] = '\0'; + snprintf(pid_str, sizeof(pid_str), "%s[%u]", + line, cred->pid); + } else + snprintf(pid_str, sizeof(pid_str), "%u", + cred->pid); + fclose(fp); + } else + snprintf(pid_str, sizeof(pid_str), "%u", cred->pid); + } else + strcpy(pid_str, "Message"); + + print_packet(tv, cred, index, '=', color, pid_str, data + 1, NULL); +} + void packet_monitor(struct timeval *tv, struct ucred *cred, uint16_t index, uint16_t opcode, const void *data, uint16_t size) @@ -3786,6 +3841,9 @@ void packet_monitor(struct timeval *tv, struct ucred *cred, case BTSNOOP_OPCODE_SYSTEM_NOTE: packet_system_note(tv, cred, index, data, size); break; + case BTSNOOP_OPCODE_USER_LOGGING: + packet_user_logging(tv, cred, index, data, size); + break; default: sprintf(extra_str, "(code %d len %d)", opcode, size); print_packet(tv, cred, index, '*', COLOR_ERROR, diff --git a/src/shared/btsnoop.h b/src/shared/btsnoop.h index fadc878b3..950de113c 100644 --- a/src/shared/btsnoop.h +++ b/src/shared/btsnoop.h @@ -48,6 +48,7 @@ #define BTSNOOP_OPCODE_INDEX_INFO 10 #define BTSNOOP_OPCODE_VENDOR_DIAG 11 #define BTSNOOP_OPCODE_SYSTEM_NOTE 12 +#define BTSNOOP_OPCODE_USER_LOGGING 13 #define BTSNOOP_MAX_PACKET_SIZE (1486 + 4) -- 2.47.3