From: "Marc-André Lureau" <marcandre.lureau@redhat.com>
To: qemu-devel@nongnu.org
Cc: samuel.thibault@ens-lyon.org, rjones@redhat.com,
stefanha@redhat.com, renzo@cs.unibo.it,
"Marc-André Lureau" <marcandre.lureau@redhat.com>
Subject: [Qemu-devel] [PATCH for-3.2 03/41] slirp: simplify fork_exec()
Date: Wed, 14 Nov 2018 16:36:05 +0400 [thread overview]
Message-ID: <20181114123643.24091-4-marcandre.lureau@redhat.com> (raw)
In-Reply-To: <20181114123643.24091-1-marcandre.lureau@redhat.com>
Use g_spawn_async_with_fds() to setup the child.
GSpawn handles reaping the child, and closing parent file descriptors.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
slirp/misc.c | 75 +++++++++++++++++++++++++---------------------------
1 file changed, 36 insertions(+), 39 deletions(-)
diff --git a/slirp/misc.c b/slirp/misc.c
index 7362e14339..7972b9b05b 100644
--- a/slirp/misc.c
+++ b/slirp/misc.c
@@ -129,56 +129,53 @@ err:
return -1;
}
+static void
+fork_exec_child_setup(gpointer data)
+{
+ setsid();
+}
+
int
fork_exec(struct socket *so, const char *ex)
{
- char **argv;
- int opt, c, sp[2];
- pid_t pid;
+ GError *err = NULL;
+ char **argv;
+ int opt, sp[2];
- DEBUG_CALL("fork_exec");
- DEBUG_ARG("so = %p", so);
- DEBUG_ARG("ex = %p", ex);
+ DEBUG_CALL("fork_exec");
+ DEBUG_ARG("so = %p", so);
+ DEBUG_ARG("ex = %p", ex);
if (slirp_socketpair_with_oob(sp) < 0) {
return 0;
}
- pid = fork();
- switch(pid) {
- case -1:
- error_report("Error: fork failed: %s", strerror(errno));
- closesocket(sp[0]);
- closesocket(sp[1]);
- return 0;
-
- case 0:
- setsid();
- dup2(sp[1], 0);
- dup2(sp[1], 1);
- dup2(sp[1], 2);
- for (c = getdtablesize() - 1; c >= 3; c--)
- close(c);
+ argv = g_strsplit(ex, " ", -1);
+ g_spawn_async_with_fds(NULL /* cwd */,
+ argv,
+ NULL /* env */,
+ G_SPAWN_SEARCH_PATH,
+ fork_exec_child_setup, NULL /* data */,
+ NULL /* child_pid */,
+ sp[1], sp[1], sp[1],
+ &err);
+ g_strfreev(argv);
- argv = g_strsplit(ex, " ", -1);
- execvp(argv[0], (char **)argv);
-
- /* Ooops, failed, let's tell the user why */
- fprintf(stderr, "Error: execvp of %s failed: %s\n",
- argv[0], strerror(errno));
- close(0); close(1); close(2); /* XXX */
- exit(1);
+ if (err) {
+ error_report("%s", err->message);
+ g_error_free(err);
+ closesocket(sp[0]);
+ closesocket(sp[1]);
+ return 0;
+ }
- default:
- so->s = sp[0];
- closesocket(sp[1]);
- qemu_add_child_watch(pid);
- socket_set_fast_reuse(so->s);
- opt = 1;
- qemu_setsockopt(so->s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(int));
- qemu_set_nonblock(so->s);
- return 1;
- }
+ so->s = sp[0];
+ closesocket(sp[1]);
+ socket_set_fast_reuse(so->s);
+ opt = 1;
+ qemu_setsockopt(so->s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(int));
+ qemu_set_nonblock(so->s);
+ return 1;
}
#endif
--
2.19.1.708.g4ede3d42df
next prev parent reply other threads:[~2018-11-14 12:37 UTC|newest]
Thread overview: 137+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-11-14 12:36 [Qemu-devel] [PATCH for-3.2 00/41] RFC: slirp: make it again a standalone project Marc-André Lureau
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 01/41] slirp: move socket pair creation in helper function Marc-André Lureau
2018-11-19 22:46 ` Samuel Thibault
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 02/41] glib-compat: add g_spawn_async_with_fds() fallback Marc-André Lureau
2018-11-19 22:50 ` Samuel Thibault
2018-11-20 6:11 ` Thomas Huth
2018-11-14 12:36 ` Marc-André Lureau [this message]
2018-11-14 14:22 ` [Qemu-devel] [PATCH for-3.2 03/41] slirp: simplify fork_exec() Daniel P. Berrangé
2018-11-19 22:59 ` Samuel Thibault
2018-11-19 23:20 ` Eric Blake
2018-11-19 22:56 ` Samuel Thibault
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 04/41] slirp: remove unused M_TRAILINGSPACE Marc-André Lureau
2018-11-14 13:32 ` Daniel P. Berrangé
2018-11-19 23:01 ` Samuel Thibault
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 05/41] slirp: use a callback structure to interface with qemu Marc-André Lureau
2018-11-14 13:10 ` Philippe Mathieu-Daudé
2018-11-19 23:09 ` Samuel Thibault
2018-11-14 14:30 ` Stefan Hajnoczi
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 06/41] slirp: add a callback for qemu_chr_fe_write_all() Marc-André Lureau
2018-11-15 13:12 ` Paolo Bonzini
2019-01-15 19:22 ` Marc-André Lureau
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 07/41] slirp: add clock_get_ns() callback Marc-André Lureau
2018-11-15 12:54 ` Paolo Bonzini
2018-11-19 23:15 ` Samuel Thibault
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 08/41] slirp: add callbacks for timer Marc-André Lureau
2018-11-15 12:56 ` Paolo Bonzini
2019-01-15 19:21 ` Marc-André Lureau
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 09/41] slirp: add a set_nonblock() callback Marc-André Lureau
2018-11-15 13:03 ` Paolo Bonzini
2018-11-21 21:02 ` Marc-André Lureau
2018-11-22 13:09 ` Paolo Bonzini
2019-01-15 19:22 ` Marc-André Lureau
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 10/41] slirp: remove PROBE_CONN dead-code Marc-André Lureau
2018-11-14 13:12 ` Philippe Mathieu-Daudé
2018-11-19 23:17 ` Samuel Thibault
2018-11-14 13:33 ` Daniel P. Berrangé
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 11/41] slirp: remove FULL_BOLT Marc-André Lureau
2018-11-14 13:46 ` Daniel P. Berrangé
2018-11-19 23:18 ` Samuel Thibault
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 12/41] slirp: remove the disabled readv()/writev() code path Marc-André Lureau
2018-11-14 13:46 ` Daniel P. Berrangé
2018-11-19 23:19 ` Samuel Thibault
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 13/41] slirp: remove HAVE_SYS_SIGNAL_H Marc-André Lureau
2018-11-14 13:47 ` Daniel P. Berrangé
2018-11-20 0:58 ` Samuel Thibault
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 14/41] slirp: remove unused HAVE_SYS_BITYPES_H Marc-André Lureau
2018-11-14 13:47 ` Daniel P. Berrangé
2018-11-20 0:59 ` Samuel Thibault
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 15/41] slirp: remove NO_UNIX_SOCKETS Marc-André Lureau
2018-11-14 13:48 ` Daniel P. Berrangé
2018-11-20 0:59 ` Samuel Thibault
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 16/41] slirp: remove unused HAVE_SYS_STROPTS_H Marc-André Lureau
2018-11-14 13:49 ` Daniel P. Berrangé
2018-11-20 1:00 ` Samuel Thibault
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 17/41] slirp: remove unused HAVE_ARPA_INET_H Marc-André Lureau
2018-11-14 13:50 ` Daniel P. Berrangé
2018-11-20 1:01 ` Samuel Thibault
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 18/41] slirp: remove unused HAVE_SYS_WAIT_H Marc-André Lureau
2018-11-14 13:50 ` Daniel P. Berrangé
2018-11-20 1:01 ` Samuel Thibault
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 19/41] slirp: remove unused HAVE_SYS_SELECT_H Marc-André Lureau
2018-11-14 13:51 ` Daniel P. Berrangé
2018-11-20 1:02 ` Samuel Thibault
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 20/41] slirp: remove HAVE_SYS_IOCTL_H Marc-André Lureau
2018-11-14 13:51 ` Daniel P. Berrangé
2018-11-20 1:03 ` Samuel Thibault
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 21/41] slirp: remove HAVE_SYS_FILIO_H Marc-André Lureau
2018-11-14 13:52 ` Daniel P. Berrangé
2018-11-20 1:04 ` Samuel Thibault
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 22/41] slirp: remove unused DECLARE_IOVEC Marc-André Lureau
2018-11-14 13:53 ` Daniel P. Berrangé
2018-11-20 1:05 ` Samuel Thibault
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 23/41] slirp: remove unused HAVE_INET_ATON Marc-André Lureau
2018-11-14 13:54 ` Daniel P. Berrangé
2018-11-20 1:05 ` Samuel Thibault
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 24/41] slirp: replace HOST_WORDS_BIGENDIAN with glib equivalent Marc-André Lureau
2018-11-14 13:14 ` Philippe Mathieu-Daudé
2018-11-20 1:07 ` Samuel Thibault
2018-11-14 13:32 ` Daniel P. Berrangé
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 25/41] slirp: replace SIZEOF_CHAR_P " Marc-André Lureau
2018-11-14 13:14 ` Philippe Mathieu-Daudé
2018-11-20 1:08 ` Samuel Thibault
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 26/41] slirp: replace compile time DO_KEEPALIVE Marc-André Lureau
2018-11-20 1:09 ` Samuel Thibault
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 27/41] slirp: remove unused global slirp_instance Marc-André Lureau
2018-11-14 13:55 ` Daniel P. Berrangé
2018-11-20 1:10 ` Samuel Thibault
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 28/41] slirp: replace error_report() with g_critical() Marc-André Lureau
2018-11-20 1:14 ` Samuel Thibault
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 29/41] slirp: improve a bit the debug macros Marc-André Lureau
2018-11-14 14:04 ` Daniel P. Berrangé
2018-11-14 20:51 ` Marc-André Lureau
2018-11-20 1:19 ` Samuel Thibault
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 30/41] slirp: replace trace functions with DEBUG calls Marc-André Lureau
2018-11-20 1:21 ` Samuel Thibault
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 31/41] slirp: add a callback to log guest errors Marc-André Lureau
2018-11-20 1:27 ` Samuel Thibault
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 32/41] slirp: remove unused sbflush() Marc-André Lureau
2018-11-14 14:05 ` Daniel P. Berrangé
2018-11-20 1:28 ` Samuel Thibault
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 33/41] slirp: replace qemu_notify_event() with a callback Marc-André Lureau
2018-11-20 1:32 ` Samuel Thibault
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 34/41] slirp: remove #if notdef dead code Marc-André Lureau
2018-11-14 14:07 ` Daniel P. Berrangé
2018-11-20 1:28 ` Samuel Thibault
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 35/41] slirp: NULL is defined by glib (at least) Marc-André Lureau
2018-11-14 14:11 ` Daniel P. Berrangé
2018-11-20 1:33 ` Samuel Thibault
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 36/41] slirp: remove dead TCP_ACK_HACK code Marc-André Lureau
2018-11-14 14:12 ` Daniel P. Berrangé
2018-11-20 1:34 ` Samuel Thibault
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 37/41] slirp: replace ARRAY_SIZE with G_N_ELEMENTS Marc-André Lureau
2018-11-14 13:17 ` Philippe Mathieu-Daudé
2018-11-20 1:35 ` Samuel Thibault
2018-11-14 14:15 ` Daniel P. Berrangé
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 38/41] net: do not depend on slirp internals Marc-André Lureau
2018-11-14 13:21 ` Philippe Mathieu-Daudé
2018-11-20 1:37 ` Samuel Thibault
2018-11-15 13:19 ` Paolo Bonzini
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 39/41] slirp: move QEMU state saving to a separate unit Marc-André Lureau
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 40/41] slirp: replace remaining QEMU dependency Marc-André Lureau
2018-11-14 12:36 ` [Qemu-devel] [PATCH for-3.2 41/41] build-sys: add a basic meson build Marc-André Lureau
2018-11-14 12:59 ` [Qemu-devel] [PATCH for-3.2 00/41] RFC: slirp: make it again a standalone project Markus Armbruster
2018-11-14 13:20 ` Richard W.M. Jones
2018-11-14 13:33 ` Thomas Huth
2018-11-14 14:46 ` Markus Armbruster
2018-11-14 15:10 ` Dr. David Alan Gilbert
2018-11-14 15:14 ` Richard W.M. Jones
2018-11-14 16:52 ` Thomas Huth
2018-11-14 17:51 ` Markus Armbruster
2018-11-14 18:14 ` Dr. David Alan Gilbert
2018-11-14 13:45 ` Daniel P. Berrangé
2018-11-15 16:49 ` Giuseppe Scrivano
2018-11-16 5:09 ` Akihiro Suda
2018-11-14 14:26 ` Stefan Hajnoczi
2018-11-14 14:30 ` Daniel P. Berrangé
2018-11-14 15:26 ` Philippe Mathieu-Daudé
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20181114123643.24091-4-marcandre.lureau@redhat.com \
--to=marcandre.lureau@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=renzo@cs.unibo.it \
--cc=rjones@redhat.com \
--cc=samuel.thibault@ens-lyon.org \
--cc=stefanha@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).