Diff between 12abeb4ec1306b84f76a462001a9323aee275d8b and f4161d5044be7ff264edd9a2f56e9f6a405f4bfb

Changed Files

File Additions Deletions Status
monitor/display.h +3 -1 modified
monitor/packet.c +58 -0 modified
src/shared/btsnoop.h +1 -0 modified

Full Patch

diff --git a/monitor/display.h b/monitor/display.h
index 4ce5d35..a742180 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 926e651..cbced97 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 fadc878..950de11 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)