POSIX getopt_long
optarg
-
:
for required arguments, for examplef:
expands to-f abc
- no
:
treated only as args, example-v
-
::
treated as optional args
usage
read man 3 getopt
tldr
lets construct array of option struct
definition:
struct option {
const char *name; // param name
int has_arg; // set 1 or 0 (no)
int *flag; // always 0
int val; // whatever, 1 byte, used for switch block identification in future
};
example:
static struct option long_options[] = {
{"file", 1, 0, 'f'},
{"elf", 1, 0, 'e'},
NULL
};
example
static int parse_options(int argc, char *argv[], struct gwdown_ctx *ctx)
{
int ret = 0;
while (1) {
int c;
c = getopt_long(argc, argv, "hvo:t:rVM", long_options, NULL);
if (c == -1)
break;
switch (c) {
case 'h':
help(argv[0]);
ret = 255;
goto out;
case 'v':
printf("gwdown 0.1\n");
ret = 255;
goto out;
case 'o':
ctx->output = optarg;
break;
case 't':
ctx->num_threads = (uint16_t)atoi(optarg);
break;
case 'r':
ctx->resume = true;
break;
case 'V':
ctx->verbose = true;
break;
case 'M':
ctx->use_mmap = true;
break;
default:
printf("Error: Unknown option '%s'\n\n", argv[optind]);
help(argv[0]);
ret = -EINVAL;
goto out;
}
}
if (ctx->num_threads > 512) {
printf("Error: Too many threads, max allowed thread is 512\n\n");
ret = -EINVAL;
goto out;
}
if (optind < argc) {
ctx->url = strdup(argv[optind]);
if (!ctx->url)
ret = -ENOMEM;
} else {
printf("Error: Missing url argument\n\n");
help(argv[0]);
ret = -EINVAL;
}
if (ctx->resume) {
printf("Error: The resume feature is currently not supproted\n");
printf(" It's still just a draft feature\n\n");
ret = -EOPNOTSUPP;
}
out:
return ret;
}
as you can see, optarg is magically return current character based on switch case cond
POSIX getopt (only)
its parse command line like this
no args params
this option did not receive any arguments, so the optarg value is will be null
./prog -v
, use optstring something like this v
optional params
./prog -p=8000 -l=127.0.0.1
, use optsting p::l::
this is wrong example
this is good example
required params
./prog -p 8000 -l 0.0.0.0
use optstring p:l:
unknown option handling
the handling is very easy, getopt()
return ?
when undefined rule is provided, then you can use optopt
as a handler