summary refs log tree commit diff
path: root/src/nm-daemon-helper/nm-daemon-helper.c
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2021-10-01 23:05:04 +0200
committerMichael Biebl <biebl@debian.org>2021-10-01 23:05:04 +0200
commite74c568b07b50b97873fb4ee1d776dedefbd54d6 (patch)
tree3469f17ea9af91f7ff169b890633bda68b0cf76e /src/nm-daemon-helper/nm-daemon-helper.c
parentbfe522304da217296e2a61040f58e35ec5d6f3f2 (diff)
New upstream version 1.32.12 upstream/1.32.12
Diffstat (limited to 'src/nm-daemon-helper/nm-daemon-helper.c')
-rw-r--r--src/nm-daemon-helper/nm-daemon-helper.c116
1 files changed, 116 insertions, 0 deletions
diff --git a/src/nm-daemon-helper/nm-daemon-helper.c b/src/nm-daemon-helper/nm-daemon-helper.c
new file mode 100644
index 00000000..e91e7184
--- /dev/null
+++ b/src/nm-daemon-helper/nm-daemon-helper.c
@@ -0,0 +1,116 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+/* Copyright (C) 2021 Red Hat, Inc. */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#if defined(__GLIBC__)
+    #include <nss.h>
+#endif
+
+#include "libnm-std-aux/nm-std-aux.h"
+
+enum {
+    RETURN_SUCCESS      = 0,
+    RETURN_INVALID_CMD  = 1,
+    RETURN_INVALID_ARGS = 2,
+    RETURN_ERROR        = 3,
+};
+
+static char *
+read_arg(void)
+{
+    nm_auto_free char *arg = NULL;
+    size_t             len = 0;
+
+    if (getdelim(&arg, &len, '\0', stdin) < 0)
+        return NULL;
+
+    return nm_steal_pointer(&arg);
+}
+
+static int
+more_args(void)
+{
+    nm_auto_free char *arg = NULL;
+
+    arg = read_arg();
+
+    return !!arg;
+}
+
+static int
+cmd_version(void)
+{
+    if (more_args())
+        return RETURN_INVALID_ARGS;
+
+    printf("1");
+    return RETURN_SUCCESS;
+}
+
+static int
+cmd_resolve_address(void)
+{
+    nm_auto_free char *address = NULL;
+    union {
+        struct sockaddr_in  in;
+        struct sockaddr_in6 in6;
+    } sockaddr;
+    socklen_t sockaddr_size;
+    char      name[NI_MAXHOST];
+
+    address = read_arg();
+    if (!address)
+        return RETURN_INVALID_ARGS;
+
+    if (more_args())
+        return RETURN_INVALID_ARGS;
+
+    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;
+        sockaddr_size          = sizeof(struct sockaddr_in);
+    } else if (inet_pton(AF_INET6, address, &sockaddr.in6.sin6_addr) == 1) {
+        sockaddr.in6.sin6_family = AF_INET6;
+        sockaddr_size            = sizeof(struct sockaddr_in6);
+    } else
+        return RETURN_INVALID_ARGS;
+
+    if (getnameinfo((struct sockaddr *) &sockaddr,
+                    sockaddr_size,
+                    name,
+                    sizeof(name),
+                    NULL,
+                    0,
+                    NI_NAMEREQD)
+        != 0)
+        return RETURN_ERROR;
+
+    printf("%s", name);
+
+    return RETURN_SUCCESS;
+}
+
+int
+main(int argc, char **argv)
+{
+    nm_auto_free char *cmd = NULL;
+
+    cmd = read_arg();
+    if (!cmd)
+        return RETURN_INVALID_CMD;
+
+    if (nm_streq(cmd, "version"))
+        return cmd_version();
+    if (nm_streq(cmd, "resolve-address"))
+        return cmd_resolve_address();
+
+    return RETURN_INVALID_CMD;
+}