summaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/qemu/qemu/chardev-connect-socket-to-a-spawned-command.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-devtools/qemu/qemu/chardev-connect-socket-to-a-spawned-command.patch')
-rw-r--r--meta/recipes-devtools/qemu/qemu/chardev-connect-socket-to-a-spawned-command.patch72
1 files changed, 25 insertions, 47 deletions
diff --git a/meta/recipes-devtools/qemu/qemu/chardev-connect-socket-to-a-spawned-command.patch b/meta/recipes-devtools/qemu/qemu/chardev-connect-socket-to-a-spawned-command.patch
index 4f8539757a..32809d3085 100644
--- a/meta/recipes-devtools/qemu/qemu/chardev-connect-socket-to-a-spawned-command.patch
+++ b/meta/recipes-devtools/qemu/qemu/chardev-connect-socket-to-a-spawned-command.patch
@@ -1,6 +1,6 @@
1From aa3aef4cf5f4dd98f9133df085e825ff5da7dcbd Mon Sep 17 00:00:00 2001 1From 3bb3100c22eb30146a69656480bdffeef8663575 Mon Sep 17 00:00:00 2001
2From: Patrick Ohly <patrick.ohly@intel.com> 2From: Alistair Francis <alistair.francis@xilinx.com>
3Date: Fri, 27 Oct 2017 15:23:35 +0200 3Date: Thu, 21 Dec 2017 11:35:16 -0800
4Subject: [PATCH] chardev: connect socket to a spawned command 4Subject: [PATCH] chardev: connect socket to a spawned command
5 5
6The command is started in a shell (sh -c) with stdin connect to QEMU 6The command is started in a shell (sh -c) with stdin connect to QEMU
@@ -44,22 +44,20 @@ as simple as possible.
44Upstream-Status: Inappropriate [embedded specific] 44Upstream-Status: Inappropriate [embedded specific]
45 45
46Signed-off-by: Patrick Ohly <patrick.ohly@intel.com> 46Signed-off-by: Patrick Ohly <patrick.ohly@intel.com>
47
48--- 47---
49 chardev/char-socket.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++++--- 48 chardev/char-socket.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++++---
50 chardev/char.c | 3 ++ 49 chardev/char.c | 3 ++
51 qapi-schema.json | 5 +++ 50 qapi/char.json | 5 +++
52 3 files changed, 90 insertions(+), 4 deletions(-) 51 3 files changed, 90 insertions(+), 4 deletions(-)
53 52
54diff --git a/chardev/char-socket.c b/chardev/char-socket.c 53diff --git a/chardev/char-socket.c b/chardev/char-socket.c
55index 1ae730a4..c366a02a 100644 54index 53eda8ef00..f566107c35 100644
56--- a/chardev/char-socket.c 55--- a/chardev/char-socket.c
57+++ b/chardev/char-socket.c 56+++ b/chardev/char-socket.c
58@@ -854,6 +854,68 @@ static gboolean socket_reconnect_timeout(gpointer opaque) 57@@ -852,6 +852,66 @@ static gboolean socket_reconnect_timeout(gpointer opaque)
59 return false; 58 return false;
60 } 59 }
61 60
62+#ifndef _WIN32
63+static void chardev_open_socket_cmd(Chardev *chr, 61+static void chardev_open_socket_cmd(Chardev *chr,
64+ const char *cmd, 62+ const char *cmd,
65+ Error **errp) 63+ Error **errp)
@@ -119,51 +117,42 @@ index 1ae730a4..c366a02a 100644
119+ object_unref(OBJECT(sioc)); 117+ object_unref(OBJECT(sioc));
120+ } 118+ }
121+} 119+}
122+#endif
123+ 120+
124 static void qmp_chardev_open_socket(Chardev *chr, 121 static void qmp_chardev_open_socket(Chardev *chr,
125 ChardevBackend *backend, 122 ChardevBackend *backend,
126 bool *be_opened, 123 bool *be_opened,
127@@ -861,6 +923,9 @@ static void qmp_chardev_open_socket(Chardev *chr, 124@@ -859,6 +919,7 @@ static void qmp_chardev_open_socket(Chardev *chr,
128 { 125 {
129 SocketChardev *s = SOCKET_CHARDEV(chr); 126 SocketChardev *s = SOCKET_CHARDEV(chr);
130 ChardevSocket *sock = backend->u.socket.data; 127 ChardevSocket *sock = backend->u.socket.data;
131+#ifndef _WIN32
132+ const char *cmd = sock->cmd; 128+ const char *cmd = sock->cmd;
133+#endif
134 bool do_nodelay = sock->has_nodelay ? sock->nodelay : false; 129 bool do_nodelay = sock->has_nodelay ? sock->nodelay : false;
135 bool is_listen = sock->has_server ? sock->server : true; 130 bool is_listen = sock->has_server ? sock->server : true;
136 bool is_telnet = sock->has_telnet ? sock->telnet : false; 131 bool is_telnet = sock->has_telnet ? sock->telnet : false;
137@@ -928,7 +993,15 @@ static void qmp_chardev_open_socket(Chardev *chr, 132@@ -926,7 +987,12 @@ static void qmp_chardev_open_socket(Chardev *chr,
138 s->reconnect_time = reconnect; 133 s->reconnect_time = reconnect;
139 } 134 }
140 135
141- if (s->reconnect_time) { 136- if (s->reconnect_time) {
142+#ifndef _WIN32
143+ if (cmd) { 137+ if (cmd) {
144+ chardev_open_socket_cmd(chr, cmd, errp); 138+ chardev_open_socket_cmd(chr, cmd, errp);
145+ 139+
146+ /* everything ready (or failed permanently) before we return */ 140+ /* everything ready (or failed permanently) before we return */
147+ *be_opened = true; 141+ *be_opened = true;
148+ } else 142+ } else if (s->reconnect_time) {
149+#endif
150+ if (s->reconnect_time) {
151 sioc = qio_channel_socket_new(); 143 sioc = qio_channel_socket_new();
152 tcp_chr_set_client_ioc_name(chr, sioc); 144 tcp_chr_set_client_ioc_name(chr, sioc);
153 qio_channel_socket_connect_async(sioc, s->addr, 145 qio_channel_socket_connect_async(sioc, s->addr,
154@@ -987,11 +1060,27 @@ static void qemu_chr_parse_socket(QemuOpts *opts, ChardevBackend *backend, 146@@ -985,11 +1051,22 @@ static void qemu_chr_parse_socket(QemuOpts *opts, ChardevBackend *backend,
155 const char *host = qemu_opt_get(opts, "host"); 147 const char *host = qemu_opt_get(opts, "host");
156 const char *port = qemu_opt_get(opts, "port"); 148 const char *port = qemu_opt_get(opts, "port");
157 const char *tls_creds = qemu_opt_get(opts, "tls-creds"); 149 const char *tls_creds = qemu_opt_get(opts, "tls-creds");
158+#ifndef _WIN32
159+ const char *cmd = qemu_opt_get(opts, "cmd"); 150+ const char *cmd = qemu_opt_get(opts, "cmd");
160+#endif
161 SocketAddressLegacy *addr; 151 SocketAddressLegacy *addr;
162 ChardevSocket *sock; 152 ChardevSocket *sock;
163 153
164 backend->type = CHARDEV_BACKEND_KIND_SOCKET; 154 backend->type = CHARDEV_BACKEND_KIND_SOCKET;
165- if (!path) { 155- if (!path) {
166+#ifndef _WIN32
167+ if (cmd) { 156+ if (cmd) {
168+ /* 157+ /*
169+ * Here we have to ensure that no options are set which are incompatible with 158+ * Here we have to ensure that no options are set which are incompatible with
@@ -174,57 +163,46 @@ index 1ae730a4..c366a02a 100644
174+ error_setg(errp, "chardev: socket: cmd does not support any additional options"); 163+ error_setg(errp, "chardev: socket: cmd does not support any additional options");
175+ return; 164+ return;
176+ } 165+ }
177+ } else 166+ } else if (!path) {
178+#endif
179+ if (!path) {
180 if (!host) { 167 if (!host) {
181 error_setg(errp, "chardev: socket: no host given"); 168 error_setg(errp, "chardev: socket: no host given");
182 return; 169 return;
183@@ -1023,13 +1112,24 @@ static void qemu_chr_parse_socket(QemuOpts *opts, ChardevBackend *backend, 170@@ -1021,13 +1098,14 @@ static void qemu_chr_parse_socket(QemuOpts *opts, ChardevBackend *backend,
184 sock->has_reconnect = true; 171 sock->has_reconnect = true;
185 sock->reconnect = reconnect; 172 sock->reconnect = reconnect;
186 sock->tls_creds = g_strdup(tls_creds); 173 sock->tls_creds = g_strdup(tls_creds);
187+#ifndef _WIN32
188+ sock->cmd = g_strdup(cmd); 174+ sock->cmd = g_strdup(cmd);
189+#endif
190 175
191 addr = g_new0(SocketAddressLegacy, 1); 176 addr = g_new0(SocketAddressLegacy, 1);
192+#ifndef _WIN32 177- if (path) {
193+ if (path || cmd) { 178+ if (path || cmd) {
194+#else
195 if (path) {
196+#endif
197 UnixSocketAddress *q_unix; 179 UnixSocketAddress *q_unix;
198 addr->type = SOCKET_ADDRESS_LEGACY_KIND_UNIX; 180 addr->type = SOCKET_ADDRESS_LEGACY_KIND_UNIX;
199 q_unix = addr->u.q_unix.data = g_new0(UnixSocketAddress, 1); 181 q_unix = addr->u.q_unix.data = g_new0(UnixSocketAddress, 1);
200- q_unix->path = g_strdup(path); 182- q_unix->path = g_strdup(path);
201+#ifndef _WIN32
202+ q_unix->path = cmd ? g_strdup_printf("cmd:%s", cmd) : g_strdup(path); 183+ q_unix->path = cmd ? g_strdup_printf("cmd:%s", cmd) : g_strdup(path);
203+#else
204+ q_unix->path = g_strdup(path);
205+#endif
206 } else { 184 } else {
207 addr->type = SOCKET_ADDRESS_LEGACY_KIND_INET; 185 addr->type = SOCKET_ADDRESS_LEGACY_KIND_INET;
208 addr->u.inet.data = g_new(InetSocketAddress, 1); 186 addr->u.inet.data = g_new(InetSocketAddress, 1);
209diff --git a/chardev/char.c b/chardev/char.c 187diff --git a/chardev/char.c b/chardev/char.c
210index 5d283b90..ccb329d4 100644 188index 2ae4f465ec..5d52cd5de5 100644
211--- a/chardev/char.c 189--- a/chardev/char.c
212+++ b/chardev/char.c 190+++ b/chardev/char.c
213@@ -782,6 +782,9 @@ QemuOptsList qemu_chardev_opts = { 191@@ -792,6 +792,9 @@ QemuOptsList qemu_chardev_opts = {
192 },{
214 .name = "path", 193 .name = "path",
215 .type = QEMU_OPT_STRING, 194 .type = QEMU_OPT_STRING,
216 },{ 195+ },{
217+ .name = "cmd", 196+ .name = "cmd",
218+ .type = QEMU_OPT_STRING, 197+ .type = QEMU_OPT_STRING,
219+ },{ 198 },{
220 .name = "host", 199 .name = "host",
221 .type = QEMU_OPT_STRING, 200 .type = QEMU_OPT_STRING,
222 },{ 201diff --git a/qapi/char.json b/qapi/char.json
223diff --git a/qapi-schema.json b/qapi-schema.json 202index ae19dcd1ed..6de0f29bcd 100644
224index 78a00bc8..790b026d 100644 203--- a/qapi/char.json
225--- a/qapi-schema.json 204+++ b/qapi/char.json
226+++ b/qapi-schema.json 205@@ -241,6 +241,10 @@
227@@ -5004,6 +5004,10 @@
228 # 206 #
229 # @addr: socket address to listen on (server=true) 207 # @addr: socket address to listen on (server=true)
230 # or connect to (server=false) 208 # or connect to (server=false)
@@ -235,7 +213,7 @@ index 78a00bc8..790b026d 100644
235 # @tls-creds: the ID of the TLS credentials object (since 2.6) 213 # @tls-creds: the ID of the TLS credentials object (since 2.6)
236 # @server: create server socket (default: true) 214 # @server: create server socket (default: true)
237 # @wait: wait for incoming connection on server 215 # @wait: wait for incoming connection on server
238@@ -5021,6 +5025,7 @@ 216@@ -258,6 +262,7 @@
239 # Since: 1.4 217 # Since: 1.4
240 ## 218 ##
241 { 'struct': 'ChardevSocket', 'data': { 'addr' : 'SocketAddressLegacy', 219 { 'struct': 'ChardevSocket', 'data': { 'addr' : 'SocketAddressLegacy',
@@ -244,5 +222,5 @@ index 78a00bc8..790b026d 100644
244 '*server' : 'bool', 222 '*server' : 'bool',
245 '*wait' : 'bool', 223 '*wait' : 'bool',
246-- 224--
2472.11.0 2252.14.1
248 226