$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 #include #include +#ifdef _POSIX_SPAWN #include +#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 } }