X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fconfig%2Fcmdline.c;h=264f84ed2f9670e21e734439c44b84aeb67b1ad1;hb=9e26639a38c7174921f5e416c7233edacdc8cbca;hp=591c1a0ff615ea3d4a74ca72eb1cb72213e5b350;hpb=3655c1c6edfa65212b263fa330e0bf4809eeb5d1;p=vlc diff --git a/src/config/cmdline.c b/src/config/cmdline.c index 591c1a0ff6..264f84ed2f 100644 --- a/src/config/cmdline.c +++ b/src/config/cmdline.c @@ -21,20 +21,14 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ -#include -#include "../libvlc.h" -#include "vlc_keys.h" -#include "vlc_charset.h" - -#include /* errno */ - -#ifdef HAVE_LIMITS_H -# include +#ifdef HAVE_CONFIG_H +# include "config.h" #endif -#ifdef HAVE_UNISTD_H -# include /* getuid() */ -#endif +#include +#include "../libvlc.h" +#include +#include #ifdef HAVE_GETOPT_LONG # ifdef HAVE_GETOPT_H @@ -44,26 +38,11 @@ # include "../extras/getopt.h" #endif -#if defined(HAVE_GETPWUID) -# include /* getpwuid() */ -#endif - -#if defined( HAVE_SYS_STAT_H ) -# include -#endif -#if defined( HAVE_SYS_TYPES_H ) -# include -#endif -#if defined( WIN32 ) -# if !defined( UNDER_CE ) -# include -# endif -#include -#endif - -#include "config.h" +#include "configuration.h" #include "modules/modules.h" +#include + /***************************************************************************** * config_LoadCmdLine: parse command line ***************************************************************************** @@ -75,22 +54,17 @@ *****************************************************************************/ int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc, const char *ppsz_argv[], - vlc_bool_t b_ignore_errors ) + bool b_ignore_errors ) { int i_cmd, i_index, i_opts, i_shortopts, flag, i_verbose = 0; module_t *p_parser; - vlc_list_t *p_list; struct option *p_longopts; - int i_modules_index; + const char **argv_copy = NULL; /* Short options */ module_config_t *pp_shortopts[256]; char *psz_shortopts; - /* Set default configuration and copy arguments */ - p_this->p_libvlc->i_argc = *pi_argc; - p_this->p_libvlc->ppsz_argv = ppsz_argv; - #ifdef __APPLE__ /* When VLC.app is run by double clicking in Mac OS X, the 2nd arg * is the PSN - process serial number (a unique PID-ish thingie) @@ -101,50 +75,40 @@ int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc, /* GDMF!... I can't do this or else the MacOSX window server will * not pick up the PSN and not register the app and we crash... * hence the following kludge otherwise we'll get confused w/ argv[1] - * being an input file name */ -#if 0 - ppsz_argv[ 1 ] = NULL; -#endif - *pi_argc = *pi_argc - 1; - pi_argc--; + * being an input file name. + * As there won't be any more args to parse, just exit. */ + assert( *pi_argc == 2 ); + *pi_argc = 1; return 0; } #endif /* List all modules */ - p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE ); + module_t **list = module_list_get (NULL); /* * Generate the longopts and shortopts structures used by getopt_long */ i_opts = 0; - for( i_modules_index = 0; i_modules_index < p_list->i_count; - i_modules_index++ ) - { - p_parser = (module_t *)p_list->p_values[i_modules_index].p_object ; - + for (size_t i = 0; (p_parser = list[i]) != NULL; i++) /* count the number of exported configuration options (to allocate * longopts). We also need to allocate space for two options when * dealing with boolean to allow for --foo and --no-foo */ - i_opts += p_parser->i_config_items - + 2 * p_parser->i_bool_items; - } + i_opts += p_parser->i_config_items + 2 * p_parser->i_bool_items; p_longopts = malloc( sizeof(struct option) * (i_opts + 1) ); if( p_longopts == NULL ) { - msg_Err( p_this, "out of memory" ); - vlc_list_release( p_list ); + module_list_free (list); return -1; } psz_shortopts = malloc( sizeof( char ) * (2 * i_opts + 1) ); if( psz_shortopts == NULL ) { - msg_Err( p_this, "out of memory" ); free( p_longopts ); - vlc_list_release( p_list ); + module_list_free (list); return -1; } @@ -153,17 +117,16 @@ int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc, * us, ignoring the arity of the options */ if( b_ignore_errors ) { - ppsz_argv = (const char**)malloc( *pi_argc * sizeof(char *) ); - if( ppsz_argv == NULL ) + argv_copy = (const char**)malloc( *pi_argc * sizeof(char *) ); + if( argv_copy == NULL ) { - msg_Err( p_this, "out of memory" ); free( psz_shortopts ); free( p_longopts ); - vlc_list_release( p_list ); + module_list_free (list); return -1; } - memcpy( ppsz_argv, p_this->p_libvlc->ppsz_argv, - *pi_argc * sizeof(char *) ); + memcpy( argv_copy, ppsz_argv, *pi_argc * sizeof(char *) ); + ppsz_argv = argv_copy; } i_shortopts = 0; @@ -174,11 +137,9 @@ int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc, /* Fill the p_longopts and psz_shortopts structures */ i_index = 0; - for( i_modules_index = 0; i_modules_index < p_list->i_count; - i_modules_index++ ) + for (size_t i = 0; (p_parser = list[i]) != NULL; i++) { module_config_t *p_item, *p_end; - p_parser = (module_t *)p_list->p_values[i_modules_index].p_object ; if( !p_parser->i_config_items ) continue; @@ -195,8 +156,14 @@ int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc, p_longopts[i_index].name = strdup( p_item->psz_name ); if( p_longopts[i_index].name == NULL ) continue; p_longopts[i_index].has_arg = - (p_item->i_type == CONFIG_ITEM_BOOL)? - no_argument : required_argument; + (p_item->i_type == CONFIG_ITEM_BOOL) ? no_argument : +#ifndef __APPLE__ + required_argument; +#else +/* It seems that required_argument is broken on Darwin. + * Radar ticket #6113829 */ + optional_argument; +#endif p_longopts[i_index].flag = &flag; p_longopts[i_index].val = 0; i_index++; @@ -250,7 +217,7 @@ int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc, } /* We don't need the module list anymore */ - vlc_list_release( p_list ); + module_list_free( list ); /* Close the longopts and shortopts structures */ memset( &p_longopts[i_index], 0, sizeof(struct option) ); @@ -306,7 +273,14 @@ int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc, psz_name = p_conf->psz_name; } - +#ifdef __APPLE__ + if( p_conf->i_type != CONFIG_ITEM_BOOL && !optarg ) + { + fprintf( stderr, "Warning: missing argument for option --%s\n", p_conf->psz_name ); + fprintf( stderr, "Try specifying options as '--optionname=value' instead of '--optionname value'\n" ); + continue; + } +#endif switch( p_conf->i_type ) { case CONFIG_ITEM_STRING: @@ -323,7 +297,7 @@ int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc, config_PutInt( p_this, psz_name, strtol(optarg, 0, 0)); break; case CONFIG_ITEM_FLOAT: - config_PutFloat( p_this, psz_name, (float)atof(optarg) ); + config_PutFloat( p_this, psz_name, us_atof(optarg) ); break; case CONFIG_ITEM_KEY: config_PutInt( p_this, psz_name, ConfigStringToKey( optarg ) ); @@ -394,9 +368,8 @@ int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc, /* Internal error: unknown option */ if( !b_ignore_errors ) { - fprintf( stderr, "%s: unknown option" - " or missing mandatory argument ", - p_this->p_libvlc->psz_object_name ); + fputs( "vlc: unknown option" + " or missing mandatory argument ", stderr ); if( optopt ) { fprintf( stderr, "`-%c'\n", optopt ); @@ -405,8 +378,7 @@ int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc, { fprintf( stderr, "`%s'\n", ppsz_argv[optind-1] ); } - fprintf( stderr, "Try `%s --help' for more information.\n", - p_this->p_libvlc->psz_object_name ); + fputs( "Try `vlc --help' for more information.\n", stderr ); for( i_index = 0; p_longopts[i_index].name; i_index++ ) free( (char *)p_longopts[i_index].name ); @@ -421,7 +393,7 @@ int __config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc, free( (char *)p_longopts[i_index].name ); free( p_longopts ); free( psz_shortopts ); - if( b_ignore_errors ) free( ppsz_argv ); + free( argv_copy ); return 0; }