mirror of
https://passt.top/passt
synced 2025-06-17 20:55:34 +02:00
conf: Use "-D none" and "-S none" instead of missing empty option arguments
Both the -D (--dns) and -S (--search) options take an optional argument. If the argument is omitted the option is disabled entirely. However, handling the optional argument requires some ugly special case handling if it's the last option on the command line, and has potential ambiguity with non-option arguments used with pasta. It can also make it more confusing to read command lines. Simplify the logic here by replacing the non-argument versions with an explicit "-D none" or "-S none". Signed-off-by: David Gibson <david@gibson.dropbear.id.au> [sbrivio: Reworked logic to exclude redundant/conflicting options] Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
parent
bf95322fc1
commit
aae2a9bbf7
2 changed files with 36 additions and 27 deletions
56
conf.c
56
conf.c
|
@ -1022,8 +1022,8 @@ void conf(struct ctx *c, int argc, char **argv)
|
|||
{"mac-addr", required_argument, NULL, 'M' },
|
||||
{"gateway", required_argument, NULL, 'g' },
|
||||
{"interface", required_argument, NULL, 'i' },
|
||||
{"dns", optional_argument, NULL, 'D' },
|
||||
{"search", optional_argument, NULL, 'S' },
|
||||
{"dns", required_argument, NULL, 'D' },
|
||||
{"search", required_argument, NULL, 'S' },
|
||||
{"no-tcp", no_argument, &c->no_tcp, 1 },
|
||||
{"no-udp", no_argument, &c->no_udp, 1 },
|
||||
{"no-icmp", no_argument, &c->no_icmp, 1 },
|
||||
|
@ -1077,16 +1077,6 @@ void conf(struct ctx *c, int argc, char **argv)
|
|||
|
||||
name = getopt_long(argc, argv, optstring, options, NULL);
|
||||
|
||||
if ((name == 'D' || name == 'S') && !optarg &&
|
||||
optind < argc && *argv[optind] && *argv[optind] != '-') {
|
||||
if (c->mode == MODE_PASTA) {
|
||||
if (conf_ns_opt(c, nsdir, userns, argv[optind]))
|
||||
optarg = argv[optind++];
|
||||
} else {
|
||||
optarg = argv[optind++];
|
||||
}
|
||||
}
|
||||
|
||||
switch (name) {
|
||||
case -1:
|
||||
case 0:
|
||||
|
@ -1397,17 +1387,26 @@ void conf(struct ctx *c, int argc, char **argv)
|
|||
}
|
||||
break;
|
||||
case 'D':
|
||||
if (c->no_dns ||
|
||||
(!optarg && (dns4 - c->ip4.dns || dns6 - c->ip6.dns))) {
|
||||
err("Empty and non-empty DNS options given");
|
||||
usage(argv[0]);
|
||||
}
|
||||
if (!strcmp(optarg, "none")) {
|
||||
if (c->no_dns) {
|
||||
err("Redundant DNS options");
|
||||
usage(argv[0]);
|
||||
}
|
||||
|
||||
if (dns4 - c->ip4.dns || dns6 - c->ip6.dns) {
|
||||
err("Conflicting DNS options");
|
||||
usage(argv[0]);
|
||||
}
|
||||
|
||||
if (!optarg) {
|
||||
c->no_dns = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
if (c->no_dns) {
|
||||
err("Conflicting DNS options");
|
||||
usage(argv[0]);
|
||||
}
|
||||
|
||||
if (dns4 - &c->ip4.dns[0] < ARRAY_SIZE(c->ip4.dns) &&
|
||||
inet_pton(AF_INET, optarg, dns4)) {
|
||||
dns4++;
|
||||
|
@ -1424,17 +1423,26 @@ void conf(struct ctx *c, int argc, char **argv)
|
|||
usage(argv[0]);
|
||||
break;
|
||||
case 'S':
|
||||
if (c->no_dns_search ||
|
||||
(!optarg && dnss != c->dns_search)) {
|
||||
err("Empty and non-empty DNS search given");
|
||||
usage(argv[0]);
|
||||
}
|
||||
if (!strcmp(optarg, "none")) {
|
||||
if (c->no_dns_search) {
|
||||
err("Redundant DNS search options");
|
||||
usage(argv[0]);
|
||||
}
|
||||
|
||||
if (dnss != c->dns_search) {
|
||||
err("Conflicting DNS search options");
|
||||
usage(argv[0]);
|
||||
}
|
||||
|
||||
if (!optarg) {
|
||||
c->no_dns_search = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
if (c->no_dns_search) {
|
||||
err("Conflicting DNS search options");
|
||||
usage(argv[0]);
|
||||
}
|
||||
|
||||
if (dnss - c->dns_search < ARRAY_SIZE(c->dns_search)) {
|
||||
ret = snprintf(dnss->n, sizeof(*c->dns_search),
|
||||
"%s", optarg);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue