summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbohu2017-03-02 01:26:02 -0600
committerbohu2017-03-28 11:27:28 -0500
commit7b60bd95dfa07e86325b432465fb0043648f6c97 (patch)
tree178f5865de637b0f51877cb1e72f2c6803d8522c /qemu_pipe
parentff87855e10423a1ad6f764f378b8182f86c6f738 (diff)
downloadplatform-system-core-7b60bd95dfa07e86325b432465fb0043648f6c97.tar.gz
platform-system-core-7b60bd95dfa07e86325b432465fb0043648f6c97.tar.xz
platform-system-core-7b60bd95dfa07e86325b432465fb0043648f6c97.zip
Emulator: Enhance qemu_pipe.h to handle partial rw
Partial read and write happen and it is better to try again unless there is some hard error. This is meant to fix some flaky behavior of emulator pipe services, hopefully. BUG: 35207286 manually tested this on emulator image. (cherry picked from aosp f099dce4a622f2ece313abe71a422489704ee692) Change-Id: I26a4560fa34e979939edcc882fcc5190202fe9f6
Diffstat (limited to 'qemu_pipe')
-rw-r--r--qemu_pipe/qemu_pipe.cpp25
1 files changed, 10 insertions, 15 deletions
diff --git a/qemu_pipe/qemu_pipe.cpp b/qemu_pipe/qemu_pipe.cpp
index a4529deb8..ca3b79578 100644
--- a/qemu_pipe/qemu_pipe.cpp
+++ b/qemu_pipe/qemu_pipe.cpp
@@ -22,6 +22,10 @@
22#include <errno.h> 22#include <errno.h>
23#include <stdio.h> 23#include <stdio.h>
24 24
25#include <android-base/file.h>
26
27using android::base::ReadFully;
28using android::base::WriteFully;
25 29
26// Define QEMU_PIPE_DEBUG if you want to print error messages when an error 30// Define QEMU_PIPE_DEBUG if you want to print error messages when an error
27// occurs during pipe operations. The macro should simply take a printf-style 31// occurs during pipe operations. The macro should simply take a printf-style
@@ -66,15 +70,10 @@ int qemu_pipe_open(const char* pipeName) {
66 70
67 // Write the pipe name, *including* the trailing zero which is necessary. 71 // Write the pipe name, *including* the trailing zero which is necessary.
68 size_t pipeNameLen = strlen(pipeName); 72 size_t pipeNameLen = strlen(pipeName);
69 ssize_t ret = TEMP_FAILURE_RETRY(write(fd, pipeName, pipeNameLen + 1U)); 73 if (!WriteFully(fd, pipeName, pipeNameLen + 1U)) {
70 if (ret != (ssize_t)pipeNameLen + 1) {
71 QEMU_PIPE_DEBUG("%s: Could not connect to %s pipe service: %s", 74 QEMU_PIPE_DEBUG("%s: Could not connect to %s pipe service: %s",
72 __FUNCTION__, pipeName, strerror(errno)); 75 __FUNCTION__, pipeName, strerror(errno));
73 if (ret == 0) { 76 close(fd);
74 errno = ECONNRESET;
75 } else if (ret > 0) {
76 errno = EINVAL;
77 }
78 return -1; 77 return -1;
79 } 78 }
80 return fd; 79 return fd;
@@ -86,13 +85,11 @@ int qemu_pipe_open(const char* pipeName) {
86int qemu_pipe_frame_send(int fd, const void* buff, size_t len) { 85int qemu_pipe_frame_send(int fd, const void* buff, size_t len) {
87 char header[5]; 86 char header[5];
88 snprintf(header, sizeof(header), "%04zx", len); 87 snprintf(header, sizeof(header), "%04zx", len);
89 ssize_t ret = TEMP_FAILURE_RETRY(write(fd, header, 4)); 88 if (!WriteFully(fd, header, 4)) {
90 if (ret != 4) {
91 QEMU_PIPE_DEBUG("Can't write qemud frame header: %s", strerror(errno)); 89 QEMU_PIPE_DEBUG("Can't write qemud frame header: %s", strerror(errno));
92 return -1; 90 return -1;
93 } 91 }
94 ret = TEMP_FAILURE_RETRY(write(fd, buff, len)); 92 if (!WriteFully(fd, buff, len)) {
95 if (ret != (ssize_t)len) {
96 QEMU_PIPE_DEBUG("Can't write qemud frame payload: %s", strerror(errno)); 93 QEMU_PIPE_DEBUG("Can't write qemud frame payload: %s", strerror(errno));
97 return -1; 94 return -1;
98 } 95 }
@@ -106,8 +103,7 @@ int qemu_pipe_frame_send(int fd, const void* buff, size_t len) {
106// end-of-stream. 103// end-of-stream.
107int qemu_pipe_frame_recv(int fd, void* buff, size_t len) { 104int qemu_pipe_frame_recv(int fd, void* buff, size_t len) {
108 char header[5]; 105 char header[5];
109 ssize_t ret = TEMP_FAILURE_RETRY(read(fd, header, 4)); 106 if (!ReadFully(fd, header, 4)) {
110 if (ret != 4) {
111 QEMU_PIPE_DEBUG("Can't read qemud frame header: %s", strerror(errno)); 107 QEMU_PIPE_DEBUG("Can't read qemud frame header: %s", strerror(errno));
112 return -1; 108 return -1;
113 } 109 }
@@ -122,8 +118,7 @@ int qemu_pipe_frame_recv(int fd, void* buff, size_t len) {
122 len); 118 len);
123 return -1; 119 return -1;
124 } 120 }
125 ret = TEMP_FAILURE_RETRY(read(fd, buff, size)); 121 if (!ReadFully(fd, buff, size)) {
126 if (ret != (ssize_t)size) {
127 QEMU_PIPE_DEBUG("Could not read qemud frame payload: %s", 122 QEMU_PIPE_DEBUG("Could not read qemud frame payload: %s",
128 strerror(errno)); 123 strerror(errno));
129 return -1; 124 return -1;