Commit 430c69a6 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

Avoid namespace clash with normal getopt

parent 68f6af6e
...@@ -54,14 +54,13 @@ ...@@ -54,14 +54,13 @@
* *
* @warning This function is not re-entrant (because of getopt_long()). * @warning This function is not re-entrant (because of getopt_long()).
* It must be called with the module bank initialization global lock held. * 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, int config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc,
const char *ppsz_argv[], bool b_ignore_errors ) const char *ppsz_argv[], bool b_ignore_errors )
{ {
int i_cmd, i_index, i_opts, i_shortopts, flag, i_verbose = 0; int i_cmd, i_index, i_opts, i_shortopts, flag, i_verbose = 0;
module_t *p_parser; module_t *p_parser;
struct option *p_longopts; struct vlc_option *p_longopts;
const char **argv_copy = NULL; const char **argv_copy = NULL;
/* Short options */ /* Short options */
...@@ -82,14 +81,14 @@ int config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc, ...@@ -82,14 +81,14 @@ int config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc,
* dealing with boolean to allow for --foo and --no-foo */ * 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) ); p_longopts = malloc( sizeof(*p_longopts) * (i_opts + 1) );
if( p_longopts == NULL ) if( p_longopts == NULL )
{ {
module_list_free (list); module_list_free (list);
return -1; return -1;
} }
psz_shortopts = malloc( sizeof( char ) * (2 * i_opts + 1) ); psz_shortopts = malloc( 2 * i_opts + 1 );
if( psz_shortopts == NULL ) if( psz_shortopts == NULL )
{ {
free( p_longopts ); free( p_longopts );
...@@ -198,15 +197,16 @@ int config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc, ...@@ -198,15 +197,16 @@ int config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc,
module_list_free( list ); module_list_free( list );
/* Close the longopts and shortopts structures */ /* Close the longopts and shortopts structures */
memset( &p_longopts[i_index], 0, sizeof(struct option) ); memset( &p_longopts[i_index], 0, sizeof(*p_longopts) );
psz_shortopts[i_shortopts] = '\0'; psz_shortopts[i_shortopts] = '\0';
/* /*
* Parse the command line options * Parse the command line options
*/ */
optind = 0; /* set to 0 to tell GNU getopt to reinitialize */ vlc_optind = 0; /* set to 0 to tell GNU getopt to reinitialize */
while( ( i_cmd = vlc_getopt_long( *pi_argc, (char **)ppsz_argv, psz_shortopts, while( ( i_cmd = vlc_getopt_long( *pi_argc, (char **)ppsz_argv,
p_longopts, &i_index ) ) != -1 ) psz_shortopts,
p_longopts, &i_index ) ) != -1 )
{ {
/* A long option has been recognized */ /* A long option has been recognized */
if( i_cmd == 0 ) if( i_cmd == 0 )
...@@ -262,21 +262,21 @@ int config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc, ...@@ -262,21 +262,21 @@ int config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc,
case CONFIG_ITEM_MODULE_LIST_CAT: case CONFIG_ITEM_MODULE_LIST_CAT:
case CONFIG_ITEM_MODULE_CAT: case CONFIG_ITEM_MODULE_CAT:
var_Create( p_this, psz_name, VLC_VAR_STRING ); var_Create( p_this, psz_name, VLC_VAR_STRING );
var_SetString( p_this, psz_name, optarg ); var_SetString( p_this, psz_name, vlc_optarg );
break; break;
case CONFIG_ITEM_INTEGER: case CONFIG_ITEM_INTEGER:
var_Create( p_this, psz_name, VLC_VAR_INTEGER ); var_Create( p_this, psz_name, VLC_VAR_INTEGER );
var_SetInteger( p_this, psz_name, var_SetInteger( p_this, psz_name,
strtol(optarg, NULL, 0)); strtol(vlc_optarg, NULL, 0));
break; break;
case CONFIG_ITEM_FLOAT: case CONFIG_ITEM_FLOAT:
var_Create( p_this, psz_name, VLC_VAR_FLOAT ); var_Create( p_this, psz_name, VLC_VAR_FLOAT );
var_SetFloat( p_this, psz_name, us_atof(optarg) ); var_SetFloat( p_this, psz_name, us_atof(vlc_optarg) );
break; break;
case CONFIG_ITEM_KEY: case CONFIG_ITEM_KEY:
var_Create( p_this, psz_name, VLC_VAR_INTEGER ); var_Create( p_this, psz_name, VLC_VAR_INTEGER );
var_SetInteger( p_this, psz_name, var_SetInteger( p_this, psz_name,
ConfigStringToKey( optarg ) ); ConfigStringToKey( vlc_optarg ) );
break; break;
case CONFIG_ITEM_BOOL: case CONFIG_ITEM_BOOL:
var_Create( p_this, psz_name, VLC_VAR_BOOL ); var_Create( p_this, psz_name, VLC_VAR_BOOL );
...@@ -302,26 +302,26 @@ int config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc, ...@@ -302,26 +302,26 @@ int config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc,
case CONFIG_ITEM_MODULE_LIST: case CONFIG_ITEM_MODULE_LIST:
case CONFIG_ITEM_MODULE_LIST_CAT: case CONFIG_ITEM_MODULE_LIST_CAT:
var_Create( p_this, name, VLC_VAR_STRING ); var_Create( p_this, name, VLC_VAR_STRING );
var_SetString( p_this, name, optarg ); var_SetString( p_this, name, vlc_optarg );
break; break;
case CONFIG_ITEM_INTEGER: case CONFIG_ITEM_INTEGER:
var_Create( p_this, name, VLC_VAR_INTEGER ); var_Create( p_this, name, VLC_VAR_INTEGER );
if( i_cmd == 'v' ) if( i_cmd == 'v' )
{ {
if( optarg ) if( vlc_optarg )
{ {
if( *optarg == 'v' ) /* eg. -vvv */ if( *vlc_optarg == 'v' ) /* eg. -vvv */
{ {
i_verbose++; i_verbose++;
while( *optarg == 'v' ) while( *vlc_optarg == 'v' )
{ {
i_verbose++; i_verbose++;
optarg++; vlc_optarg++;
} }
} }
else else
{ {
i_verbose += atoi( optarg ); /* eg. -v2 */ i_verbose += atoi( vlc_optarg ); /* eg. -v2 */
} }
} }
else else
...@@ -333,7 +333,7 @@ int config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc, ...@@ -333,7 +333,7 @@ int config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc,
else else
{ {
var_SetInteger( p_this, name, var_SetInteger( p_this, name,
strtol(optarg, NULL, 0) ); strtol(vlc_optarg, NULL, 0) );
} }
break; break;
case CONFIG_ITEM_BOOL: case CONFIG_ITEM_BOOL:
...@@ -350,13 +350,13 @@ int config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc, ...@@ -350,13 +350,13 @@ int config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc,
{ {
fputs( "vlc: unknown option" fputs( "vlc: unknown option"
" or missing mandatory argument ", stderr ); " or missing mandatory argument ", stderr );
if( optopt ) if( vlc_optopt )
{ {
fprintf( stderr, "`-%c'\n", optopt ); fprintf( stderr, "`-%c'\n", vlc_optopt );
} }
else else
{ {
fprintf( stderr, "`%s'\n", ppsz_argv[optind-1] ); fprintf( stderr, "`%s'\n", ppsz_argv[vlc_optind-1] );
} }
fputs( "Try `vlc --help' for more information.\n", stderr ); fputs( "Try `vlc --help' for more information.\n", stderr );
......
This diff is collapsed.
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
Also, when `ordering' is RETURN_IN_ORDER, Also, when `ordering' is RETURN_IN_ORDER,
each non-option ARGV-element is returned here. */ each non-option ARGV-element is returned here. */
extern char *optarg; extern char *vlc_optarg;
/* Index in ARGV of the next element to be scanned. /* Index in ARGV of the next element to be scanned.
This is used for communication to and from the caller This is used for communication to and from the caller
...@@ -42,11 +42,11 @@ ...@@ -42,11 +42,11 @@
Otherwise, `optind' communicates from one call to the next Otherwise, `optind' communicates from one call to the next
how much of ARGV has been scanned so far. */ how much of ARGV has been scanned so far. */
extern int optind; extern int vlc_optind;
/* Set to an option character which was unrecognized. */ /* Set to an option character which was unrecognized. */
extern int optopt; extern int vlc_optopt;
/* Describe the long-named options requested by the application. /* Describe the long-named options requested by the application.
The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
...@@ -68,15 +68,15 @@ ...@@ -68,15 +68,15 @@
one). For long options that have a zero `flag' field, `getopt' one). For long options that have a zero `flag' field, `getopt'
returns the contents of the `val' field. */ returns the contents of the `val' field. */
struct option struct vlc_option
{ {
const char *name; const char *name;
bool has_arg; bool has_arg;
int *flag; int *flag;
int val; int val;
}; };
extern int vlc_getopt_long(int argc, char *const *argv, const char *shortopts, extern int vlc_getopt_long(int argc, char *const *argv, const char *shortopts,
const struct option *longopts, int *longind); const struct vlc_option *longopts, int *longind);
#endif /* VLC_GETOPT_H */ #endif /* VLC_GETOPT_H */
...@@ -531,6 +531,9 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, ...@@ -531,6 +531,9 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc,
/* /*
* Override configuration with command line settings * 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 ) ) if( config_LoadCmdLine( p_libvlc, &i_argc, ppsz_argv, false ) )
{ {
#ifdef WIN32 #ifdef WIN32
...@@ -603,7 +606,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, ...@@ -603,7 +606,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc,
dbus_message_unref( p_test_reply ); dbus_message_unref( p_test_reply );
msg_Warn( p_libvlc, "Another Media Player is running. Exiting"); msg_Warn( p_libvlc, "Another Media Player is running. Exiting");
for( i_input = optind;i_input < i_argc;i_input++ ) for( i_input = vlc_optind; i_input < i_argc;i_input++ )
{ {
msg_Dbg( p_libvlc, "Adds %s to the running Media Player", msg_Dbg( p_libvlc, "Adds %s to the running Media Player",
ppsz_argv[i_input] ); ppsz_argv[i_input] );
...@@ -1194,12 +1197,12 @@ static int GetFilenames( libvlc_int_t *p_vlc, int i_argc, const char *ppsz_argv[ ...@@ -1194,12 +1197,12 @@ static int GetFilenames( libvlc_int_t *p_vlc, int i_argc, const char *ppsz_argv[
/* We assume that the remaining parameters are filenames /* We assume that the remaining parameters are filenames
* and their input options */ * and their input options */
for( i_opt = i_argc - 1; i_opt >= optind; i_opt-- ) for( i_opt = i_argc - 1; i_opt >= vlc_optind; i_opt-- )
{ {
i_options = 0; i_options = 0;
/* Count the input options */ /* Count the input options */
while( *ppsz_argv[ i_opt ] == ':' && i_opt > optind ) while( *ppsz_argv[ i_opt ] == ':' && i_opt > vlc_optind )
{ {
i_options++; i_options++;
i_opt--; i_opt--;
......
...@@ -221,24 +221,24 @@ void system_Configure( libvlc_int_t *p_this, int *pi_argc, const char *ppsz_argv ...@@ -221,24 +221,24 @@ void system_Configure( libvlc_int_t *p_this, int *pi_argc, const char *ppsz_argv
/* We assume that the remaining parameters are filenames /* We assume that the remaining parameters are filenames
* and their input options */ * and their input options */
if( *pi_argc - 1 >= optind ) if( *pi_argc - 1 >= vlc_optind )
{ {
COPYDATASTRUCT wm_data; COPYDATASTRUCT wm_data;
int i_opt; int i_opt;
vlc_ipc_data_t *p_data; vlc_ipc_data_t *p_data;
size_t i_data = sizeof (*p_data); size_t i_data = sizeof (*p_data);
for( i_opt = optind; i_opt < *pi_argc; i_opt++ ) for( i_opt = vlc_optind; i_opt < *pi_argc; i_opt++ )
{ {
i_data += sizeof (size_t); i_data += sizeof (size_t);
i_data += strlen( ppsz_argv[ i_opt ] ) + 1; i_data += strlen( ppsz_argv[ i_opt ] ) + 1;
} }
p_data = malloc( i_data ); p_data = malloc( i_data );
p_data->argc = *pi_argc - optind; p_data->argc = *pi_argc - vlc_optind;
p_data->enqueue = var_InheritBool( p_this, "playlist-enqueue" ); p_data->enqueue = var_InheritBool( p_this, "playlist-enqueue" );
i_data = 0; i_data = 0;
for( i_opt = optind; i_opt < *pi_argc; i_opt++ ) for( i_opt = vlc_optind; i_opt < *pi_argc; i_opt++ )
{ {
size_t i_len = strlen( ppsz_argv[ i_opt ] ) + 1; size_t i_len = strlen( ppsz_argv[ i_opt ] ) + 1;
/* Windows will never switch to an architecture /* Windows will never switch to an architecture
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment