[vlc-devel] [PATCH 6/6] decomp: use vlc_spawn()
RĂ©mi Denis-Courmont
remi at remlab.net
Sat Sep 19 12:29:28 CEST 2020
---
modules/stream_filter/decomp.c | 62 ++++++++--------------------------
1 file changed, 14 insertions(+), 48 deletions(-)
diff --git a/modules/stream_filter/decomp.c b/modules/stream_filter/decomp.c
index 330f3822f2..ebd3929545 100644
--- a/modules/stream_filter/decomp.c
+++ b/modules/stream_filter/decomp.c
@@ -27,17 +27,10 @@
#include <vlc_stream.h>
#include <vlc_network.h>
#include <vlc_fs.h>
-#include <assert.h>
+#include <vlc_spawn.h>
#include <unistd.h>
#include <errno.h>
-#ifndef _POSIX_SPAWN
-# define _POSIX_SPAWN (-1)
-#endif
#include <fcntl.h>
-#if (_POSIX_SPAWN >= 0)
-# include <spawn.h>
-#endif
-#include <sys/wait.h>
#include <sys/ioctl.h>
#if defined (__linux__) && defined (HAVE_VMSPLICE)
# include <sys/uio.h>
@@ -274,47 +267,23 @@ static int Open (stream_t *stream, const char *path)
int uncomp[2];
if (vlc_pipe (uncomp) == 0)
{
+ int fdv[] = { comp[0], uncomp[1], 2, -1 };
+ const char *argv[] = { path, NULL };
+
p_sys->read_fd = uncomp[0];
-#if (_POSIX_SPAWN >= 0)
- posix_spawn_file_actions_t actions;
- if (posix_spawn_file_actions_init (&actions) == 0)
+ if (vlc_spawnp(&p_sys->pid, path, fdv, argv) == 0)
{
- char *const argv[] = { (char *)path, NULL };
-
- if (!posix_spawn_file_actions_adddup2 (&actions, comp[0], 0)
- && !posix_spawn_file_actions_adddup2 (&actions, uncomp[1], 1)
- && !posix_spawnp (&p_sys->pid, path, &actions, NULL, argv,
- environ))
- {
- if (vlc_clone (&p_sys->thread, Thread, stream,
- VLC_THREAD_PRIORITY_INPUT) == 0)
- ret = VLC_SUCCESS;
- }
- else
- {
- msg_Err (stream, "cannot execute %s", path);
- p_sys->pid = -1;
- }
- posix_spawn_file_actions_destroy (&actions);
+ if (vlc_clone(&p_sys->thread, Thread, stream,
+ VLC_THREAD_PRIORITY_INPUT) == 0)
+ ret = VLC_SUCCESS;
}
-#else /* _POSIX_SPAWN */
- switch (p_sys->pid = fork ())
+ else
{
- case -1:
- msg_Err (stream, "cannot fork: %s", vlc_strerror_c(errno));
- break;
- case 0:
- dup2 (comp[0], 0);
- dup2 (uncomp[1], 1);
- execlp (path, path, (const char *)NULL);
- exit (1); /* if we get, execlp() failed! */
- default:
- if (vlc_clone (&p_sys->thread, Thread, stream,
- VLC_THREAD_PRIORITY_INPUT) == 0)
- ret = VLC_SUCCESS;
+ msg_Err (stream, "cannot execute %s", path);
+ p_sys->pid = -1;
}
-#endif /* _POSIX_SPAWN < 0 */
+
vlc_close (uncomp[1]);
if (ret != VLC_SUCCESS)
vlc_close (uncomp[0]);
@@ -327,7 +296,7 @@ static int Open (stream_t *stream, const char *path)
if (ret != VLC_SUCCESS)
{
if (p_sys->pid != -1)
- while (waitpid (p_sys->pid, &(int){ 0 }, 0) == -1);
+ vlc_waitpid(p_sys->pid);
free (p_sys);
return ret;
}
@@ -346,7 +315,6 @@ static void Close (vlc_object_t *obj)
{
stream_t *stream = (stream_t *)obj;
stream_sys_t *p_sys = stream->p_sys;
- int status;
vlc_cancel (p_sys->thread);
vlc_close (p_sys->read_fd);
@@ -356,9 +324,7 @@ static void Close (vlc_object_t *obj)
vlc_close (p_sys->write_fd);
msg_Dbg (obj, "waiting for PID %u", (unsigned)p_sys->pid);
- while (waitpid (p_sys->pid, &status, 0) == -1);
- msg_Dbg (obj, "exit status %d", status);
-
+ msg_Dbg (obj, "exit status %d", vlc_waitpid(p_sys->pid));
free (p_sys);
}
--
2.28.0
More information about the vlc-devel
mailing list