summaryrefslogtreecommitdiffstats
path: root/liblog/log_read.c
diff options
context:
space:
mode:
Diffstat (limited to 'liblog/log_read.c')
-rw-r--r--liblog/log_read.c50
1 files changed, 39 insertions, 11 deletions
diff --git a/liblog/log_read.c b/liblog/log_read.c
index 2dd07e6..11fe848 100644
--- a/liblog/log_read.c
+++ b/liblog/log_read.c
@@ -17,6 +17,7 @@
#include <errno.h>
#include <fcntl.h>
#include <inttypes.h>
+#include <poll.h>
#include <signal.h>
#include <stddef.h>
#define NOMINMAX /* for windows to suppress definition of min in stdlib.h */
@@ -196,7 +197,8 @@ static const char *LOG_NAME[LOG_ID_MAX] = {
[LOG_ID_MAIN] = "main",
[LOG_ID_RADIO] = "radio",
[LOG_ID_EVENTS] = "events",
- [LOG_ID_SYSTEM] = "system"
+ [LOG_ID_SYSTEM] = "system",
+ [LOG_ID_CRASH] = "crash",
};
const char *android_log_id_to_name(log_id_t log_id)
@@ -272,6 +274,8 @@ static ssize_t send_log_msg(struct logger *logger,
const char *msg, char *buf, size_t buf_size)
{
ssize_t ret;
+ size_t len;
+ char *cp;
int errno_save = 0;
int sock = socket_local_client("logd", ANDROID_SOCKET_NAMESPACE_RESERVED,
SOCK_STREAM);
@@ -283,12 +287,44 @@ static ssize_t send_log_msg(struct logger *logger,
snprintf(buf, buf_size, msg, logger ? logger->id : (unsigned) -1);
}
- ret = write(sock, buf, strlen(buf) + 1);
+ len = strlen(buf) + 1;
+ ret = TEMP_FAILURE_RETRY(write(sock, buf, len));
if (ret <= 0) {
goto done;
}
- ret = read(sock, buf, buf_size);
+ len = buf_size;
+ cp = buf;
+ while ((ret = TEMP_FAILURE_RETRY(read(sock, cp, len))) > 0) {
+ struct pollfd p;
+
+ if (((size_t)ret == len) || (buf_size < PAGE_SIZE)) {
+ break;
+ }
+
+ len -= ret;
+ cp += ret;
+
+ memset(&p, 0, sizeof(p));
+ p.fd = sock;
+ p.events = POLLIN;
+
+ /* Give other side 20ms to refill pipe */
+ ret = TEMP_FAILURE_RETRY(poll(&p, 1, 20));
+
+ if (ret <= 0) {
+ break;
+ }
+
+ if (!(p.revents & POLLIN)) {
+ ret = 0;
+ break;
+ }
+ }
+
+ if (ret >= 0) {
+ ret += buf_size - len;
+ }
done:
if ((ret == -1) && errno) {
@@ -340,8 +376,6 @@ long android_logger_get_log_size(struct logger *logger)
return atol(buf);
}
-#ifdef USERDEBUG_BUILD
-
int android_logger_set_log_size(struct logger *logger, unsigned long size)
{
char buf[512];
@@ -352,8 +386,6 @@ int android_logger_set_log_size(struct logger *logger, unsigned long 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)
@@ -408,8 +440,6 @@ ssize_t android_logger_get_statistics(struct logger_list *logger_list,
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)
{
@@ -432,8 +462,6 @@ int android_logger_set_prune_list(struct logger_list *logger_list UNUSED,
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)