logger: handle EAGAIN properly for nonblocking fds 72/126672/2
authorKarol Lewandowski <k.lewandowsk@samsung.com>
Mon, 24 Apr 2017 14:18:08 +0000 (16:18 +0200)
committerKarol Lewandowski <k.lewandowsk@samsung.com>
Mon, 24 Apr 2017 16:39:06 +0000 (16:39 +0000)
Reading non-blocking /dev/log_* returns -EINVAL when there is no
data available.  This commit fixes the service_reader_file() to
handle this situation gracefully.

Change-Id: I488361adeb11ea59719d645051e5a3f3173b6525

src/logger/logger.c

index 06fc65e..5d9fb3f 100644 (file)
@@ -979,12 +979,11 @@ static int service_reader_file(struct logger * server, struct reader* reader)
        int max_loop_iterations = 100;
        while (max_loop_iterations--) {
                int r = read(reader->buf_id, buffer, sizeof buffer - 1);
-               if (r == -1) {
-                       if (errno != EINTR && errno != EAGAIN)
-                               return -errno;
-               } else if (r == 0) {
+               if (r == -1 && errno != EINTR)
+                       return -errno;
+               else if (r == 0 || (r == -1 && errno == EAGAIN))
                        return 0;
-               else {
+               else {
                        buffer[r] = '\0';
                        struct logger_entry * const entry = (struct logger_entry *) buffer;
                        parse_androidlogger_message((struct android_logger_entry *) buffer, entry, r);