Loading include/log/logger.h +14 −2 Original line number Diff line number Diff line Loading @@ -140,12 +140,24 @@ struct logger; log_id_t android_logger_get_id(struct logger *logger); int android_logger_clear(struct logger *logger); int android_logger_get_log_size(struct logger *logger); int android_logger_get_log_readable_size(struct logger *logger); long android_logger_get_log_size(struct logger *logger); #ifdef USERDEBUG_BUILD int android_logger_set_log_size(struct logger *logger, unsigned long size); #endif long android_logger_get_log_readable_size(struct logger *logger); int android_logger_get_log_version(struct logger *logger); struct logger_list; ssize_t android_logger_get_statistics(struct logger_list *logger_list, char *buf, size_t len); #ifdef USERDEBUG_BUILD ssize_t android_logger_get_prune_list(struct logger_list *logger_list, char *buf, size_t len); int android_logger_set_prune_list(struct logger_list *logger_list, char *buf, size_t len); #endif struct logger_list *android_logger_list_alloc(int mode, unsigned int tail, pid_t pid); Loading liblog/Android.mk +6 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,10 @@ else liblog_sources := logd_write_kern.c endif ifneq ($(filter userdebug eng,$(TARGET_BUILD_VARIANT)),) liblog_cflags := -DUSERDEBUG_BUILD=1 endif # some files must not be compiled when building against Mingw # they correspond to features not used by our host development tools # which are also hard or even impossible to port to native Win32 Loading Loading @@ -80,11 +84,13 @@ include $(BUILD_HOST_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := liblog LOCAL_SRC_FILES := $(liblog_target_sources) LOCAL_CFLAGS := $(liblog_cflags) include $(BUILD_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := liblog LOCAL_WHOLE_STATIC_LIBRARIES := liblog LOCAL_CFLAGS := $(liblog_cflags) include $(BUILD_SHARED_LIBRARY) include $(call first-makefiles-under,$(LOCAL_PATH)) liblog/log_read.c +79 −8 Original line number Diff line number Diff line Loading @@ -296,11 +296,8 @@ done: return ret; } int android_logger_clear(struct logger *logger) static int check_log_success(char *buf, ssize_t ret) { char buf[512]; ssize_t ret = send_log_msg(logger, "clear %d", buf, sizeof(buf)); if (ret < 0) { return ret; } Loading @@ -312,8 +309,16 @@ int android_logger_clear(struct logger *logger) return 0; } int android_logger_clear(struct logger *logger) { char buf[512]; return check_log_success(buf, send_log_msg(logger, "clear %d", buf, sizeof(buf))); } /* returns the total size of the log's ring buffer */ int android_logger_get_log_size(struct logger *logger) long android_logger_get_log_size(struct logger *logger) { char buf[512]; Loading @@ -326,14 +331,28 @@ int android_logger_get_log_size(struct logger *logger) return -1; } return atoi(buf); return atol(buf); } #ifdef USERDEBUG_BUILD int android_logger_set_log_size(struct logger *logger, unsigned long size) { char buf[512]; snprintf(buf, sizeof(buf), "setLogSize %d %lu", logger ? logger->id : (unsigned) -1, size); return check_log_success(buf, send_log_msg(NULL, NULL, buf, sizeof(buf))); } #endif /* USERDEBUG_BUILD */ /* * returns the readable size of the log's ring buffer (that is, amount of the * log consumed) */ int android_logger_get_log_readable_size(struct logger *logger) long android_logger_get_log_readable_size(struct logger *logger) { char buf[512]; Loading @@ -346,7 +365,7 @@ int android_logger_get_log_readable_size(struct logger *logger) return -1; } return atoi(buf); return atol(buf); } /* Loading @@ -357,6 +376,58 @@ int android_logger_get_log_version(struct logger *logger UNUSED) return 3; } /* * returns statistics */ ssize_t android_logger_get_statistics(struct logger_list *logger_list, char *buf, size_t len) { struct listnode *node; struct logger *logger; char *cp = buf; size_t remaining = len; size_t n; n = snprintf(cp, remaining, "getStatistics"); n = min(n, remaining); remaining -= n; cp += n; logger_for_each(logger, logger_list) { n = snprintf(cp, remaining, " %d", logger->id); n = min(n, remaining); remaining -= n; cp += n; } return send_log_msg(NULL, NULL, buf, len); } #ifdef USERDEBUG_BUILD ssize_t android_logger_get_prune_list(struct logger_list *logger_list UNUSED, char *buf, size_t len) { return send_log_msg(NULL, "getPruneList", buf, len); } int android_logger_set_prune_list(struct logger_list *logger_list UNUSED, char *buf, size_t len) { const char cmd[] = "setPruneList "; const size_t cmdlen = sizeof(cmd) - 1; if (strlen(buf) > (len - cmdlen)) { return -ENOMEM; /* KISS */ } memmove(buf + cmdlen, buf, len - cmdlen); buf[len - 1] = '\0'; memcpy(buf, cmd, cmdlen); return check_log_success(buf, send_log_msg(NULL, NULL, buf, len)); } #endif /* USERDEBUG_BUILD */ struct logger_list *android_logger_list_alloc(int mode, unsigned int tail, pid_t pid) Loading liblog/log_read_kern.c +45 −2 Original line number Diff line number Diff line Loading @@ -51,6 +51,8 @@ typedef char bool; logger != node_to_item(&(logger_list)->node, struct logger, node); \ logger = node_to_item((logger)->node.next, struct logger, node)) #define UNUSED __attribute__((unused)) /* In the future, we would like to make this list extensible */ static const char *LOG_NAME[LOG_ID_MAX] = { [LOG_ID_MAIN] = "main", Loading Loading @@ -225,16 +227,26 @@ int android_logger_clear(struct logger *logger) } /* returns the total size of the log's ring buffer */ int android_logger_get_log_size(struct logger *logger) long android_logger_get_log_size(struct logger *logger) { return logger_ioctl(logger, LOGGER_GET_LOG_BUF_SIZE, O_RDWR); } #ifdef USERDEBUG_BUILD int android_logger_set_log_size(struct logger *logger UNUSED, unsigned long size UNUSED) { return -ENOTSUP; } #endif /* USERDEBUG_BUILD */ /* * returns the readable size of the log's ring buffer (that is, amount of the * log consumed) */ int android_logger_get_log_readable_size(struct logger *logger) long android_logger_get_log_readable_size(struct logger *logger) { return logger_ioctl(logger, LOGGER_GET_LOG_LEN, O_RDONLY); } Loading @@ -248,6 +260,37 @@ int android_logger_get_log_version(struct logger *logger) return (ret < 0) ? 1 : ret; } /* * returns statistics */ static const char unsupported[] = "18\nNot Supported\n\f"; ssize_t android_logger_get_statistics(struct logger_list *logger_list UNUSED, char *buf, size_t len) { strncpy(buf, unsupported, len); return -ENOTSUP; } #ifdef USERDEBUG_BUILD ssize_t android_logger_get_prune_list(struct logger_list *logger_list UNUSED, char *buf, size_t len) { strncpy(buf, unsupported, len); return -ENOTSUP; } int android_logger_set_prune_list(struct logger_list *logger_list UNUSED, char *buf, size_t len) { static const char unsupported_error[] = "Unsupported"; strncpy(buf, unsupported, len); return -ENOTSUP; } #endif /* USERDEBUG_BUILD */ struct logger_list *android_logger_list_alloc(int mode, unsigned int tail, pid_t pid) Loading logcat/Android.mk +4 −0 Original line number Diff line number Diff line Loading @@ -3,6 +3,10 @@ LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) ifneq ($(filter userdebug eng,$(TARGET_BUILD_VARIANT)),) LOCAL_CFLAGS += -DUSERDEBUG_BUILD=1 endif LOCAL_SRC_FILES:= logcat.cpp event.logtags LOCAL_SHARED_LIBRARIES := liblog Loading Loading
include/log/logger.h +14 −2 Original line number Diff line number Diff line Loading @@ -140,12 +140,24 @@ struct logger; log_id_t android_logger_get_id(struct logger *logger); int android_logger_clear(struct logger *logger); int android_logger_get_log_size(struct logger *logger); int android_logger_get_log_readable_size(struct logger *logger); long android_logger_get_log_size(struct logger *logger); #ifdef USERDEBUG_BUILD int android_logger_set_log_size(struct logger *logger, unsigned long size); #endif long android_logger_get_log_readable_size(struct logger *logger); int android_logger_get_log_version(struct logger *logger); struct logger_list; ssize_t android_logger_get_statistics(struct logger_list *logger_list, char *buf, size_t len); #ifdef USERDEBUG_BUILD ssize_t android_logger_get_prune_list(struct logger_list *logger_list, char *buf, size_t len); int android_logger_set_prune_list(struct logger_list *logger_list, char *buf, size_t len); #endif struct logger_list *android_logger_list_alloc(int mode, unsigned int tail, pid_t pid); Loading
liblog/Android.mk +6 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,10 @@ else liblog_sources := logd_write_kern.c endif ifneq ($(filter userdebug eng,$(TARGET_BUILD_VARIANT)),) liblog_cflags := -DUSERDEBUG_BUILD=1 endif # some files must not be compiled when building against Mingw # they correspond to features not used by our host development tools # which are also hard or even impossible to port to native Win32 Loading Loading @@ -80,11 +84,13 @@ include $(BUILD_HOST_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := liblog LOCAL_SRC_FILES := $(liblog_target_sources) LOCAL_CFLAGS := $(liblog_cflags) include $(BUILD_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := liblog LOCAL_WHOLE_STATIC_LIBRARIES := liblog LOCAL_CFLAGS := $(liblog_cflags) include $(BUILD_SHARED_LIBRARY) include $(call first-makefiles-under,$(LOCAL_PATH))
liblog/log_read.c +79 −8 Original line number Diff line number Diff line Loading @@ -296,11 +296,8 @@ done: return ret; } int android_logger_clear(struct logger *logger) static int check_log_success(char *buf, ssize_t ret) { char buf[512]; ssize_t ret = send_log_msg(logger, "clear %d", buf, sizeof(buf)); if (ret < 0) { return ret; } Loading @@ -312,8 +309,16 @@ int android_logger_clear(struct logger *logger) return 0; } int android_logger_clear(struct logger *logger) { char buf[512]; return check_log_success(buf, send_log_msg(logger, "clear %d", buf, sizeof(buf))); } /* returns the total size of the log's ring buffer */ int android_logger_get_log_size(struct logger *logger) long android_logger_get_log_size(struct logger *logger) { char buf[512]; Loading @@ -326,14 +331,28 @@ int android_logger_get_log_size(struct logger *logger) return -1; } return atoi(buf); return atol(buf); } #ifdef USERDEBUG_BUILD int android_logger_set_log_size(struct logger *logger, unsigned long size) { char buf[512]; snprintf(buf, sizeof(buf), "setLogSize %d %lu", logger ? logger->id : (unsigned) -1, size); return check_log_success(buf, send_log_msg(NULL, NULL, buf, sizeof(buf))); } #endif /* USERDEBUG_BUILD */ /* * returns the readable size of the log's ring buffer (that is, amount of the * log consumed) */ int android_logger_get_log_readable_size(struct logger *logger) long android_logger_get_log_readable_size(struct logger *logger) { char buf[512]; Loading @@ -346,7 +365,7 @@ int android_logger_get_log_readable_size(struct logger *logger) return -1; } return atoi(buf); return atol(buf); } /* Loading @@ -357,6 +376,58 @@ int android_logger_get_log_version(struct logger *logger UNUSED) return 3; } /* * returns statistics */ ssize_t android_logger_get_statistics(struct logger_list *logger_list, char *buf, size_t len) { struct listnode *node; struct logger *logger; char *cp = buf; size_t remaining = len; size_t n; n = snprintf(cp, remaining, "getStatistics"); n = min(n, remaining); remaining -= n; cp += n; logger_for_each(logger, logger_list) { n = snprintf(cp, remaining, " %d", logger->id); n = min(n, remaining); remaining -= n; cp += n; } return send_log_msg(NULL, NULL, buf, len); } #ifdef USERDEBUG_BUILD ssize_t android_logger_get_prune_list(struct logger_list *logger_list UNUSED, char *buf, size_t len) { return send_log_msg(NULL, "getPruneList", buf, len); } int android_logger_set_prune_list(struct logger_list *logger_list UNUSED, char *buf, size_t len) { const char cmd[] = "setPruneList "; const size_t cmdlen = sizeof(cmd) - 1; if (strlen(buf) > (len - cmdlen)) { return -ENOMEM; /* KISS */ } memmove(buf + cmdlen, buf, len - cmdlen); buf[len - 1] = '\0'; memcpy(buf, cmd, cmdlen); return check_log_success(buf, send_log_msg(NULL, NULL, buf, len)); } #endif /* USERDEBUG_BUILD */ struct logger_list *android_logger_list_alloc(int mode, unsigned int tail, pid_t pid) Loading
liblog/log_read_kern.c +45 −2 Original line number Diff line number Diff line Loading @@ -51,6 +51,8 @@ typedef char bool; logger != node_to_item(&(logger_list)->node, struct logger, node); \ logger = node_to_item((logger)->node.next, struct logger, node)) #define UNUSED __attribute__((unused)) /* In the future, we would like to make this list extensible */ static const char *LOG_NAME[LOG_ID_MAX] = { [LOG_ID_MAIN] = "main", Loading Loading @@ -225,16 +227,26 @@ int android_logger_clear(struct logger *logger) } /* returns the total size of the log's ring buffer */ int android_logger_get_log_size(struct logger *logger) long android_logger_get_log_size(struct logger *logger) { return logger_ioctl(logger, LOGGER_GET_LOG_BUF_SIZE, O_RDWR); } #ifdef USERDEBUG_BUILD int android_logger_set_log_size(struct logger *logger UNUSED, unsigned long size UNUSED) { return -ENOTSUP; } #endif /* USERDEBUG_BUILD */ /* * returns the readable size of the log's ring buffer (that is, amount of the * log consumed) */ int android_logger_get_log_readable_size(struct logger *logger) long android_logger_get_log_readable_size(struct logger *logger) { return logger_ioctl(logger, LOGGER_GET_LOG_LEN, O_RDONLY); } Loading @@ -248,6 +260,37 @@ int android_logger_get_log_version(struct logger *logger) return (ret < 0) ? 1 : ret; } /* * returns statistics */ static const char unsupported[] = "18\nNot Supported\n\f"; ssize_t android_logger_get_statistics(struct logger_list *logger_list UNUSED, char *buf, size_t len) { strncpy(buf, unsupported, len); return -ENOTSUP; } #ifdef USERDEBUG_BUILD ssize_t android_logger_get_prune_list(struct logger_list *logger_list UNUSED, char *buf, size_t len) { strncpy(buf, unsupported, len); return -ENOTSUP; } int android_logger_set_prune_list(struct logger_list *logger_list UNUSED, char *buf, size_t len) { static const char unsupported_error[] = "Unsupported"; strncpy(buf, unsupported, len); return -ENOTSUP; } #endif /* USERDEBUG_BUILD */ struct logger_list *android_logger_list_alloc(int mode, unsigned int tail, pid_t pid) Loading
logcat/Android.mk +4 −0 Original line number Diff line number Diff line Loading @@ -3,6 +3,10 @@ LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) ifneq ($(filter userdebug eng,$(TARGET_BUILD_VARIANT)),) LOCAL_CFLAGS += -DUSERDEBUG_BUILD=1 endif LOCAL_SRC_FILES:= logcat.cpp event.logtags LOCAL_SHARED_LIBRARIES := liblog Loading