summary refs log tree commit diff
path: root/src/nm-daemon-helper
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2024-07-05 18:15:13 +0200
committerMichael Biebl <biebl@debian.org>2024-07-05 18:15:13 +0200
commit58affb29b8386d6d26359da604a64fefe7ae0a60 (patch)
tree6c0c9b519e431ca178070c89f516dbaa660bbddb /src/nm-daemon-helper
parent8e2fde558a5af5c3b03a5112dbd8f9085c5a8369 (diff)
New upstream version 1.48.4 upstream/1.48.4
Diffstat (limited to 'src/nm-daemon-helper')
-rw-r--r--src/nm-daemon-helper/nm-daemon-helper.c67
1 files changed, 45 insertions, 22 deletions
diff --git a/src/nm-daemon-helper/nm-daemon-helper.c b/src/nm-daemon-helper/nm-daemon-helper.c
index 810ea5fa..32be93a4 100644
--- a/src/nm-daemon-helper/nm-daemon-helper.c
+++ b/src/nm-daemon-helper/nm-daemon-helper.c
@@ -55,26 +55,31 @@ cmd_version(void)
 static int
 cmd_resolve_address(void)
 {
-    nm_auto_free char *address = NULL;
+    nm_auto_free char *address  = NULL;
+    nm_auto_free char *services = NULL;
     union {
         struct sockaddr_in  in;
         struct sockaddr_in6 in6;
     } sockaddr;
     socklen_t sockaddr_size;
     char      name[NI_MAXHOST];
+    char     *saveptr = NULL;
+    char     *service;
+    char     *str;
     int       ret;
 
     address = read_arg();
     if (!address)
         return RETURN_INVALID_ARGS;
 
-    if (more_args())
-        return RETURN_INVALID_ARGS;
+    services = read_arg();
+    if (!services) {
+        /* Called by an old NM version which doesn't support the 'services'
+         * argument. Use both services. */
+        services = strdup("dns,files");
+    }
 
     memset(&sockaddr, 0, sizeof(sockaddr));
-#if defined(__GLIBC__)
-    __nss_configure_lookup("hosts", "dns");
-#endif
 
     if (inet_pton(AF_INET, address, &sockaddr.in.sin_addr) == 1) {
         sockaddr.in.sin_family = AF_INET;
@@ -85,33 +90,51 @@ cmd_resolve_address(void)
     } else
         return RETURN_INVALID_ARGS;
 
-    ret = getnameinfo((struct sockaddr *) &sockaddr,
-                      sockaddr_size,
-                      name,
-                      sizeof(name),
-                      NULL,
-                      0,
-                      NI_NAMEREQD);
-    if (ret != 0) {
-        if (ret == EAI_SYSTEM) {
-            int  errsv = errno;
+    for (str = services; (service = strtok_r(str, ",", &saveptr)); str = NULL) {
+        if (!NM_IN_STRSET(service, "dns", "files")) {
+            fprintf(stderr, "Unsupported resolver service '%s'\n", service);
+            continue;
+        }
+
+#if defined(__GLIBC__)
+        __nss_configure_lookup("hosts", service);
+#endif
+
+        ret = getnameinfo((struct sockaddr *) &sockaddr,
+                          sockaddr_size,
+                          name,
+                          sizeof(name),
+                          NULL,
+                          0,
+                          NI_NAMEREQD);
+
+        if (ret == 0) {
+            printf("%s", name);
+            return RETURN_SUCCESS;
+        } else if (ret == EAI_SYSTEM) {
             char buf[1024];
+            int  errsv = errno;
 
             fprintf(stderr,
-                    "getnameinfo() failed: %d (%s), system error: %d (%s)\n",
+                    "getnameinfo() via service '%s' failed: %d (%s), system error: %d (%s)\n",
+                    service,
                     ret,
                     gai_strerror(ret),
                     errsv,
                     _nm_strerror_r(errsv, buf, sizeof(buf)));
         } else {
-            fprintf(stderr, "getnameinfo() failed: %d (%s)\n", ret, gai_strerror(ret));
+            fprintf(stderr,
+                    "getnameinfo() via service '%s' failed: %d (%s)\n",
+                    service,
+                    ret,
+                    gai_strerror(ret));
         }
-        return RETURN_ERROR;
+#if !defined(__GLIBC__)
+        break;
+#endif
     }
 
-    printf("%s", name);
-
-    return RETURN_SUCCESS;
+    return RETURN_ERROR;
 }
 
 int