resolvectl: fix query option handling and resolvconf input errors (#43370)
This commit is contained in:
@@ -116,7 +116,9 @@ static int parse_stdin(LookupType lookup_type) {
|
||||
|
||||
a = first_word(line, "nameserver");
|
||||
if (a) {
|
||||
(void) parse_nameserver(a);
|
||||
r = parse_nameserver(a);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to parse resolv.conf nameserver line: %m");
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -124,7 +126,9 @@ static int parse_stdin(LookupType lookup_type) {
|
||||
if (!a)
|
||||
a = first_word(line, "search");
|
||||
if (a) {
|
||||
(void) parse_search_domain(a);
|
||||
r = parse_search_domain(a);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to parse resolv.conf domain/search line: %m");
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
@@ -71,6 +71,7 @@ static sd_json_format_flags_t arg_json_format_flags = SD_JSON_FORMAT_OFF;
|
||||
static PagerFlags arg_pager_flags = 0;
|
||||
bool arg_ifindex_permissive = false; /* If true, don't generate an error if the specified interface index doesn't exist */
|
||||
static const char *arg_service_family = NULL;
|
||||
static bool arg_service_txt_set = false;
|
||||
static bool arg_ask_password = true;
|
||||
|
||||
typedef enum RawType {
|
||||
@@ -893,6 +894,10 @@ static int verb_query(int argc, char *argv[], uintptr_t _data, void *userdata) {
|
||||
int family, ifindex;
|
||||
union in_addr_union a;
|
||||
|
||||
if (arg_raw != RAW_NONE)
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||
"--raw may only be combined with --type= or dns: URIs.");
|
||||
|
||||
r = in_addr_ifindex_from_string_auto(*p, &family, &a, &ifindex);
|
||||
if (r >= 0)
|
||||
RET_GATHER(ret, resolve_address(family, &a, ifindex));
|
||||
@@ -904,7 +909,7 @@ static int verb_query(int argc, char *argv[], uintptr_t _data, void *userdata) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int resolve_service(const char *name, const char *type, const char *domain) {
|
||||
static int resolve_service(const char *name, const char *type, const char *domain, uint64_t flags) {
|
||||
int r;
|
||||
|
||||
assert(domain);
|
||||
@@ -938,7 +943,7 @@ static int resolve_service(const char *name, const char *type, const char *domai
|
||||
JSON_BUILD_PAIR_STRING_NON_EMPTY("type", type),
|
||||
JSON_BUILD_PAIR_CONDITION_UNSIGNED(arg_ifindex > 0, "ifindex", arg_ifindex),
|
||||
JSON_BUILD_PAIR_CONDITION_UNSIGNED(arg_family != AF_UNSPEC, "family", arg_family),
|
||||
JSON_BUILD_PAIR_UNSIGNED_NON_ZERO("flags", arg_flags));
|
||||
JSON_BUILD_PAIR_UNSIGNED_NON_ZERO("flags", flags));
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to issue varlink call: %m");
|
||||
|
||||
@@ -1019,15 +1024,20 @@ static int resolve_service(const char *name, const char *type, const char *domai
|
||||
VERB(verb_service, "service", "[[NAME] TYPE] DOMAIN", 2, 4, 0,
|
||||
"Resolve service (SRV)");
|
||||
static int verb_service(int argc, char *argv[], uintptr_t _data, void *userdata) {
|
||||
uint64_t flags = arg_flags;
|
||||
|
||||
if (sd_json_format_enabled(arg_json_format_flags))
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "Use --json=pretty with --type= to acquire resource record information in JSON format.");
|
||||
|
||||
if (argc < 4 && !arg_service_txt_set)
|
||||
flags |= SD_RESOLVED_NO_TXT;
|
||||
|
||||
if (argc == 2)
|
||||
return resolve_service(NULL, NULL, argv[1]);
|
||||
else if (argc == 3)
|
||||
return resolve_service(NULL, argv[1], argv[2]);
|
||||
else
|
||||
return resolve_service(argv[1], argv[2], argv[3]);
|
||||
return resolve_service(NULL, NULL, argv[1], flags);
|
||||
if (argc == 3)
|
||||
return resolve_service(NULL, argv[1], argv[2], flags);
|
||||
|
||||
return resolve_service(argv[1], argv[2], argv[3], flags);
|
||||
}
|
||||
|
||||
#if HAVE_OPENSSL
|
||||
@@ -3363,6 +3373,7 @@ static int compat_parse_argv(int argc, char *argv[], char ***remaining_args) {
|
||||
if (r < 0)
|
||||
return r;
|
||||
SET_FLAG(arg_flags, SD_RESOLVED_NO_TXT, r == 0);
|
||||
arg_service_txt_set = true;
|
||||
break;
|
||||
|
||||
OPTION_LONG("openpgp", NULL, "Query OpenPGP public key"):
|
||||
@@ -3597,6 +3608,7 @@ static int native_parse_argv(int argc, char *argv[], char ***remaining_args) {
|
||||
if (r < 0)
|
||||
return r;
|
||||
SET_FLAG(arg_flags, SD_RESOLVED_NO_TXT, r == 0);
|
||||
arg_service_txt_set = true;
|
||||
break;
|
||||
|
||||
OPTION_LONG("cname", "BOOL", "Follow CNAME redirects (default: yes)"):
|
||||
|
||||
Reference in New Issue
Block a user