android/log: allow selecting log buffer with '-b'
Instead of unconditionally logging on the main buffer, allow choosing
the buffer where the log should be sent. The default Android buffers
are supported.
diff --git a/lib/portability.h b/lib/portability.h
index 324ddc8..55e3ab2 100644
--- a/lib/portability.h
+++ b/lib/portability.h
@@ -302,15 +302,26 @@
ANDROID_LOG_FATAL,
ANDROID_LOG_SILENT,
} android_LogPriority;
+typedef enum log_id {
+ LOG_ID_MAIN = 0,
+ LOG_ID_RADIO = 1,
+ LOG_ID_EVENTS = 2,
+ LOG_ID_SYSTEM = 3,
+ LOG_ID_CRASH = 4,
+ LOG_ID_STATS = 5,
+ LOG_ID_SECURITY = 6,
+ LOG_ID_KERNEL = 7,
+} log_id_t;
#endif
#if !defined(__BIONIC__) || defined(__ANDROID_NDK__)
// Android NDKv18 has liblog.so but not liblog.a for static builds.
-static inline int stub_out_log_write(int pri, const char *tag, const char *msg)
+static inline int stub_out_log_buf_write(int log_id, int pri, const char *tag,
+ const char *msg)
{
return -1;
}
#ifdef __ANDROID_NDK__
-#define __android_log_write(a, b, c) stub_out_log_write(a, b, c)
+#define __android_log_buf_write(a, b, c, d) stub_out_log_buf_write(a, b, c, d)
#endif
#endif
diff --git a/toys/android/log.c b/toys/android/log.c
index 005f714..5c4dcd9 100644
--- a/toys/android/log.c
+++ b/toys/android/log.c
@@ -2,17 +2,19 @@
*
* Copyright 2016 The Android Open Source Project
-USE_LOG(NEWTOY(log, "p:t:", TOYFLAG_USR|TOYFLAG_SBIN))
+USE_LOG(NEWTOY(log, "b:p:t:", TOYFLAG_USR|TOYFLAG_SBIN))
config LOG
bool "log"
depends on TOYBOX_ON_ANDROID
default y
help
- usage: log [-p PRI] [-t TAG] [MESSAGE...]
+ usage: log [-b BUFFER] [-p PRI] [-t TAG] [MESSAGE...]
Logs message (or stdin) to logcat.
+ -b Use the given log buffer instead of "main":
+ "radio", "events", "system", "crash", "stats", "security", "kernel"
-p Use the given priority instead of INFO:
d: DEBUG e: ERROR f: FATAL i: INFO v: VERBOSE w: WARN s: SILENT
-t Use the given tag instead of "log"
@@ -22,15 +24,15 @@
#include "toys.h"
GLOBALS(
- char *t, *p;
+ char *t, *p, *b;
- int pri;
+ int pri, buf;
)
static void log_line(char **pline, long len)
{
if (!pline) return;
- __android_log_write(TT.pri, TT.t, *pline);
+ __android_log_buf_write(TT.buf, TT.pri, TT.t, *pline);
}
void log_main(void)
@@ -47,6 +49,15 @@
ANDROID_LOG_VERBOSE, ANDROID_LOG_WARN}[i];
}
if (!TT.t) TT.t = "log";
+ if (!TT.b || !strcmp(TT.b, "main")) TT.buf = LOG_ID_MAIN;
+ else if (!strcmp(TT.b, "radio")) TT.buf = LOG_ID_RADIO;
+ else if (!strcmp(TT.b, "events")) TT.buf = LOG_ID_EVENTS;
+ else if (!strcmp(TT.b, "system")) TT.buf = LOG_ID_SYSTEM;
+ else if (!strcmp(TT.b, "crash")) TT.buf = LOG_ID_CRASH;
+ else if (!strcmp(TT.b, "stats")) TT.buf = LOG_ID_STATS;
+ else if (!strcmp(TT.b, "security")) TT.buf = LOG_ID_SECURITY;
+ else if (!strcmp(TT.b, "kernel")) TT.buf = LOG_ID_KERNEL;
+ else error_exit("unknown log buffer: %s", TT.b);
if (toys.optc) {
for (i = 0; toys.optargs[i]; i++) {
@@ -61,5 +72,5 @@
}
} else do_lines(0, '\n', log_line);
- __android_log_write(TT.pri, TT.t, toybuf);
+ __android_log_buf_write(TT.buf, TT.pri, TT.t, toybuf);
}