]> git.proxmox.com Git - systemd.git/blobdiff - src/nss-resolve/nss-resolve.c
New upstream version 242
[systemd.git] / src / nss-resolve / nss-resolve.c
index 8370fed07608b30551e0ce3098351a85897826be..ac5fff523b3fb38cb544f84f67b76c9a5f2a82aa 100644 (file)
@@ -5,17 +5,19 @@
 #include <nss.h>
 #include <stdlib.h>
 #include <string.h>
+#include <sys/types.h>
+#include <unistd.h>
 
 #include "sd-bus.h"
 
 #include "bus-common-errors.h"
+#include "errno-util.h"
 #include "in-addr-util.h"
 #include "macro.h"
 #include "nss-util.h"
 #include "resolved-def.h"
-#include "string-util.h"
-#include "util.h"
 #include "signal-util.h"
+#include "string-util.h"
 
 NSS_GETHOSTBYNAME_PROTOTYPES(resolve);
 NSS_GETHOSTBYADDR_PROTOTYPES(resolve);
@@ -24,7 +26,9 @@ static bool bus_error_shall_fallback(sd_bus_error *e) {
         return sd_bus_error_has_name(e, SD_BUS_ERROR_SERVICE_UNKNOWN) ||
                sd_bus_error_has_name(e, SD_BUS_ERROR_NAME_HAS_NO_OWNER) ||
                sd_bus_error_has_name(e, SD_BUS_ERROR_NO_REPLY) ||
-               sd_bus_error_has_name(e, SD_BUS_ERROR_ACCESS_DENIED);
+               sd_bus_error_has_name(e, SD_BUS_ERROR_ACCESS_DENIED) ||
+               sd_bus_error_has_name(e, SD_BUS_ERROR_DISCONNECTED) ||
+               sd_bus_error_has_name(e, SD_BUS_ERROR_TIMEOUT);
 }
 
 static int count_addresses(sd_bus_message *m, int af, const char **canonical) {
@@ -116,7 +120,6 @@ enum nss_status _nss_resolve_gethostbyname4_r(
         _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         struct gaih_addrtuple *r_tuple, *r_tuple_first = NULL;
         _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
-        enum nss_status ret = NSS_STATUS_UNAVAIL;
         const char *canonical = NULL;
         size_t l, ms, idx;
         char *r_name;
@@ -160,8 +163,7 @@ enum nss_status _nss_resolve_gethostbyname4_r(
 
         r = sd_bus_call(bus, req, SD_RESOLVED_QUERY_TIMEOUT_USEC, &error, &reply);
         if (r < 0) {
-                if (sd_bus_error_has_name(&error, _BUS_ERROR_DNS "NXDOMAIN") ||
-                    !bus_error_shall_fallback(&error))
+                if (!bus_error_shall_fallback(&error))
                         goto not_found;
 
                 /* Return NSS_STATUS_UNAVAIL when communication with systemd-resolved fails,
@@ -271,7 +273,7 @@ fail:
         UNPROTECT_ERRNO;
         *errnop = -r;
         *h_errnop = NO_RECOVERY;
-        return ret;
+        return NSS_STATUS_UNAVAIL;
 
 not_found:
         *h_errnop = HOST_NOT_FOUND;
@@ -291,7 +293,6 @@ enum nss_status _nss_resolve_gethostbyname3_r(
         _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         char *r_name, *r_aliases, *r_addr, *r_addr_list;
         _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
-        enum nss_status ret = NSS_STATUS_UNAVAIL;
         size_t l, idx, ms, alen;
         const char *canonical;
         int c, r, i = 0;
@@ -342,8 +343,7 @@ enum nss_status _nss_resolve_gethostbyname3_r(
 
         r = sd_bus_call(bus, req, SD_RESOLVED_QUERY_TIMEOUT_USEC, &error, &reply);
         if (r < 0) {
-                if (sd_bus_error_has_name(&error, _BUS_ERROR_DNS "NXDOMAIN") ||
-                    !bus_error_shall_fallback(&error))
+                if (!bus_error_shall_fallback(&error))
                         goto not_found;
 
                 goto fail;
@@ -461,7 +461,7 @@ fail:
         UNPROTECT_ERRNO;
         *errnop = -r;
         *h_errnop = NO_RECOVERY;
-        return ret;
+        return NSS_STATUS_UNAVAIL;
 
 not_found:
         *h_errnop = HOST_NOT_FOUND;
@@ -480,7 +480,6 @@ enum nss_status _nss_resolve_gethostbyaddr2_r(
         _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         char *r_name, *r_aliases, *r_addr, *r_addr_list;
         _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
-        enum nss_status ret = NSS_STATUS_UNAVAIL;
         unsigned c = 0, i = 0;
         size_t ms = 0, idx;
         const char *n;
@@ -503,10 +502,8 @@ enum nss_status _nss_resolve_gethostbyaddr2_r(
         }
 
         if (len != FAMILY_ADDRESS_SIZE(af)) {
-                UNPROTECT_ERRNO;
-                *errnop = EINVAL;
-                *h_errnop = NO_RECOVERY;
-                return NSS_STATUS_UNAVAIL;
+                r = -EINVAL;
+                goto fail;
         }
 
         if (avoid_deadlock()) {
@@ -546,8 +543,7 @@ enum nss_status _nss_resolve_gethostbyaddr2_r(
 
         r = sd_bus_call(bus, req, SD_RESOLVED_QUERY_TIMEOUT_USEC, &error, &reply);
         if (r < 0) {
-                if (sd_bus_error_has_name(&error, _BUS_ERROR_DNS "NXDOMAIN") ||
-                    !bus_error_shall_fallback(&error))
+                if (!bus_error_shall_fallback(&error))
                         goto not_found;
 
                 goto fail;
@@ -572,7 +568,7 @@ enum nss_status _nss_resolve_gethostbyaddr2_r(
 
         r = sd_bus_message_rewind(reply, false);
         if (r < 0)
-                return r;
+                goto fail;
 
         if (c <= 0)
                 goto not_found;
@@ -646,7 +642,7 @@ fail:
         UNPROTECT_ERRNO;
         *errnop = -r;
         *h_errnop = NO_RECOVERY;
-        return ret;
+        return NSS_STATUS_UNAVAIL;
 
 not_found:
         *h_errnop = HOST_NOT_FOUND;