111 lines
3.1 KiB
Plaintext
111 lines
3.1 KiB
Plaintext
$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
|
|
}
|
|
}
|
|
|