aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--qemu-sockets-android.c39
-rw-r--r--qemu-sockets.c38
2 files changed, 77 insertions, 0 deletions
diff --git a/qemu-sockets-android.c b/qemu-sockets-android.c
index dc64775..e7d5e18 100644
--- a/qemu-sockets-android.c
+++ b/qemu-sockets-android.c
@@ -52,6 +52,11 @@ static QemuOptsList dummy_opts = {
},{
.name = "ipv6",
.type = QEMU_OPT_BOOL,
+#ifdef CONFIG_ANDROID
+ },{
+ .name = "socket",
+ .type = QEMU_OPT_NUMBER,
+#endif
},
{ /* end if list */ }
},
@@ -79,6 +84,13 @@ int inet_listen_opts(QemuOpts *opts, int port_offset)
char uport[33];
int slisten,to,try_next,nn;
+#ifdef CONFIG_ANDROID
+ const char* socket_fd = qemu_opt_get(opts, "socket");
+ if (socket_fd) {
+ return atoi(socket_fd);
+ }
+#endif
+
if ((qemu_opt_get(opts, "host") == NULL) ||
(qemu_opt_get(opts, "port") == NULL)) {
fprintf(stderr, "%s: host and/or port not specified\n", __FUNCTION__);
@@ -177,6 +189,13 @@ int inet_connect_opts(QemuOpts *opts)
const char *port;
int sock, nn;
+#ifdef CONFIG_ANDROID
+ const char* socket_fd = qemu_opt_get(opts, "socket");
+ if (socket_fd) {
+ return atoi(socket_fd);
+ }
+#endif
+
addr = qemu_opt_get(opts, "host");
port = qemu_opt_get(opts, "port");
if (addr == NULL || port == NULL) {
@@ -233,6 +252,7 @@ EXIT:
return sock;
}
+
/* compatibility wrapper */
static int inet_parse(QemuOpts *opts, const char *str)
{
@@ -286,6 +306,25 @@ static int inet_parse(QemuOpts *opts, const char *str)
qemu_opt_set(opts, "ipv4", "on");
if (strstr(optstr, ",ipv6"))
qemu_opt_set(opts, "ipv6", "on");
+#ifdef CONFIG_ANDROID
+ h = strstr(optstr, ",socket=");
+ if (h) {
+ int socket_fd;
+ char str_fd[12];
+ if (1 != sscanf(h+7,"%d",&socket_fd)) {
+ fprintf(stderr,"%s: socket fd parse error (%s)\n",
+ __FUNCTION__, h+7);
+ return -1;
+ }
+ if (socket_fd < 0 || socket_fd >= INT_MAX) {
+ fprintf(stderr,"%s: socket fd range error (%d)\n",
+ __FUNCTION__, socket_fd);
+ return -1;
+ }
+ snprintf(str_fd, sizeof str_fd, "%d", socket_fd);
+ qemu_opt_set(opts, "socket", str_fd);
+ }
+#endif
return 0;
}
diff --git a/qemu-sockets.c b/qemu-sockets.c
index c526324..c4c0f65 100644
--- a/qemu-sockets.c
+++ b/qemu-sockets.c
@@ -52,6 +52,11 @@ static QemuOptsList dummy_opts = {
},{
.name = "ipv6",
.type = QEMU_OPT_BOOL,
+#ifdef CONFIG_ANDROID
+ },{
+ .name = "socket",
+ .type = QEMU_OPT_NUMBER,
+#endif
},
{ /* end if list */ }
},
@@ -130,6 +135,13 @@ int inet_listen_opts(QemuOpts *opts, int port_offset)
ai.ai_family = PF_UNSPEC;
ai.ai_socktype = SOCK_STREAM;
+#ifdef CONFIG_ANDROID
+ const char* socket_fd = qemu_opt_get(opts, "socket");
+ if (socket_fd) {
+ return atoi(socket_fd);
+ }
+#endif
+
if ((qemu_opt_get(opts, "host") == NULL) ||
(qemu_opt_get(opts, "port") == NULL)) {
fprintf(stderr, "%s: host and/or port not specified\n", __FUNCTION__);
@@ -226,6 +238,13 @@ int inet_connect_opts(QemuOpts *opts)
char uport[33];
int sock,rc;
+#ifdef CONFIG_ANDROID
+ const char* socket_fd = qemu_opt_get(opts, "socket");
+ if (socket_fd) {
+ return atoi(socket_fd);
+ }
+#endif
+
memset(&ai,0, sizeof(ai));
ai.ai_flags = AI_CANONNAME | AI_ADDRCONFIG;
ai.ai_family = PF_UNSPEC;
@@ -454,6 +473,25 @@ static int inet_parse(QemuOpts *opts, const char *str)
qemu_opt_set(opts, "ipv4", "on");
if (strstr(optstr, ",ipv6"))
qemu_opt_set(opts, "ipv6", "on");
+#ifdef CONFIG_ANDROID
+ h = strstr(optstr, ",socket=");
+ if (h) {
+ int socket_fd;
+ char str_fd[12];
+ if (1 != sscanf(h+7,"%d",&socket_fd)) {
+ fprintf(stderr,"%s: socket fd parse error (%s)\n",
+ __FUNCTION__, h+7);
+ return -1;
+ }
+ if (socket_fd < 0 || socket_fd >= INT_MAX) {
+ fprintf(stderr,"%s: socket fd range error (%d)\n",
+ __FUNCTION__, socket_fd);
+ return -1;
+ }
+ snprintf(str_fd, sizeof str_fd, "%d", socket_fd);
+ qemu_opt_set(opts, "socket", str_fd);
+ }
+#endif
return 0;
}