X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fvlc.c;h=94709d22c7551dc61aa8d0d3672a91b2b6a3d923;hb=3ea2708daa0caa8419e9a3d1bcd967d09f445ab8;hp=7fe7bf7d268985b4bc174f54628bfe2e395fcccc;hpb=f7705ea7d627555a29e88a63a6a0d5c65e6836a0;p=vlc diff --git a/src/vlc.c b/src/vlc.c index 7fe7bf7d26..94709d22c7 100644 --- a/src/vlc.c +++ b/src/vlc.c @@ -32,6 +32,10 @@ #include /* putenv(), strtol(), */ #include +/* Explicit HACK */ +extern void LocaleFree (const char *); +extern char *FromLocale (const char *); + /***************************************************************************** * Local prototypes. @@ -89,7 +93,7 @@ int main( int i_argc, char *ppsz_argv[] ) i_ret = VLC_Create(); if( i_ret < 0 ) { - return i_ret; + return -i_ret; } #if !defined(WIN32) && !defined(UNDER_CE) @@ -97,24 +101,23 @@ int main( int i_argc, char *ppsz_argv[] ) * and force an unclean shutdown if they are triggered again 2+ seconds * later. We have to handle SIGTERM cleanly because of daemon mode. * Note that we set the signals after the vlc_create call. */ - static const int sigs[] = { SIGINT, SIGHUP, SIGQUIT, SIGTERM }; - /* Ignored signals */ - static const int ignored[] = { SIGALRM, SIGPIPE }; + static const int exitsigs[] = { SIGINT, SIGHUP, SIGQUIT, SIGTERM }; + static const int dummysigs[] = { SIGALRM, SIGPIPE, SIGCHLD }; sigset_t set; pthread_t sigth; sigemptyset (&set); - for (unsigned i = 0; i < sizeof (sigs) / sizeof (sigs[0]); i++) - sigaddset (&set, sigs[i]); - for (unsigned i = 0; i < sizeof (ignored) / sizeof (ignored[0]); i++) - sigaddset (&set, ignored[i]); + for (unsigned i = 0; i < sizeof (exitsigs) / sizeof (exitsigs[0]); i++) + sigaddset (&set, exitsigs[i]); + for (unsigned i = 0; i < sizeof (dummysigs) / sizeof (dummysigs[0]); i++) + sigaddset (&set, dummysigs[i]); /* Block all these signals */ pthread_sigmask (SIG_BLOCK, &set, NULL); - for (unsigned i = 0; i < sizeof (ignored) / sizeof (ignored[0]); i++) - sigdelset (&set, ignored[i]); + for (unsigned i = 0; i < sizeof (dummysigs) / sizeof (dummysigs[0]); i++) + sigdelset (&set, dummysigs[i]); pthread_create (&sigth, NULL, SigHandler, &set); #endif @@ -128,7 +131,7 @@ int main( int i_argc, char *ppsz_argv[] ) int si = { 0 }; __wgetmainargs(&i_wargc, &wargv, &wenvp, 0, &si); - for( i = 1; i < i_wargc; i++ ) + for( i = 0; i < i_wargc; i++ ) { int len = WideCharToMultiByte(CP_UTF8, 0, wargv[i], -1, NULL, 0, NULL, NULL); if( len > 0 ) @@ -143,7 +146,7 @@ int main( int i_argc, char *ppsz_argv[] ) else { /* failed!, quit */ - return -1; + return 1; } } else @@ -154,18 +157,24 @@ int main( int i_argc, char *ppsz_argv[] ) else { /* failed!, quit */ - return -1; + return 1; } } } + else #endif + { + for (int i = 0; i < i_argc; i++) + if ((ppsz_argv[i] = FromLocale (ppsz_argv[i])) == NULL) + return 1; // BOOM! + } /* Initialize libvlc */ i_ret = VLC_Init( 0, i_argc, ppsz_argv ); if( i_ret < 0 ) { VLC_Destroy( 0 ); - return i_ret == VLC_EEXITSUCCESS ? 0 : i_ret; + return i_ret == VLC_EEXITSUCCESS ? 0 : -i_ret; } i_ret = VLC_AddIntf( 0, NULL, VLC_TRUE, VLC_TRUE ); @@ -178,6 +187,9 @@ int main( int i_argc, char *ppsz_argv[] ) /* Destroy the libvlc structure */ VLC_Destroy( 0 ); + for (int i = 0; i < i_argc; i++) + LocaleFree (ppsz_argv[i]); + #if !defined(WIN32) && !defined(UNDER_CE) pthread_cancel (sigth); # ifdef __APPLE__ @@ -189,7 +201,7 @@ int main( int i_argc, char *ppsz_argv[] ) pthread_join (sigth, NULL); #endif - return i_ret; + return -i_ret; } #if !defined(WIN32) && !defined(UNDER_CE) @@ -203,12 +215,6 @@ static void *SigHandler (void *data) { const sigset_t *set = (sigset_t *)data; time_t abort_time = 0; - vlc_bool_t b_die = VLC_FALSE; - -#ifdef __APPLE__ - /* We really prefer the "force quit" menu item to act immediately */ - b_die = VLC_TRUE; -#endif for (;;) { @@ -226,10 +232,10 @@ static void *SigHandler (void *data) * signals to a libvlc structure having been destroyed */ pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &state); - if (!b_die) + if (abort_time == 0) { - b_die = VLC_TRUE; - abort_time = time (NULL); + time (&abort_time); + abort_time += 2; fprintf (stderr, "signal %d received, terminating vlc - do it " "again in case it gets stuck\n", i_signal); @@ -237,9 +243,10 @@ static void *SigHandler (void *data) /* Acknowledge the signal received */ Kill (); } - else if( time( NULL ) > abort_time + 2 ) + else + if (time (NULL) <= abort_time) { - /* If user asks again 1 or 2 seconds later, die badly */ + /* If user asks again more than 2 seconds later, die badly */ pthread_sigmask (SIG_UNBLOCK, set, NULL); fprintf (stderr, "user insisted too much, dying badly\n"); abort (); @@ -250,18 +257,15 @@ static void *SigHandler (void *data) } -#include +static void KillOnce (void) +{ + VLC_Die (0); +} + static void Kill (void) { - static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; - static bool killed = false;; - pthread_mutex_lock (&lock); - if (!killed) - { - VLC_Die (0); - killed = true; - } - pthread_mutex_unlock (&lock); + static pthread_once_t once = PTHREAD_ONCE_INIT; + pthread_once (&once, KillOnce); } #endif