]> git.sesse.net Git - vlc/commitdiff
decomp: use plain fork/exec if POSIX spawn is missing
authorRémi Denis-Courmont <rdenis@simphalempin.com>
Sun, 21 Dec 2008 13:35:55 +0000 (15:35 +0200)
committerRémi Denis-Courmont <rdenis@simphalempin.com>
Sun, 21 Dec 2008 13:36:24 +0000 (15:36 +0200)
modules/stream_filter/decomp.c

index f083fc7f9842df47bfca017ec26abdab7a63ec46..da86731ecea2bd1091e0d0fe5bc8bb13e002def3 100644 (file)
@@ -27,6 +27,9 @@
 #include <vlc_stream.h>
 #include <vlc_network.h>
 #include <unistd.h>
+#ifndef _POSIX_SPAWN
+# define _POSIX_SPAWN (-1)
+#endif
 #include <fcntl.h>
 #include <spawn.h>
 #include <sys/wait.h>
@@ -268,6 +271,7 @@ static int Open (stream_t *stream, const char *path)
             cloexec (uncomp[0]);
             p_sys->read_fd = uncomp[0];
 
+#if (_POSIX_SPAWN >= 0)
             posix_spawn_file_actions_t actions;
             if (posix_spawn_file_actions_init (&actions) == 0)
             {
@@ -291,6 +295,25 @@ static int Open (stream_t *stream, const char *path)
                 }
                 posix_spawn_file_actions_destroy (&actions);
             }
+#else /* _POSIX_SPAWN */
+            switch (p_sys->pid = fork ())
+            {
+                case -1:
+                    msg_Err (stream, "Cannot fork (%m)");
+                    break;
+                case 0:
+                    dup2 (comp[0], 0);
+                    close (comp[0]);
+                    dup2 (uncomp[1], 1);
+                    close (uncomp[1]);
+                    execlp (path, path, (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;
+            }
+#endif /* _POSIX_SPAWN < 0 */
             close (uncomp[1]);
             if (ret != VLC_SUCCESS)
                 close (uncomp[0]);