]> git.sesse.net Git - vlc/blobdiff - src/config/cmdline.c
Always build and use "our" getopt
[vlc] / src / config / cmdline.c
index 5f2a6ab8f783561c5c33c448508873f91440b124..5316e8288645be197283cff03d4312325034ad39 100644 (file)
 #include <vlc_keys.h>
 #include <vlc_charset.h>
 
-#ifdef HAVE_GETOPT_LONG
-#   ifdef HAVE_GETOPT_H
-#       include <getopt.h>                                       /* getopt() */
-#   endif
-#else
-#   include "../extras/getopt.h"
-#endif
+#include "../extras/getopt.h"
 
 #include "configuration.h"
 #include "modules/modules.h"
 
 #include <assert.h>
 
-/*****************************************************************************
- * config_LoadCmdLine: parse command line
- *****************************************************************************
+#undef config_LoadCmdLine
+/**
  * Parse command line for configuration options.
+ *
  * Now that the module_bank has been initialized, we can dynamically
  * generate the longopts structure used by getops. We have to do it this way
  * because we don't know (and don't want to know) in advance the configuration
  * options used (ie. exported) by each module.
- *****************************************************************************/
-int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc,
-                          const char *ppsz_argv[],
-                          bool b_ignore_errors )
+ *
+ * @param p_this object to write command line options as variables to
+ * @param pi_argc number of command line arguments [IN/OUT]
+ * @param ppsz_args commandl ine arguments [IN/OUT]
+ * @param b_ignore_errors whether to ignore parsing errors
+ * @return 0 on success, -1 on error.
+ *
+ * @warning This function is not re-entrant (because of getopt_long()).
+ * It must be called with the module bank initialization global lock held.
+ * FIXME: this still breaks if getopt() is used outside of LibVLC.
+ */
+int config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc,
+                        const char *ppsz_argv[], bool b_ignore_errors )
 {
     int i_cmd, i_index, i_opts, i_shortopts, flag, i_verbose = 0;
     module_t *p_parser;
@@ -210,14 +213,14 @@ int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc,
      */
     opterr = 0;
     optind = 0; /* set to 0 to tell GNU getopt to reinitialize */
-    while( ( i_cmd = getopt_long( *pi_argc, (char **)ppsz_argv, psz_shortopts,
+    while( ( i_cmd = vlc_getopt_long( *pi_argc, (char **)ppsz_argv, psz_shortopts,
                                   p_longopts, &i_index ) ) != -1 )
     {
         /* A long option has been recognized */
         if( i_cmd == 0 )
         {
             module_config_t *p_conf;
-            char *psz_name = (char *)p_longopts[i_index].name;
+            const char *psz_name = p_longopts[i_index].name;
 
             /* Check if we deal with a --nofoo or --no-foo long option */
             if( flag ) psz_name += psz_name[2] == '-' ? 3 : 2;
@@ -273,19 +276,26 @@ int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc,
                     case CONFIG_ITEM_MODULE_LIST:
                     case CONFIG_ITEM_MODULE_LIST_CAT:
                     case CONFIG_ITEM_MODULE_CAT:
-                        config_PutPsz( p_this, psz_name, optarg );
+                        var_Create( p_this, psz_name, VLC_VAR_STRING );
+                        var_SetString( p_this, psz_name, optarg );
                         break;
                     case CONFIG_ITEM_INTEGER:
-                        config_PutInt( p_this, psz_name, strtol(optarg, 0, 0));
+                        var_Create( p_this, psz_name, VLC_VAR_INTEGER );
+                        var_SetInteger( p_this, psz_name,
+                                        strtol(optarg, NULL, 0));
                         break;
                     case CONFIG_ITEM_FLOAT:
-                        config_PutFloat( p_this, psz_name, us_atof(optarg) );
+                        var_Create( p_this, psz_name, VLC_VAR_FLOAT );
+                        var_SetFloat( p_this, psz_name, us_atof(optarg) );
                         break;
                     case CONFIG_ITEM_KEY:
-                        config_PutInt( p_this, psz_name, ConfigStringToKey( optarg ) );
+                        var_Create( p_this, psz_name, VLC_VAR_INTEGER );
+                        var_SetInteger( p_this, psz_name,
+                                        ConfigStringToKey( optarg ) );
                         break;
                     case CONFIG_ITEM_BOOL:
-                        config_PutInt( p_this, psz_name, !flag );
+                        var_Create( p_this, psz_name, VLC_VAR_BOOL );
+                        var_SetBool( p_this, psz_name, !flag );
                         break;
                 }
                 continue;
@@ -295,6 +305,7 @@ int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc,
         /* A short option has been recognized */
         if( pp_shortopts[i_cmd] != NULL )
         {
+            const char *name = pp_shortopts[i_cmd]->psz_name;
             switch( pp_shortopts[i_cmd]->i_type )
             {
                 case CONFIG_ITEM_STRING:
@@ -305,9 +316,11 @@ int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc,
                 case CONFIG_ITEM_MODULE_CAT:
                 case CONFIG_ITEM_MODULE_LIST:
                 case CONFIG_ITEM_MODULE_LIST_CAT:
-                    config_PutPsz( p_this, pp_shortopts[i_cmd]->psz_name, optarg );
+                    var_Create( p_this, name, VLC_VAR_STRING );
+                    var_SetString( p_this, name, optarg );
                     break;
                 case CONFIG_ITEM_INTEGER:
+                    var_Create( p_this, name, VLC_VAR_INTEGER );
                     if( i_cmd == 'v' )
                     {
                         if( optarg )
@@ -330,17 +343,17 @@ int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc,
                         {
                             i_verbose++; /* -v */
                         }
-                        config_PutInt( p_this, pp_shortopts[i_cmd]->psz_name,
-                                               i_verbose );
+                        var_SetInteger( p_this, name, i_verbose );
                     }
                     else
                     {
-                        config_PutInt( p_this, pp_shortopts[i_cmd]->psz_name,
-                                               strtol(optarg, 0, 0) );
+                        var_SetInteger( p_this, name,
+                                        strtol(optarg, NULL, 0) );
                     }
                     break;
                 case CONFIG_ITEM_BOOL:
-                    config_PutInt( p_this, pp_shortopts[i_cmd]->psz_name, 1 );
+                    var_Create( p_this, name, VLC_VAR_BOOL );
+                    var_SetBool( p_this, name, true );
                     break;
             }