summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladimir Chtchetkine <vchtchetkine@google.com>2011-08-04 13:52:12 -0700
committerVladimir Chtchetkine <vchtchetkine@google.com>2011-08-05 10:17:39 -0700
commit39e2630dd95ee8b9dc980fedee88966227811b1b (patch)
treefbd03e7d4e0aa6694aaf8d030be73e629df9d180
parent4306ca7d446c26752ecd9f724590487d68a27f10 (diff)
downloadlibhardware-39e2630dd95ee8b9dc980fedee88966227811b1b.tar.gz
Enable connection to QEMUD via pipe.
With the new model, we will try to connect client via pipe first, and only if the pipe connection is not available we will fall back to the socket connection. Change-Id: I7112ff3cb63e1f82a004b80b9ae579d97e15e029
-rw-r--r--include/hardware/qemu_pipe.h2
-rw-r--r--include/hardware/qemud.h55
2 files changed, 32 insertions, 25 deletions
diff --git a/include/hardware/qemu_pipe.h b/include/hardware/qemu_pipe.h
index 570af705..930228e8 100644
--- a/include/hardware/qemu_pipe.h
+++ b/include/hardware/qemu_pipe.h
@@ -20,8 +20,6 @@
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
-#include <hardware/qemud.h>
-#include <hardware/qemu_pipe.h>
#include <pthread.h> /* for pthread_once() */
#include <stdlib.h>
#include <stdio.h>
diff --git a/include/hardware/qemud.h b/include/hardware/qemud.h
index 874a32f2..5c39f9c9 100644
--- a/include/hardware/qemud.h
+++ b/include/hardware/qemud.h
@@ -18,10 +18,12 @@
#define ANDROID_INCLUDE_HARDWARE_QEMUD_H
#include <cutils/sockets.h>
+#include "qemu_pipe.h"
/* the following is helper code that is used by the QEMU-specific
* hardware HAL modules to communicate with the emulator program
- * through the 'qemud' multiplexing daemon.
+ * through the 'qemud' multiplexing daemon, or through the qemud
+ * pipe.
*
* see the documentation comments for details in
* development/emulator/qemud/qemud.c
@@ -64,30 +66,37 @@ qemud_channel_open(const char* name)
int fd;
int namelen = strlen(name);
char answer[2];
+ char pipe_name[256];
- /* connect to qemud control socket */
- fd = socket_local_client( "qemud",
- ANDROID_SOCKET_NAMESPACE_RESERVED,
- SOCK_STREAM );
+ /* First, try to connect to the pipe. */
+ snprintf(pipe_name, sizeof(pipe_name), "qemud:%s", name);
+ fd = qemu_pipe_open(pipe_name);
if (fd < 0) {
- D("no qemud control socket: %s", strerror(errno));
- return -1;
- }
-
- /* send service name to connect */
- if (qemud_fd_write(fd, name, namelen) != namelen) {
- D("can't send service name to qemud: %s",
- strerror(errno));
- close(fd);
- return -1;
- }
-
- /* read answer from daemon */
- if (qemud_fd_read(fd, answer, 2) != 2 ||
- answer[0] != 'O' || answer[1] != 'K') {
- D("cant' connect to %s service through qemud", name);
- close(fd);
- return -1;
+ D("QEMUD pipe is not available for %s: %s", name, strerror(errno));
+ /* If pipe is not available, connect to qemud control socket */
+ fd = socket_local_client( "qemud",
+ ANDROID_SOCKET_NAMESPACE_RESERVED,
+ SOCK_STREAM );
+ if (fd < 0) {
+ D("no qemud control socket: %s", strerror(errno));
+ return -1;
+ }
+
+ /* send service name to connect */
+ if (qemud_fd_write(fd, name, namelen) != namelen) {
+ D("can't send service name to qemud: %s",
+ strerror(errno));
+ close(fd);
+ return -1;
+ }
+
+ /* read answer from daemon */
+ if (qemud_fd_read(fd, answer, 2) != 2 ||
+ answer[0] != 'O' || answer[1] != 'K') {
+ D("cant' connect to %s service through qemud", name);
+ close(fd);
+ return -1;
+ }
}
return fd;
}