1
0
mirror of https://passt.top/passt synced 2024-07-01 23:42:41 +00: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:
David Gibson 2022-08-26 14:58:33 +10:00 committed by Stefano Brivio
parent bf95322fc1
commit aae2a9bbf7
2 changed files with 36 additions and 27 deletions

56
conf.c
View File

@ -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);

View File

@ -171,7 +171,7 @@ version.
Use \fIaddr\fR (IPv4 or IPv6) for DHCP, DHCPv6, NDP or DNS forwarding, as
configured (see options \fB--no-dhcp-dns\fR, \fB--dhcp-dns\fR,
\fB--dns-forward\fR) instead of reading addresses from \fI/etc/resolv.conf\fR.
This option can be specified multiple times, and a single, empty option disables
This option can be specified multiple times. Specifying \fB-D none\fR disables
usage of DNS addresses altogether.
.TP
@ -186,8 +186,9 @@ This option can be specified zero to two times (once for IPv4, once for IPv6).
.BR \-S ", " \-\-search " " \fIlist
Use space-separated \fIlist\fR for DHCP, DHCPv6, and NDP purposes, instead of
reading entries from \fI/etc/resolv.conf\fR. See options \fB--no-dhcp-search\fR
and \fB--dhcp-search\fR. A single, empty option disables the DNS domain search
list altogether.
and \fB--dhcp-search\fR. \fB--search none\fR disables the DNS domain search
list altogether (if you need to search a domain called "none" you can use
\fB--search none.\fR).
.TP
.BR \-\-no-dhcp-dns " " \fIaddr