X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=macosx%2Fmain.mm;h=260a8ad928ddd1725f26c9fa600d2ffdf08af1aa;hb=4b72a63eb61a01275493c4bfb51ba02152d1c5e1;hp=9927a44e7c715860402ac4f90fbc98f55b61d033;hpb=0019d232363aaf8dbdad11261d734198d3f9eafb;p=handbrake-jp%2Fhandbrake-jp-git.git diff --git a/macosx/main.mm b/macosx/main.mm index 9927a44e..260a8ad9 100644 --- a/macosx/main.mm +++ b/macosx/main.mm @@ -5,6 +5,10 @@ It may be used under the terms of the GNU General Public License. */ #include +#include +#include +#include + #import "hb.h" void SigHandler( int signal ) @@ -25,8 +29,115 @@ void hb_error_handler( const char *errmsg ) } } +char * str_printf(const char *fmt, ...) +{ + /* Guess we need no more than 100 bytes. */ + int len; + va_list ap; + int size = 100; + char *tmp, *str = NULL; + + str = (char*)malloc(size); + while (1) + { + /* Try to print in the allocated space. */ + va_start(ap, fmt); + len = vsnprintf(str, size, fmt, ap); + va_end(ap); + + /* If that worked, return the string. */ + if (len > -1 && len < size) { + return str; + } + + /* Else try again with more space. */ + if (len > -1) /* glibc 2.1 */ + size = len+1; /* precisely what is needed */ + else /* glibc 2.0 */ + size *= 2; /* twice the old size */ + + tmp = (char*)realloc(str, size); + if (tmp == NULL) { + return str; + } + str = tmp; + } +} + +#define EXTRA_VLC_DYLD_PATH "/Applications/VLC.app/Contents/MacOS/lib" +#define DEFAULT_DYLD_PATH "/usr/local/lib:/usr/lib" + int main( int argc, const char ** argv ) { + char *dylib_path; + int no_exec = 0; + + // Check for flag that prevents exec bomb. It + // incidentally can be used to prevent adding + // our modifications to the dyld env vars. + if ( argc > 1 && strncmp(argv[1], "-n", 2) == 0 ) + no_exec = 1; + + if ( !no_exec ) + { + dylib_path = getenv("DYLD_FALLBACK_LIBRARY_PATH"); + if ( dylib_path == NULL || + strstr( dylib_path, "/Applications/VLC.app/Contents/MacOS/lib" ) == NULL ) + { + char *path = NULL; + char *home; + int result = -1; + + home = getenv("HOME"); + + if ( dylib_path == NULL ) + { + // Set the system default of $HOME/lib:/usr/local/lib:/usr/lib + // And add our extra path + if ( home != NULL ) + { + path = str_printf("%s/lib:%s:%s:%s%s", home, + DEFAULT_DYLD_PATH, + EXTRA_VLC_DYLD_PATH, + home, EXTRA_VLC_DYLD_PATH); + } + else + { + path = str_printf("%s:%s", DEFAULT_DYLD_PATH, EXTRA_VLC_DYLD_PATH); + } + if ( path != NULL ) + result = setenv("DYLD_FALLBACK_LIBRARY_PATH", path, 1); + } + else + { + // add our extra path + if ( home != NULL ) + { + path = str_printf("%s:%s:%s%s", dylib_path, EXTRA_VLC_DYLD_PATH, + home, EXTRA_VLC_DYLD_PATH); + } + else + { + path = str_printf("%s:%s", dylib_path, EXTRA_VLC_DYLD_PATH); + } + if ( path != NULL ) + result = setenv("DYLD_FALLBACK_LIBRARY_PATH", path, 1); + } + if ( result == 0 ) + { + const char ** new_argv; + int i; + + new_argv = (const char**)malloc( (argc + 2) * sizeof(char*) ); + new_argv[0] = argv[0]; + new_argv[1] = "-n"; + for (i = 1; i < argc; i++) + new_argv[i+1] = argv[i]; + new_argv[i+1] = NULL; + execv(new_argv[0], (char* const*)new_argv); + } + } + } signal( SIGINT, SigHandler ); hb_register_error_handler(&hb_error_handler); return NSApplicationMain( argc, argv );