summaryrefslogtreecommitdiffstats
path: root/liblog/log_read.c
diff options
context:
space:
mode:
authorMark Salyzyn <salyzyn@google.com>2014-04-18 14:49:28 -0700
committerMark Salyzyn <salyzyn@google.com>2014-04-21 17:07:25 -0700
commit696817d3524e2fb8bbbcc2ec3526f4383f789163 (patch)
tree3a27aeefb3bd2c6782c06036e728dbe8ed5c4399 /liblog/log_read.c
parenta67914e4d656b8375cfba17739f9c97e900c8328 (diff)
downloadsystem_core-696817d3524e2fb8bbbcc2ec3526f4383f789163.zip
system_core-696817d3524e2fb8bbbcc2ec3526f4383f789163.tar.gz
system_core-696817d3524e2fb8bbbcc2ec3526f4383f789163.tar.bz2
liblog: Statistics truncated to 16384 bytes
- if network read/write broken up, reassemble the pieces. - Use a 20ms poll to check if a new fragment has been sent by the other side. - fixup logd-unit-tests to take a (simplified) fragment from the liblog changes. Bug: 14164765 Change-Id: I98ff87888c119e1e8349717646d0f733e8971bc8
Diffstat (limited to 'liblog/log_read.c')
-rw-r--r--liblog/log_read.c39
1 files changed, 37 insertions, 2 deletions
diff --git a/liblog/log_read.c b/liblog/log_read.c
index 0ff94bf..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 */
@@ -273,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);
@@ -284,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) {