* [PATCH 0/2] tap: Use g_spawn_sync() and g_spawn_check_wait_status()
@ 2023-12-19 11:58 Akihiko Odaki
2023-12-19 11:58 ` [PATCH 1/2] glib-compat: Define g_spawn_check_wait_status() Akihiko Odaki
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Akihiko Odaki @ 2023-12-19 11:58 UTC (permalink / raw)
To: Jason Wang; +Cc: qemu-devel, Akihiko Odaki
g_spawn_sync() gives an informative message if it fails to execute
the script instead of reporting exiting status 1.
g_spawn_check_wait_status() also gives an message easier to understand
than the raw value returned by waitpid().
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
---
Akihiko Odaki (2):
glib-compat: Define g_spawn_check_wait_status()
tap: Use g_spawn_sync() and g_spawn_check_wait_status()
include/glib-compat.h | 2 ++
net/tap.c | 52 ++++++++++++++++++++++-----------------------------
2 files changed, 24 insertions(+), 30 deletions(-)
---
base-commit: 9c74490bff6c8886a922008d0c9ce6cae70dd17e
change-id: 20231219-glib-034a34bb05d8
Best regards,
--
Akihiko Odaki <akihiko.odaki@daynix.com>
^ permalink raw reply [flat|nested] 4+ messages in thread* [PATCH 1/2] glib-compat: Define g_spawn_check_wait_status() 2023-12-19 11:58 [PATCH 0/2] tap: Use g_spawn_sync() and g_spawn_check_wait_status() Akihiko Odaki @ 2023-12-19 11:58 ` Akihiko Odaki 2023-12-19 11:58 ` [PATCH 2/2] tap: Use g_spawn_sync() and g_spawn_check_wait_status() Akihiko Odaki 2024-03-26 6:42 ` [PATCH 0/2] " Jason Wang 2 siblings, 0 replies; 4+ messages in thread From: Akihiko Odaki @ 2023-12-19 11:58 UTC (permalink / raw) To: Jason Wang; +Cc: qemu-devel, Akihiko Odaki g_spawn_check_exit_status() is renamed to g_spawn_check_wait_status() in 2.70. Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> --- include/glib-compat.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/glib-compat.h b/include/glib-compat.h index 43a562974d80..5f76fbd28e6b 100644 --- a/include/glib-compat.h +++ b/include/glib-compat.h @@ -68,6 +68,8 @@ * without generating warnings. */ +#define g_spawn_check_wait_status g_spawn_check_exit_status + /* * g_memdup2_qemu: * @mem: (nullable): the memory to copy. -- 2.43.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 2/2] tap: Use g_spawn_sync() and g_spawn_check_wait_status() 2023-12-19 11:58 [PATCH 0/2] tap: Use g_spawn_sync() and g_spawn_check_wait_status() Akihiko Odaki 2023-12-19 11:58 ` [PATCH 1/2] glib-compat: Define g_spawn_check_wait_status() Akihiko Odaki @ 2023-12-19 11:58 ` Akihiko Odaki 2024-03-26 6:42 ` [PATCH 0/2] " Jason Wang 2 siblings, 0 replies; 4+ messages in thread From: Akihiko Odaki @ 2023-12-19 11:58 UTC (permalink / raw) To: Jason Wang; +Cc: qemu-devel, Akihiko Odaki g_spawn_sync() gives an informative message if it fails to execute the script instead of reporting exiting status 1. g_spawn_check_wait_status() also gives an message easier to understand than the raw value returned by waitpid(). Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> --- net/tap.c | 52 ++++++++++++++++++++++------------------------------ 1 file changed, 22 insertions(+), 30 deletions(-) diff --git a/net/tap.c b/net/tap.c index c23d0323c2ae..74f718613009 100644 --- a/net/tap.c +++ b/net/tap.c @@ -444,44 +444,36 @@ static TAPState *net_tap_fd_init(NetClientState *peer, return s; } +static void close_fds_except(gpointer data) +{ + int open_max = sysconf(_SC_OPEN_MAX), i; + + for (i = 3; i < open_max; i++) { + if (i != (intptr_t)data) { + close(i); + } + } +} + static void launch_script(const char *setup_script, const char *ifname, int fd, Error **errp) { - int pid, status; - char *args[3]; - char **parg; + gint status; + gchar *argv[] = { (gchar *)setup_script, (gchar *)ifname, NULL }; + g_autoptr(GError) error = NULL; /* try to launch network script */ - pid = fork(); - if (pid < 0) { - error_setg_errno(errp, errno, "could not launch network script %s", - setup_script); + if (!g_spawn_sync(NULL, argv, NULL, G_SPAWN_LEAVE_DESCRIPTORS_OPEN, + close_fds_except, (gpointer)(intptr_t)fd, NULL, NULL, + &status, &error)) { + error_setg(errp, "could not launch network script %s: %s", + setup_script, error->message); return; } - if (pid == 0) { - int open_max = sysconf(_SC_OPEN_MAX), i; - for (i = 3; i < open_max; i++) { - if (i != fd) { - close(i); - } - } - parg = args; - *parg++ = (char *)setup_script; - *parg++ = (char *)ifname; - *parg = NULL; - execv(setup_script, args); - _exit(1); - } else { - while (waitpid(pid, &status, 0) != pid) { - /* loop */ - } - - if (WIFEXITED(status) && WEXITSTATUS(status) == 0) { - return; - } - error_setg(errp, "network script %s failed with status %d", - setup_script, status); + if (!g_spawn_check_wait_status(status, &error)) { + error_setg(errp, "network script %s failed: %s", + setup_script, error->message); } } -- 2.43.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 0/2] tap: Use g_spawn_sync() and g_spawn_check_wait_status() 2023-12-19 11:58 [PATCH 0/2] tap: Use g_spawn_sync() and g_spawn_check_wait_status() Akihiko Odaki 2023-12-19 11:58 ` [PATCH 1/2] glib-compat: Define g_spawn_check_wait_status() Akihiko Odaki 2023-12-19 11:58 ` [PATCH 2/2] tap: Use g_spawn_sync() and g_spawn_check_wait_status() Akihiko Odaki @ 2024-03-26 6:42 ` Jason Wang 2 siblings, 0 replies; 4+ messages in thread From: Jason Wang @ 2024-03-26 6:42 UTC (permalink / raw) To: Akihiko Odaki; +Cc: qemu-devel On Tue, Dec 19, 2023 at 7:59 PM Akihiko Odaki <akihiko.odaki@daynix.com> wrote: > > g_spawn_sync() gives an informative message if it fails to execute > the script instead of reporting exiting status 1. > > g_spawn_check_wait_status() also gives an message easier to understand > than the raw value returned by waitpid(). > > Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> > --- > Akihiko Odaki (2): > glib-compat: Define g_spawn_check_wait_status() > tap: Use g_spawn_sync() and g_spawn_check_wait_status() > > include/glib-compat.h | 2 ++ > net/tap.c | 52 ++++++++++++++++++++++----------------------------- > 2 files changed, 24 insertions(+), 30 deletions(-) > --- > base-commit: 9c74490bff6c8886a922008d0c9ce6cae70dd17e > change-id: 20231219-glib-034a34bb05d8 > > Best regards, > -- > Akihiko Odaki <akihiko.odaki@daynix.com> I've queued this for 9.1 Thanks > ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2024-03-26 6:42 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2023-12-19 11:58 [PATCH 0/2] tap: Use g_spawn_sync() and g_spawn_check_wait_status() Akihiko Odaki 2023-12-19 11:58 ` [PATCH 1/2] glib-compat: Define g_spawn_check_wait_status() Akihiko Odaki 2023-12-19 11:58 ` [PATCH 2/2] tap: Use g_spawn_sync() and g_spawn_check_wait_status() Akihiko Odaki 2024-03-26 6:42 ` [PATCH 0/2] " Jason Wang
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).