in src/agent/src/main.c [233:410]
int ParseLaunchArguments(const int argc, char** argv, ADUC_LaunchArguments* launchArgs)
{
int result = 0;
memset(launchArgs, 0, sizeof(*launchArgs));
#if _ADU_DEBUG
launchArgs->logLevel = ADUC_LOG_DEBUG;
#else
launchArgs->logLevel = ADUC_LOG_INFO;
#endif
launchArgs->configFolder = ADUC_CONF_FOLDER;
launchArgs->argc = argc;
launchArgs->argv = argv;
while (result == 0)
{
// clang-format off
static struct option long_options[] =
{
{ "version", no_argument, 0, 'v' },
{ "enable-iothub-tracing", no_argument, 0, 'e' },
{ "health-check", no_argument, 0, 'h' },
{ "log-level", required_argument, 0, 'l' },
{ "connection-string", required_argument, 0, 'c' },
{ "register-extension", required_argument, 0, 'E' },
{ "extension-type", required_argument, 0, 't' },
{ "extension-id", required_argument, 0, 'i' },
{ "run-as-owner", no_argument, 0, 'a' },
#ifdef ADUC_COMMAND_HELPER_H
{ "command", required_argument, 0, 'C' },
#endif // #ifdef ADUC_COMMAND_HELPER_H
{ "config-folder", required_argument, 0, 'F' },
{ 0, 0, 0, 0 }
};
// clang-format on
/* getopt_long stores the option index here. */
int option_index = 0;
int option = getopt_long(
argc,
argv,
STOP_PARSE_ON_NONOPTION_ARG RET_COLON_FOR_MISSING_OPTIONARG "avehcu:l:d:n:E:t:i:C:F:",
long_options,
&option_index);
/* Detect the end of the options. */
if (option == -1)
{
break;
}
switch (option)
{
case 'h':
launchArgs->healthCheckOnly = true;
break;
case 'e':
launchArgs->iotHubTracingEnabled = true;
break;
case 'l': {
unsigned int logLevel = 0;
bool ret = atoui(optarg, &logLevel);
if (!ret || logLevel < ADUC_LOG_DEBUG || logLevel > ADUC_LOG_ERROR)
{
puts("Invalid log level after '--log-level' or '-l' option. Expected value: 0-3.");
result = -1;
}
else
{
launchArgs->logLevel = (ADUC_LOG_SEVERITY)logLevel;
}
break;
}
case 'v':
launchArgs->showVersion = true;
break;
case 'c':
launchArgs->connectionString = optarg;
break;
#ifdef ADUC_COMMAND_HELPER_H
case 'C':
launchArgs->ipcCommand = optarg;
break;
#endif // #ifdef ADUC_COMMAND_HELPER_H
case 'E':
launchArgs->extensionFilePath = optarg;
break;
case 't':
launchArgs->extensionRegistrationType = GetRegistrationTypeFromArg(optarg);
break;
case 'i':
launchArgs->extensionId = optarg;
break;
case 'F':
launchArgs->configFolder = optarg;
break;
case ':':
switch (optopt)
{
case 'c':
puts("Missing connection string after '--connection-string' or '-c' option.");
break;
case 'l':
puts("Invalid log level after '--log-level' or '-l' option. Expected value: 0-3.");
break;
case 'F':
puts("Missing folder path after '--config-folder' or '-F' option.");
break;
default:
printf("Missing an option value after -%c.\n", optopt);
break;
}
result = -1;
break;
case '?':
if (optopt)
{
printf("Unsupported short argument -%c.\n", optopt);
}
else
{
printf(
"Unsupported option '%s'. Try preceding with -- to separate options and additional args.\n",
argv[optind - 1]);
}
result = -1;
break;
default:
printf("Unknown argument.");
result = -1;
}
}
if (result != -1 && optind < argc)
{
if (launchArgs->connectionString == NULL)
{
// Assuming first unknown option not starting with '-' is a connection string.
for (int i = optind; i < argc; ++i)
{
if (argv[i][0] != '-')
{
launchArgs->connectionString = argv[i];
++optind;
break;
}
}
}
if (optind < argc)
{
// Still have unknown arg(s) on the end so return the index in argv where these start.
result = optind;
}
}
if (result == 0 && launchArgs->connectionString)
{
ADUC_StringUtils_Trim(launchArgs->connectionString);
}
return result;
}