VLC 4.0.0-dev
No Matches
cmdline.c File Reference
Include dependency graph for cmdline.c:


void config_CmdLineEarlyScan (libvlc_int_t *p_this, int argc, const char *argv[])
 Perform early scan of arguments for a small subset of simple options.
int config_LoadCmdLine (libvlc_int_t *p_this, int i_argc, const char *ppsz_argv[], int *pindex)
 Parse command line for configuration options.

Function Documentation

◆ config_CmdLineEarlyScan()

void config_CmdLineEarlyScan ( libvlc_int_t p_this,
int  argc,
const char *  argv[] 

Perform early scan of arguments for a small subset of simple options.

Before proper full processing can be done, which requires full knowledge of all available options, we have a need to perform a preliminary check for a few options that affect plugin loading. This is because the full option set consists of a core subset plus various plugin subsets and we thus need to load plugin data to know the plugin subsets, but there are a few core options that actually affect loading of plugin data.

Note that we want to be cautious about doing too much here. Firstly simply to avoid duplicating effort done later in the proper full processing step. Additionally though because fundamentally the very notion of a preliminary scan is problematic in terms of taking "correct" (or at least consistent) action in the face of certain use or misuse of options. Consider the fact that it is standard practice with option arguments that take a value, should a value not be provided within the same argument, to just consume the next argument as the option's value, no matter whether or not the next argument might "look" like an option itself (or an "early terminator"). Such is the behaviour of getopt. (It may perhaps seem wrong to do things that way, but that's how it works; it would alternatively be wrong for getopt in general to prevent options from taking values that just happen to resemble these things; and besides, bad consumption will only occur through bad option use which is fair to expect to cause incorrect results and in many cases ideally would be caught early by validation checks on option values anyway). So, a preliminary scan, by not knowing the full option set and not following the standard parsing rules (since it can't), naturally introduces risks of "incorrect" or "inconsistent" interpretation of the set of arguments, at least wrt. the later full/proper processing, and the more that we do, the more such incorrect/inconsistent processing scenarios we introduce. Furthermore consider the additional complication of short option "sets" (which is a short option argument involving multiple characters like -abc). In a short option set only the last option in the set (which is not necessarily its last character) can be one that takes a value, with any characters coming after it (if any) taken as its option value (if none then the next argument is consumed instead). In a preliminary scan where we do not know the full set of available short options, we can risk misinterpreting characters in short option sets as options when they are meant to be consumed as an option value. Thus it is very problematic to properly try to deal with an option like --help, which comes with the short option -h as well as --no-help, here in a preliminary scan, which is unfortunate because it might make a nice optimisation if we could.

Considering this discussion, it is simply best that we keep option checks here to an absolute bare minimum of just the three plugin data related ones that we have no choice but to scan for early, and we must put up with a minimal amount of possible incorrect/inconsistent interpretation as unavoidable. (Though we could add some code after the full scan to determine whether or not the wrong action took place and issue a warning if so).

p_thisobject to write command line options as variables to
argcnumber of command line arguments
argvcommand line arguments

References arg, and VLC_UNUSED.

Referenced by libvlc_InternalInit().

◆ config_LoadCmdLine()

int config_LoadCmdLine ( libvlc_int_t p_this,
int  i_argc,
const char *  ppsz_argv[],
int *  pindex 

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.

p_thisobject to write command line options as variables to
i_argcnumber of command line arguments
ppsz_argvcommand line arguments [IN/OUT]
pindexindex of the first non-option argument [OUT]
0 on success, -1 on error.

References _, asprintf(), CONFIG_CLASS, config_FindConfig(), CONFIG_ITEM, CONFIG_ITEM_BOOL, CONFIG_ITEM_FLOAT, CONFIG_ITEM_INTEGER, CONFIG_ITEM_STRING, container_of, module_value_t::f, vlc_option::flag, vlc_option::has_arg, module_value_t::i, vlc_param::i, module_config_t::i_type, i_type, vlc_getopt_s::ind, vlc_option::is_obsolete, vlc_param::item, module_config_t::max, module_config_t::min, vlc_option::name, name, vlc_plugin_t::next, vlc_param::obsolete, p, module_config_t::psz_name, psz_name, vlc_param::shortname, state, strdup(), strtoll(), TS_GREEN, TS_RED_BOLD, TS_RESET, TS_YELLOW, TS_YELLOW_BOLD, vlc_option::val, var_Change(), var_Create(), var_SetBool(), var_SetFloat(), var_SetInteger(), var_SetString(), vlc_alloc(), vlc_assert_unreachable, vlc_atof_c(), vlc_getopt_long(), vlc_jaro_winkler(), vlc_plugins, VLC_VAR_BOOL, VLC_VAR_FLOAT, VLC_VAR_INTEGER, VLC_VAR_SETMINMAX, and VLC_VAR_STRING.

Referenced by libvlc_InternalInit().