summaryrefslogtreecommitdiff
path: root/multimedia/vlc/patches/patch-as
blob: d5c7feb56f10d4b93d48482401a0e2d68179cc76 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
$NetBSD: patch-as,v 1.1 2011/01/24 18:54:04 drochner Exp $

--- modules/misc/inhibit/xscreensaver.c~	2010-04-13 09:22:27.000000000 +0900
+++ modules/misc/inhibit/xscreensaver.c	2011-01-08 23:03:09.000000000 +0900
@@ -39,7 +39,9 @@
 #include <sys/wait.h>
 #include <fcntl.h>
 #include <signal.h>
+#ifdef _POSIX_SPAWN 
 #include <spawn.h>
+#endif
 
 /*****************************************************************************
  * Local prototypes
@@ -53,12 +55,16 @@
 struct vlc_inhibit_sys
 {
     vlc_timer_t timer;
+#ifdef _POSIX_SPAWN
     posix_spawn_file_actions_t actions;
     posix_spawnattr_t attr;
     int nullfd;
+#endif
 };
 
+#ifdef _POSIX_SPAWN 
 extern char **environ;
+#endif
 
 /*****************************************************************************
  * Module descriptor
@@ -88,6 +94,7 @@
     }
     p_ih->inhibit = Inhibit;
 
+#ifdef _POSIX_SPAWN 
     int fd = vlc_open ("/dev/null", O_WRONLY);
     posix_spawn_file_actions_init (&p_sys->actions);
     if (fd != -1)
@@ -103,6 +110,7 @@
     sigemptyset (&set);
     posix_spawnattr_setsigmask (&p_sys->attr, &set);
    
+#endif
     return VLC_SUCCESS;
 }
 
@@ -115,10 +123,12 @@
     vlc_inhibit_sys_t *p_sys = p_ih->p_sys;
 
     vlc_timer_destroy( p_sys->timer );
+#ifdef _POSIX_SPAWN
     if (p_sys->nullfd != -1)
         close (p_sys->nullfd);
     posix_spawnattr_destroy (&p_sys->attr);
     posix_spawn_file_actions_destroy (&p_sys->actions);
+#endif
     free( p_sys );
 }
 
@@ -131,15 +141,49 @@
 /*****************************************************************************
  * Execute: Spawns a process using execv()
  *****************************************************************************/
+#ifdef _POSIX_SPAWN 
 static void Execute (vlc_inhibit_t *p_ih, const char *const *argv)
+# else
+static void Execute (vlc_inhibit_t *p_ih, const char *const *ppsz_args)
+#endif
 {
+#ifdef _POSIX_SPAWN
     vlc_inhibit_sys_t *p_sys = p_ih->p_sys;
     pid_t pid;
 
     if (posix_spawnp (&pid, argv[0], &p_sys->actions, &p_sys->attr,
                       (char **)argv, environ) == 0)
+#else
+      pid_t pid = fork();
+      switch ( pid )
+#endif
     {
+#ifdef _POSIX_SPAWN
         while (waitpid (pid, NULL, 0) != pid);
+#else
+        case 0:     /* we're the child */
+        {
+            sigset_t set;
+            sigemptyset (&set);
+            pthread_sigmask (SIG_SETMASK, &set, NULL);
+
+            /* We don't want output */
+            if( ( freopen( "/dev/null", "w", stdout ) != NULL )
+             && ( freopen( "/dev/null", "w", stderr ) != NULL ) )
+                execv( ppsz_args[0] , (char *const *)ppsz_args );
+            /* If the file we want to execute doesn't exist we exit() */
+            exit( EXIT_FAILURE );
+        }
+        case -1:    /* we're the error */
+            msg_Dbg( p_ih, "Couldn't fork() while launching %s",
+                     ppsz_args[0] );
+            break;
+        default:    /* we're the parent */
+            /* Wait for the child to exit.
+             * We will not deadlock because we ran "/bin/sh &" */
+            while( waitpid( pid, NULL, 0 ) != pid);
+            break;
+#endif
     }
 }