X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fvlc.c;h=394c4b0a0ebd5627f83bda0c3d900d9791265659;hb=651e249197e50e39b02c011d77f0e0f1373ba590;hp=c884610acb7e4070184e6767f06b29af4b4dab16;hpb=d10ea719a3b2a41c372e4557d5cd0c6b863617a8;p=vlc diff --git a/src/vlc.c b/src/vlc.c index c884610acb..394c4b0a0e 100644 --- a/src/vlc.c +++ b/src/vlc.c @@ -27,10 +27,17 @@ #include "config.h" +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + #include #include #include #include +#ifdef __GLIBC__ +#include +#endif /* Explicit HACK */ @@ -59,10 +66,24 @@ static void *SigHandler (void *set); /***************************************************************************** * main: parse command line, start interface and spawn threads. *****************************************************************************/ -int main( int i_argc, char *ppsz_argv[] ) +int main( int i_argc, const char *ppsz_argv[] ) { int i_ret; +# ifdef __GLIBC__ + if (dlsym (RTLD_NEXT, "inet6_rth_add") && !dlsym (RTLD_NEXT, "qsort_r")) + { + /* Way too many Linux users have glibc 2.5-2.7 that keeps crashing + * inside its non-thread-safe dcgettext(). */ + /* Hopefully glibc 2.8 will eventually work, not sure though */ + fprintf (stderr, +"***************************************************\n" +"*** glibc version with broken libintl detected. ***\n" +"*** Messages localization will be disabled. ***\n" +"***************************************************\n"); + setenv ("LC_MESSAGES", "C", 1); + } +# endif setlocale (LC_ALL, ""); #ifndef __APPLE__ @@ -71,19 +92,16 @@ int main( int i_argc, char *ppsz_argv[] ) #endif #ifdef HAVE_PUTENV -# ifdef DEBUG +# ifndef NDEBUG /* Activate malloc checking routines to detect heap corruptions. */ putenv( (char*)"MALLOC_CHECK_=2" ); +# ifdef __APPLE__ + putenv( (char*)"MallocErrorAbort=crash_my_baby_crash" ); +# endif /* Disable the ugly Gnome crash dialog so that we properly segfault */ putenv( (char *)"GNOME_DISABLE_CRASH_DIALOG=1" ); # endif - - /* If the user isn't using VLC_VERBOSE, set it to 0 by default */ - if( getenv( "VLC_VERBOSE" ) == NULL ) - { - putenv( (char *)"VLC_VERBOSE=0" ); - } #endif #if defined (HAVE_GETEUID) && !defined (SYS_BEOS) @@ -197,7 +215,7 @@ int main( int i_argc, char *ppsz_argv[] ) return i_ret == VLC_EEXITSUCCESS ? 0 : -i_ret; } - i_ret = VLC_AddIntf( 0, NULL, VLC_TRUE, VLC_TRUE ); + i_ret = VLC_AddIntf( 0, NULL, true, true ); /* Finish the threads */ VLC_CleanUp( 0 ); @@ -242,7 +260,8 @@ static void *SigHandler (void *data) for (;;) { int i_signal, state; - (void)sigwait (&fullset, &i_signal); + if( sigwait (&fullset, &i_signal) != 0 ) + continue; #ifdef __APPLE__ /* In Mac OS X up to 10.4.8 sigwait (among others) is not a pthread @@ -258,24 +277,32 @@ static void *SigHandler (void *data) * signals to a libvlc structure having been destroyed */ pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &state); - if (abort_time == 0) + if (abort_time == 0 || time (NULL) > abort_time) { time (&abort_time); abort_time += 2; fprintf (stderr, "signal %d received, terminating vlc - do it " - "again in case it gets stuck\n", i_signal); + "again quickly in case it gets stuck\n", i_signal); /* Acknowledge the signal received */ Kill (); } - else - if (time (NULL) <= abort_time) + else /* time (NULL) <= abort_time */ { /* If user asks again more than 2 seconds later, die badly */ pthread_sigmask (SIG_UNBLOCK, exitset, NULL); fprintf (stderr, "user insisted too much, dying badly\n"); +#ifdef __APPLE__ + /* On Mac OS X, use exit(-1) as it doesn't trigger + * backtrace generation, whereas abort() does. + * The backtrace generation trigger a Crash Dialog + * And takes way too much time, which is not what + * we want. */ + exit (-1); +#else abort (); +#endif } pthread_setcancelstate (state, NULL); }