diff options
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.patch | 72 |
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 @@ | |||
1 | From aa3aef4cf5f4dd98f9133df085e825ff5da7dcbd Mon Sep 17 00:00:00 2001 | 1 | From 3bb3100c22eb30146a69656480bdffeef8663575 Mon Sep 17 00:00:00 2001 |
2 | From: Patrick Ohly <patrick.ohly@intel.com> | 2 | From: Alistair Francis <alistair.francis@xilinx.com> |
3 | Date: Fri, 27 Oct 2017 15:23:35 +0200 | 3 | Date: Thu, 21 Dec 2017 11:35:16 -0800 |
4 | Subject: [PATCH] chardev: connect socket to a spawned command | 4 | Subject: [PATCH] chardev: connect socket to a spawned command |
5 | 5 | ||
6 | The command is started in a shell (sh -c) with stdin connect to QEMU | 6 | The command is started in a shell (sh -c) with stdin connect to QEMU |
@@ -44,22 +44,20 @@ as simple as possible. | |||
44 | Upstream-Status: Inappropriate [embedded specific] | 44 | Upstream-Status: Inappropriate [embedded specific] |
45 | 45 | ||
46 | Signed-off-by: Patrick Ohly <patrick.ohly@intel.com> | 46 | Signed-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 | ||
54 | diff --git a/chardev/char-socket.c b/chardev/char-socket.c | 53 | diff --git a/chardev/char-socket.c b/chardev/char-socket.c |
55 | index 1ae730a4..c366a02a 100644 | 54 | index 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); |
209 | diff --git a/chardev/char.c b/chardev/char.c | 187 | diff --git a/chardev/char.c b/chardev/char.c |
210 | index 5d283b90..ccb329d4 100644 | 188 | index 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 | },{ | 201 | diff --git a/qapi/char.json b/qapi/char.json |
223 | diff --git a/qapi-schema.json b/qapi-schema.json | 202 | index ae19dcd1ed..6de0f29bcd 100644 |
224 | index 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 | -- |
247 | 2.11.0 | 225 | 2.14.1 |
248 | 226 | ||