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,14 +197,15 @@ int config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc, ...@@ -198,14 +197,15 @@ 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,
psz_shortopts,
p_longopts, &i_index ) ) != -1 ) p_longopts, &i_index ) ) != -1 )
{ {
/* A long option has been recognized */ /* A long option has been recognized */
...@@ -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 );
......
...@@ -49,7 +49,7 @@ ...@@ -49,7 +49,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. */
char *optarg = NULL; char *vlc_optarg = NULL;
/* 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
...@@ -64,13 +64,13 @@ char *optarg = NULL; ...@@ -64,13 +64,13 @@ char *optarg = NULL;
how much of ARGV has been scanned so far. */ how much of ARGV has been scanned so far. */
/* 1003.2 says this must be 1 before any call. */ /* 1003.2 says this must be 1 before any call. */
int optind = 1; int vlc_optind = 1;
/* Formerly, initialization of getopt depended on optind==0, which /* Formerly, initialization of getopt depended on optind==0, which
causes problems with re-calling getopt as programs generally don't causes problems with re-calling getopt as programs generally don't
know that. */ know that. */
int __getopt_initialized = 0; static int vlc_getopt_initialized = 0;
/* The next char to be scanned in the option-element /* The next char to be scanned in the option-element
in which the last option character we returned was found. in which the last option character we returned was found.
...@@ -85,7 +85,7 @@ static char *nextchar; ...@@ -85,7 +85,7 @@ static char *nextchar;
This must be initialized on some systems to avoid linking in the This must be initialized on some systems to avoid linking in the
system's own getopt implementation. */ system's own getopt implementation. */
int optopt = '?'; int vlc_optopt = '?';
/* Describe how to deal with options that follow non-option ARGV-elements. /* Describe how to deal with options that follow non-option ARGV-elements.
...@@ -151,7 +151,7 @@ static void ...@@ -151,7 +151,7 @@ static void
{ {
int bottom = first_nonopt; int bottom = first_nonopt;
int middle = last_nonopt; int middle = last_nonopt;
int top = optind; int top = vlc_optind;
char *tem; char *tem;
/* Exchange the shorter segment with the far end of the longer segment. /* Exchange the shorter segment with the far end of the longer segment.
...@@ -197,16 +197,16 @@ static void ...@@ -197,16 +197,16 @@ static void
/* Update records for the slots the non-options now occupy. */ /* Update records for the slots the non-options now occupy. */
first_nonopt += (optind - last_nonopt); first_nonopt += (vlc_optind - last_nonopt);
last_nonopt = optind; last_nonopt = vlc_optind;
} }
/* Initialize the internal data when the first call is made. */ /* Initialize the internal data when the first call is made. */
static const char *_getopt_initialize(int, char *const *, const char *); static const char *vlc_getopt_initialize(int, char *const *, const char *);
static const char * static const char *
_getopt_initialize(argc, argv, optstring) vlc_getopt_initialize(argc, argv, optstring)
int argc; int argc;
char *const *argv; char *const *argv;
const char *optstring; const char *optstring;
...@@ -217,7 +217,7 @@ static const char * ...@@ -217,7 +217,7 @@ static const char *
is the program name); the sequence of previously skipped is the program name); the sequence of previously skipped
non-option ARGV-elements is empty. */ non-option ARGV-elements is empty. */
first_nonopt = last_nonopt = optind = 1; first_nonopt = last_nonopt = vlc_optind = 1;
nextchar = NULL; nextchar = NULL;
...@@ -298,19 +298,19 @@ int ...@@ -298,19 +298,19 @@ int
int argc; int argc;
char *const *argv; char *const *argv;
const char *optstring; const char *optstring;
const struct option *longopts; const struct vlc_option *restrict longopts;
int *longind; int *longind;
{ {
optarg = NULL; vlc_optarg = NULL;
if (!__getopt_initialized || optind == 0) if (!vlc_getopt_initialized || vlc_optind == 0)
{ {
optstring = _getopt_initialize(argc, argv, optstring); optstring = vlc_getopt_initialize(argc, argv, optstring);
optind = 1; /* Don't scan ARGV[0], the program name. */ vlc_optind = 1; /* Don't scan ARGV[0], the program name. */
__getopt_initialized = 1; vlc_getopt_initialized = 1;
} }
#define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0') #define NONOPTION_P (argv[vlc_optind][0] != '-' || argv[vlc_optind][1] == '\0')
if (nextchar == NULL || *nextchar == '\0') if (nextchar == NULL || *nextchar == '\0')
{ {
...@@ -318,27 +318,27 @@ int ...@@ -318,27 +318,27 @@ int
/* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been
moved back by the user (who may also have changed the arguments). */ moved back by the user (who may also have changed the arguments). */
if (last_nonopt > optind) if (last_nonopt > vlc_optind)
last_nonopt = optind; last_nonopt = vlc_optind;
if (first_nonopt > optind) if (first_nonopt > vlc_optind)
first_nonopt = optind; first_nonopt = vlc_optind;
if (ordering == PERMUTE) if (ordering == PERMUTE)
{ {
/* If we have just processed some options following some non-options, /* If we have just processed some options following some non-options,
exchange them so that the options come first. */ exchange them so that the options come first. */
if (first_nonopt != last_nonopt && last_nonopt != optind) if (first_nonopt != last_nonopt && last_nonopt != vlc_optind)
exchange((char **) argv); exchange((char **) argv);
else if (last_nonopt != optind) else if (last_nonopt != vlc_optind)
first_nonopt = optind; first_nonopt = vlc_optind;
/* Skip any additional non-options /* Skip any additional non-options
and extend the range of non-options previously skipped. */ and extend the range of non-options previously skipped. */
while (optind < argc && NONOPTION_P) while (vlc_optind < argc && NONOPTION_P)
optind++; vlc_optind++;
last_nonopt = optind; last_nonopt = vlc_optind;
} }
/* The special ARGV-element `--' means premature end of options. /* The special ARGV-element `--' means premature end of options.
...@@ -346,28 +346,28 @@ int ...@@ -346,28 +346,28 @@ int
then exchange with previous non-options as if it were an option, then exchange with previous non-options as if it were an option,
then skip everything else like a non-option. */ then skip everything else like a non-option. */
if (optind != argc && !strcmp(argv[optind], "--")) if (vlc_optind != argc && !strcmp(argv[vlc_optind], "--"))
{ {
optind++; vlc_optind++;
if (first_nonopt != last_nonopt && last_nonopt != optind) if (first_nonopt != last_nonopt && last_nonopt != vlc_optind)
exchange((char **) argv); exchange((char **) argv);
else if (first_nonopt == last_nonopt) else if (first_nonopt == last_nonopt)
first_nonopt = optind; first_nonopt = vlc_optind;
last_nonopt = argc; last_nonopt = argc;
optind = argc; vlc_optind = argc;
} }
/* If we have done all the ARGV-elements, stop the scan /* If we have done all the ARGV-elements, stop the scan
and back over any non-options that we skipped and permuted. */ and back over any non-options that we skipped and permuted. */
if (optind == argc) if (vlc_optind == argc)
{ {
/* Set the next-arg-index to point at the non-options /* Set the next-arg-index to point at the non-options
that we previously skipped, so the caller will digest them. */ that we previously skipped, so the caller will digest them. */
if (first_nonopt != last_nonopt) if (first_nonopt != last_nonopt)
optind = first_nonopt; vlc_optind = first_nonopt;
return -1; return -1;
} }
...@@ -378,26 +378,26 @@ int ...@@ -378,26 +378,26 @@ int
{ {
if (ordering == REQUIRE_ORDER) if (ordering == REQUIRE_ORDER)
return -1; return -1;
optarg = argv[optind++]; vlc_optarg = argv[vlc_optind++];
return 1; return 1;
} }
/* We have found another option-ARGV-element. /* We have found another option-ARGV-element.
Skip the initial punctuation. */ Skip the initial punctuation. */
nextchar = (argv[optind] + 1 nextchar = (argv[vlc_optind] + 1
+ (argv[optind][1] == '-')); + (argv[vlc_optind][1] == '-'));
} }
/* Decode the current option-ARGV-element. */ /* Decode the current option-ARGV-element. */
/* Check whether the ARGV-element is a long option. */ /* Check whether the ARGV-element is a long option. */
if (argv[optind][1] == '-') if (argv[vlc_optind][1] == '-')
{ {
char *nameend; char *nameend;
const struct option *p; const struct vlc_option *p;
const struct option *pfound = NULL; const struct vlc_option *pfound = NULL;
int exact = 0; int exact = 0;
int ambig = 0; int ambig = 0;
int indfound = -1; int indfound = -1;
...@@ -434,35 +434,35 @@ int ...@@ -434,35 +434,35 @@ int
if (ambig && !exact) if (ambig && !exact)
{ {
nextchar += strlen(nextchar); nextchar += strlen(nextchar);
optind++; vlc_optind++;
optopt = 0; vlc_optopt = 0;
return '?'; return '?';
} }
if (pfound != NULL) if (pfound != NULL)
{ {
option_index = indfound; option_index = indfound;
optind++; vlc_optind++;
if (*nameend) if (*nameend)
{ {
if (pfound->has_arg) if (pfound->has_arg)
optarg = nameend + 1; vlc_optarg = nameend + 1;
else else
{ {
nextchar += strlen(nextchar); nextchar += strlen(nextchar);
optopt = pfound->val; vlc_optopt = pfound->val;
return '?'; return '?';
} }
} }
else if (pfound->has_arg) else if (pfound->has_arg)
{ {
if (optind < argc) if (vlc_optind < argc)
optarg = argv[optind++]; vlc_optarg = argv[vlc_optind++];
else else
{ {
nextchar += strlen(nextchar); nextchar += strlen(nextchar);
optopt = pfound->val; vlc_optopt = pfound->val;
return optstring[0] == ':' ? ':' : '?'; return optstring[0] == ':' ? ':' : '?';
} }
} }
...@@ -478,8 +478,8 @@ int ...@@ -478,8 +478,8 @@ int
} }
nextchar = (char *) ""; nextchar = (char *) "";
optind++; vlc_optind++;
optopt = 0; vlc_optopt = 0;
return '?'; return '?';
} }
...@@ -491,19 +491,19 @@ int ...@@ -491,19 +491,19 @@ int
/* Increment `optind' when we start to process its last character. */ /* Increment `optind' when we start to process its last character. */
if (*nextchar == '\0') if (*nextchar == '\0')
++optind; ++vlc_optind;
if (temp == NULL || c == ':') if (temp == NULL || c == ':')
{ {
optopt = c; vlc_optopt = c;
return '?'; return '?';
} }
/* Convenience. Treat POSIX -W foo same as long option --foo */ /* Convenience. Treat POSIX -W foo same as long option --foo */
if (temp[0] == 'W' && temp[1] == ';') if (temp[0] == 'W' && temp[1] == ';')
{ {
char *nameend; char *nameend;
const struct option *p; const struct vlc_option *p;
const struct option *pfound = NULL; const struct vlc_option *pfound = NULL;
int exact = 0; int exact = 0;
int ambig = 0; int ambig = 0;
int indfound = 0; int indfound = 0;
...@@ -512,14 +512,14 @@ int ...@@ -512,14 +512,14 @@ int
/* This is an option that requires an argument. */ /* This is an option that requires an argument. */
if (*nextchar != '\0') if (*nextchar != '\0')
{ {
optarg = nextchar; vlc_optarg = nextchar;
/* If we end this ARGV-element by taking the rest as an arg, /* If we end this ARGV-element by taking the rest as an arg,
we must advance to the next element now. */ we must advance to the next element now. */
optind++; vlc_optind++;
} }
else if (optind == argc) else if (vlc_optind == argc)
{ {
optopt = c; vlc_optopt = c;
if (optstring[0] == ':') if (optstring[0] == ':')
c = ':'; c = ':';
else else
...@@ -529,12 +529,12 @@ int ...@@ -529,12 +529,12 @@ int
else else
/* We already incremented `optind' once; /* We already incremented `optind' once;
increment it again when taking next ARGV-elt as argument. */ increment it again when taking next ARGV-elt as argument. */
optarg = argv[optind++]; vlc_optarg = argv[vlc_optind++];
/* optarg is now the argument, see if it's in the /* optarg is now the argument, see if it's in the
table of longopts. */ table of longopts. */
for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++) for (nextchar = nameend = vlc_optarg; *nameend && *nameend != '='; nameend++)
/* Do nothing. */ ; /* Do nothing. */ ;
/* Test all long options for either exact match /* Test all long options for either exact match
...@@ -563,7 +563,7 @@ int ...@@ -563,7 +563,7 @@ int
if (ambig && !exact) if (ambig && !exact)
{ {
nextchar += strlen(nextchar); nextchar += strlen(nextchar);
optind++; vlc_optind++;
return '?'; return '?';
} }
if (pfound != NULL) if (pfound != NULL)
...@@ -572,7 +572,7 @@ int ...@@ -572,7 +572,7 @@ int
if (*nameend) if (*nameend)
{ {
if (pfound->has_arg) if (pfound->has_arg)
optarg = nameend + 1; vlc_optarg = nameend + 1;
else else
{ {
nextchar += strlen(nextchar); nextchar += strlen(nextchar);
...@@ -581,8 +581,8 @@ int ...@@ -581,8 +581,8 @@ int
} }
else if (pfound->has_arg) else if (pfound->has_arg)
{ {
if (optind < argc) if (vlc_optind < argc)
optarg = argv[optind++]; vlc_optarg = argv[vlc_optind++];
else else
{ {
nextchar += strlen(nextchar); nextchar += strlen(nextchar);
...@@ -607,14 +607,14 @@ int ...@@ -607,14 +607,14 @@ int
/* This is an option that requires an argument. */ /* This is an option that requires an argument. */
if (*nextchar != '\0') if (*nextchar != '\0')
{ {
optarg = nextchar; vlc_optarg = nextchar;
/* If we end this ARGV-element by taking the rest as an arg, /* If we end this ARGV-element by taking the rest as an arg,
we must advance to the next element now. */ we must advance to the next element now. */
optind++; vlc_optind++;
} }
else if (optind == argc) else if (vlc_optind == argc)
{ {
optopt = c; vlc_optopt = c;
if (optstring[0] == ':') if (optstring[0] == ':')
c = ':'; c = ':';
else else
...@@ -623,7 +623,7 @@ int ...@@ -623,7 +623,7 @@ int
else else
/* We already incremented `optind' once; /* We already incremented `optind' once;
increment it again when taking next ARGV-elt as argument. */ increment it again when taking next ARGV-elt as argument. */
optarg = argv[optind++]; vlc_optarg = argv[vlc_optind++];
nextchar = NULL; nextchar = NULL;
} }
return c; return c;
......
...@@ -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