diff mbox series

[for-3.2,02/41] glib-compat: add g_spawn_async_with_fds() fallback

Message ID 20181114123643.24091-3-marcandre.lureau@redhat.com
State New
Headers show
Series RFC: slirp: make it again a standalone project | expand

Commit Message

Marc-André Lureau Nov. 14, 2018, 12:36 p.m. UTC
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/glib-compat.h | 56 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 56 insertions(+)

Comments

Samuel Thibault Nov. 19, 2018, 10:50 p.m. UTC | #1
Marc-André Lureau, le mer. 14 nov. 2018 16:36:04 +0400, a ecrit:
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>

Reviewed-by: Samuel Thibault <samuel.thibault@ens-lyon.org>

include/glib-compat.h maintainers, may I keep this in my slirp tree, to
be pushed to master when appropriate?

Samuel

> ---
>  include/glib-compat.h | 56 +++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 56 insertions(+)
> 
> diff --git a/include/glib-compat.h b/include/glib-compat.h
> index fdf95a255d..8a078c5288 100644
> --- a/include/glib-compat.h
> +++ b/include/glib-compat.h
> @@ -83,6 +83,62 @@ static inline gboolean g_strv_contains_qemu(const gchar *const *strv,
>  }
>  #define g_strv_contains(a, b) g_strv_contains_qemu(a, b)
>  
> +#if !GLIB_CHECK_VERSION(2, 58, 0)
> +typedef struct QemuGSpawnFds {
> +    GSpawnChildSetupFunc child_setup;
> +    gpointer user_data;
> +    gint stdin_fd;
> +    gint stdout_fd;
> +    gint stderr_fd;
> +} QemuGSpawnFds;
> +
> +static inline void
> +qemu_gspawn_fds_setup(gpointer user_data)
> +{
> +    QemuGSpawnFds *q = (QemuGSpawnFds *)user_data;
> +
> +    dup2(q->stdin_fd, 0);
> +    dup2(q->stdout_fd, 1);
> +    dup2(q->stderr_fd, 2);
> +    q->child_setup(q->user_data);
> +}
> +#endif
> +
> +static inline gboolean
> +g_spawn_async_with_fds_qemu(const gchar *working_directory,
> +                            gchar **argv,
> +                            gchar **envp,
> +                            GSpawnFlags flags,
> +                            GSpawnChildSetupFunc child_setup,
> +                            gpointer user_data,
> +                            GPid *child_pid,
> +                            gint stdin_fd,
> +                            gint stdout_fd,
> +                            gint stderr_fd,
> +                            GError **error)
> +{
> +#if GLIB_CHECK_VERSION(2, 58, 0)
> +    return g_spawn_async_with_fds(working_directory, argv, envp, flags,
> +                                  child_setup, user_data,
> +                                  child_pid, stdin_fd, stdout_fd, stderr_fd,
> +                                  error);
> +#else
> +    QemuGSpawnFds setup = {
> +        .child_setup = child_setup,
> +        .user_data = user_data,
> +        .stdin_fd = stdin_fd,
> +        .stdout_fd = stdout_fd,
> +        .stderr_fd = stderr_fd,
> +    };
> +
> +    return g_spawn_async(working_directory, argv, envp, flags,
> +                         qemu_gspawn_fds_setup, &setup,
> +                         child_pid, error);
> +#endif
> +}
> +
> +#define g_spawn_async_with_fds(wd, argv, env, f, c, d, p, ifd, ofd, efd, err) \
> +    g_spawn_async_with_fds_qemu(wd, argv, env, f, c, d, p, ifd, ofd, efd, err)
>  
>  #if defined(_WIN32) && !GLIB_CHECK_VERSION(2, 50, 0)
>  /*
> -- 
> 2.19.1.708.g4ede3d42df
>
Thomas Huth Nov. 20, 2018, 6:11 a.m. UTC | #2
On 2018-11-19 23:50, Samuel Thibault wrote:
> Marc-André Lureau, le mer. 14 nov. 2018 16:36:04 +0400, a ecrit:
>> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> 
> Reviewed-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
> 
> include/glib-compat.h maintainers, may I keep this in my slirp tree, to
> be pushed to master when appropriate?

$ scripts/get_maintainer.pl -f include/glib-compat.h
get_maintainer.pl: No maintainers found [...]

... so I'd say yes, please just go ahead and queue this :-)

 Thomas

>> ---
>>  include/glib-compat.h | 56 +++++++++++++++++++++++++++++++++++++++++++
>>  1 file changed, 56 insertions(+)
>>
>> diff --git a/include/glib-compat.h b/include/glib-compat.h
>> index fdf95a255d..8a078c5288 100644
>> --- a/include/glib-compat.h
>> +++ b/include/glib-compat.h
>> @@ -83,6 +83,62 @@ static inline gboolean g_strv_contains_qemu(const gchar *const *strv,
>>  }
>>  #define g_strv_contains(a, b) g_strv_contains_qemu(a, b)
>>  
>> +#if !GLIB_CHECK_VERSION(2, 58, 0)
>> +typedef struct QemuGSpawnFds {
>> +    GSpawnChildSetupFunc child_setup;
>> +    gpointer user_data;
>> +    gint stdin_fd;
>> +    gint stdout_fd;
>> +    gint stderr_fd;
>> +} QemuGSpawnFds;
>> +
>> +static inline void
>> +qemu_gspawn_fds_setup(gpointer user_data)
>> +{
>> +    QemuGSpawnFds *q = (QemuGSpawnFds *)user_data;
>> +
>> +    dup2(q->stdin_fd, 0);
>> +    dup2(q->stdout_fd, 1);
>> +    dup2(q->stderr_fd, 2);
>> +    q->child_setup(q->user_data);
>> +}
>> +#endif
>> +
>> +static inline gboolean
>> +g_spawn_async_with_fds_qemu(const gchar *working_directory,
>> +                            gchar **argv,
>> +                            gchar **envp,
>> +                            GSpawnFlags flags,
>> +                            GSpawnChildSetupFunc child_setup,
>> +                            gpointer user_data,
>> +                            GPid *child_pid,
>> +                            gint stdin_fd,
>> +                            gint stdout_fd,
>> +                            gint stderr_fd,
>> +                            GError **error)
>> +{
>> +#if GLIB_CHECK_VERSION(2, 58, 0)
>> +    return g_spawn_async_with_fds(working_directory, argv, envp, flags,
>> +                                  child_setup, user_data,
>> +                                  child_pid, stdin_fd, stdout_fd, stderr_fd,
>> +                                  error);
>> +#else
>> +    QemuGSpawnFds setup = {
>> +        .child_setup = child_setup,
>> +        .user_data = user_data,
>> +        .stdin_fd = stdin_fd,
>> +        .stdout_fd = stdout_fd,
>> +        .stderr_fd = stderr_fd,
>> +    };
>> +
>> +    return g_spawn_async(working_directory, argv, envp, flags,
>> +                         qemu_gspawn_fds_setup, &setup,
>> +                         child_pid, error);
>> +#endif
>> +}
>> +
>> +#define g_spawn_async_with_fds(wd, argv, env, f, c, d, p, ifd, ofd, efd, err) \
>> +    g_spawn_async_with_fds_qemu(wd, argv, env, f, c, d, p, ifd, ofd, efd, err)
>>  
>>  #if defined(_WIN32) && !GLIB_CHECK_VERSION(2, 50, 0)
>>  /*
>> -- 
>> 2.19.1.708.g4ede3d42df
>>
>
diff mbox series

Patch

diff --git a/include/glib-compat.h b/include/glib-compat.h
index fdf95a255d..8a078c5288 100644
--- a/include/glib-compat.h
+++ b/include/glib-compat.h
@@ -83,6 +83,62 @@  static inline gboolean g_strv_contains_qemu(const gchar *const *strv,
 }
 #define g_strv_contains(a, b) g_strv_contains_qemu(a, b)
 
+#if !GLIB_CHECK_VERSION(2, 58, 0)
+typedef struct QemuGSpawnFds {
+    GSpawnChildSetupFunc child_setup;
+    gpointer user_data;
+    gint stdin_fd;
+    gint stdout_fd;
+    gint stderr_fd;
+} QemuGSpawnFds;
+
+static inline void
+qemu_gspawn_fds_setup(gpointer user_data)
+{
+    QemuGSpawnFds *q = (QemuGSpawnFds *)user_data;
+
+    dup2(q->stdin_fd, 0);
+    dup2(q->stdout_fd, 1);
+    dup2(q->stderr_fd, 2);
+    q->child_setup(q->user_data);
+}
+#endif
+
+static inline gboolean
+g_spawn_async_with_fds_qemu(const gchar *working_directory,
+                            gchar **argv,
+                            gchar **envp,
+                            GSpawnFlags flags,
+                            GSpawnChildSetupFunc child_setup,
+                            gpointer user_data,
+                            GPid *child_pid,
+                            gint stdin_fd,
+                            gint stdout_fd,
+                            gint stderr_fd,
+                            GError **error)
+{
+#if GLIB_CHECK_VERSION(2, 58, 0)
+    return g_spawn_async_with_fds(working_directory, argv, envp, flags,
+                                  child_setup, user_data,
+                                  child_pid, stdin_fd, stdout_fd, stderr_fd,
+                                  error);
+#else
+    QemuGSpawnFds setup = {
+        .child_setup = child_setup,
+        .user_data = user_data,
+        .stdin_fd = stdin_fd,
+        .stdout_fd = stdout_fd,
+        .stderr_fd = stderr_fd,
+    };
+
+    return g_spawn_async(working_directory, argv, envp, flags,
+                         qemu_gspawn_fds_setup, &setup,
+                         child_pid, error);
+#endif
+}
+
+#define g_spawn_async_with_fds(wd, argv, env, f, c, d, p, ifd, ofd, efd, err) \
+    g_spawn_async_with_fds_qemu(wd, argv, env, f, c, d, p, ifd, ofd, efd, err)
 
 #if defined(_WIN32) && !GLIB_CHECK_VERSION(2, 50, 0)
 /*