aboutgitcodebugslistschat
diff options
context:
space:
mode:
authorDavid Gibson <david@gibson.dropbear.id.au>2022-08-26 14:58:33 +1000
committerStefano Brivio <sbrivio@redhat.com>2022-08-30 19:42:52 +0200
commitaae2a9bbf7d1c5144702be4b1a3e496ae24d12aa (patch)
tree7020e7739819cf35519ccc12587cecfaa1fa0bc7
parentbf95322fc1ef2d0d7a21cb0e6a9bf01902024859 (diff)
downloadpasst-aae2a9bbf7d1c5144702be4b1a3e496ae24d12aa.tar
passt-aae2a9bbf7d1c5144702be4b1a3e496ae24d12aa.tar.gz
passt-aae2a9bbf7d1c5144702be4b1a3e496ae24d12aa.tar.bz2
passt-aae2a9bbf7d1c5144702be4b1a3e496ae24d12aa.tar.lz
passt-aae2a9bbf7d1c5144702be4b1a3e496ae24d12aa.tar.xz
passt-aae2a9bbf7d1c5144702be4b1a3e496ae24d12aa.tar.zst
passt-aae2a9bbf7d1c5144702be4b1a3e496ae24d12aa.zip
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>
-rw-r--r--conf.c56
-rw-r--r--passt.17
2 files changed, 36 insertions, 27 deletions
diff --git a/conf.c b/conf.c
index 4eb9e3d..7c4930a 100644
--- a/conf.c
+++ b/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);
diff --git a/passt.1 b/passt.1
index 9bed946..14b01b2 100644
--- a/passt.1
+++ b/passt.1
@@ -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