]> git.sesse.net Git - vlc/blobdiff - src/libvlc.c
snprintf() always puts a nul terminator...
[vlc] / src / libvlc.c
index 226147e2fb329f71d1d838c0a01337764ce55ca6..b11f40fc1ef69ddb86bcd93c275bc0f8468864d6 100644 (file)
@@ -204,7 +204,7 @@ void vlc_release (gc_object_t *p_gc)
     ( defined( HAVE_GETTEXT ) || defined( HAVE_INCLUDED_GETTEXT ) )
 static void SetLanguage   ( char const * );
 #endif
-static int  GetFilenames  ( libvlc_int_t *, int, const char *[] );
+static void GetFilenames  ( libvlc_int_t *, unsigned, const char *const [] );
 static void Help          ( libvlc_int_t *, char const *psz_help_name );
 static void Usage         ( libvlc_int_t *, char const *psz_search );
 static void ListModules   ( libvlc_int_t *, bool );
@@ -217,6 +217,7 @@ static void PauseConsole  ( void );
 static int  ConsoleWidth  ( void );
 
 static vlc_mutex_t global_lock = VLC_STATIC_MUTEX;
+extern const char psz_vlc_changeset[];
 
 /**
  * Allocate a libvlc instance, initialize global data if needed
@@ -320,7 +321,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc,
      * options) */
     module_InitBank( p_libvlc );
 
-    if( config_LoadCmdLine( p_libvlc, &i_argc, ppsz_argv, true ) )
+    if( config_LoadCmdLine( p_libvlc, i_argc, ppsz_argv, NULL ) )
     {
         module_EndBank( p_libvlc, false );
         return VLC_EGENERIC;
@@ -328,8 +329,10 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc,
 
     priv->i_verbose = var_InheritInteger( p_libvlc, "verbose" );
     /* Announce who we are - Do it only for first instance ? */
+    msg_Dbg( p_libvlc, "VLC media player - %s", VERSION_MESSAGE );
     msg_Dbg( p_libvlc, "%s", COPYRIGHT_MESSAGE );
-    msg_Dbg( p_libvlc, "libvlc was configured with %s", CONFIGURE_LINE );
+    msg_Dbg( p_libvlc, "revision %s", psz_vlc_changeset );
+    msg_Dbg( p_libvlc, "configured with %s", CONFIGURE_LINE );
     /*xgettext: Translate "C" to the language code: "fr", "en_GB", "nl", "ru"... */
     msg_Dbg( p_libvlc, "translation test: code is \"%s\"", _("C") );
 
@@ -531,10 +534,8 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc,
     /*
      * Override configuration with command line settings
      */
-    /* config_LoadCmdLine(), DBus (below) and Win32-specific use vlc_optind,
-     * vlc_optarg and vlc_optopt globals. This is not thread-safe!! */
-#warning BUG!
-    if( config_LoadCmdLine( p_libvlc, &i_argc, ppsz_argv, false ) )
+    int vlc_optind;
+    if( config_LoadCmdLine( p_libvlc, i_argc, ppsz_argv, &vlc_optind ) )
     {
 #ifdef WIN32
         ShowConsole( false );
@@ -548,11 +549,6 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc,
     }
     priv->i_verbose = var_InheritInteger( p_libvlc, "verbose" );
 
-    /*
-     * System specific configuration
-     */
-    system_Configure( p_libvlc, &i_argc, ppsz_argv );
-
 /* FIXME: could be replaced by using Unix sockets */
 #ifdef HAVE_DBUS
     dbus_threads_init_default();
@@ -819,6 +815,9 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc,
         return VLC_EGENERIC;
     }
 
+    /* System specific configuration */
+    system_Configure( p_libvlc, i_argc - vlc_optind, ppsz_argv + vlc_optind );
+
     /* Add service discovery modules */
     psz_modules = var_InheritString( p_libvlc, "services-discovery" );
     if( psz_modules )
@@ -961,9 +960,11 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc,
 #endif
 
     /*
-     * Get input filenames given as commandline arguments
+     * Get input filenames given as commandline arguments.
+     * We assume that the remaining parameters are filenames
+     * and their input options.
      */
-    GetFilenames( p_libvlc, i_argc, ppsz_argv );
+    GetFilenames( p_libvlc, i_argc - vlc_optind, ppsz_argv + vlc_optind );
 
     /*
      * Get --open argument
@@ -1176,8 +1177,7 @@ static void SetLanguage ( const char *psz_lang )
      * makes the environment unconsistent when libvlc is unloaded and
      * should probably be moved to a safer place like vlc.c. */
     static char psz_lcall[20];
-    snprintf( psz_lcall, 19, "LC_ALL=%s", psz_lang );
-    psz_lcall[19] = '\0';
+    snprintf( psz_lcall, sizeof(psz_lcall), "LC_ALL=%s", psz_lang );
     putenv( psz_lcall );
 #endif
 
@@ -1191,36 +1191,35 @@ static void SetLanguage ( const char *psz_lang )
  * Parse command line for input files as well as their associated options.
  * An option always follows its associated input and begins with a ":".
  *****************************************************************************/
-static int GetFilenames( libvlc_int_t *p_vlc, int i_argc, const char *ppsz_argv[] )
+static void GetFilenames( libvlc_int_t *p_vlc, unsigned n,
+                          const char *const args[] )
 {
-    int i_opt, i_options;
-
-    /* We assume that the remaining parameters are filenames
-     * and their input options */
-    for( i_opt = i_argc - 1; i_opt >= vlc_optind; i_opt-- )
+    while( n > 0 )
     {
-        i_options = 0;
-
         /* Count the input options */
-        while( *ppsz_argv[ i_opt ] == ':' && i_opt > vlc_optind )
+        unsigned i_options = 0;
+
+        while( args[--n][0] == ':' )
         {
             i_options++;
-            i_opt--;
+            if( n == 0 )
+            {
+                msg_Warn( p_vlc, "options %s without item", args[n] );
+                return; /* syntax!? */
+            }
         }
 
         /* TODO: write an internal function of this one, to avoid
          *       unnecessary lookups. */
-        char *mrl = make_URI( ppsz_argv[i_opt] );
+        char *mrl = make_URI( args[n] );
         if( !mrl )
             continue;
 
         playlist_AddExt( pl_Get( p_vlc ), mrl, NULL, PLAYLIST_INSERT,
-                0, -1, i_options, ( i_options ? &ppsz_argv[i_opt + 1] : NULL ),
+                0, -1, i_options, ( i_options ? &args[n + 1] : NULL ),
                 VLC_INPUT_OPTION_TRUSTED, true, pl_Unlocked );
         free( mrl );
     }
-
-    return VLC_SUCCESS;
 }
 
 /*****************************************************************************
@@ -1903,7 +1902,6 @@ static void ListModules( libvlc_int_t *p_this, bool b_verbose )
  *****************************************************************************/
 static void Version( void )
 {
-    extern const char psz_vlc_changeset[];
 #ifdef WIN32
     ShowConsole( true );
 #endif