[systemd-devel] [RFC] socket-proxyd: resolve addrinfo using sd-resolve

Daniel Buch boogiewasthere at gmail.com
Thu Feb 20 12:11:48 PST 2014


Hi,

Hope this is not completly ridiculous?
I havnt tested this since im not entirely sure how to do it.
So tips and comments regarding that are very welcome, im tempt to research further and maybe eventually provide a test for socket-proxy.

Best regards.

---
 Makefile.am                      |  4 +++-
 TODO                             |  2 --
 src/socket-proxy/socket-proxyd.c | 29 +++++++++++++++++++++++------
 3 files changed, 26 insertions(+), 9 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index 03a65bf..a50a032 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -195,6 +195,7 @@ AM_CPPFLAGS = \
 	-I $(top_builddir)/src/udev \
 	-I $(top_srcdir)/src/libsystemd/sd-bus \
 	-I $(top_srcdir)/src/libsystemd/sd-event \
+	-I $(top_srcdir)/src/libsystemd/sd-resolve \
 	-I $(top_srcdir)/src/libsystemd/sd-rtnl \
 	$(OUR_CPPFLAGS)
 
@@ -3315,7 +3316,8 @@ systemd_socket_proxyd_LDADD = \
 	libsystemd-logs.la \
 	libsystemd-internal.la \
 	libsystemd-journal-internal.la \
-	libsystemd-shared.la
+	libsystemd-shared.la \
+	-lresolv
 
 # ------------------------------------------------------------------------------
 if ENABLE_COREDUMP
diff --git a/TODO b/TODO
index 0ae1427..c6ccc8c 100644
--- a/TODO
+++ b/TODO
@@ -113,8 +113,6 @@ Features:
 
 * Automatically configure swap partition to use for hibernation by looking for largest swap partition on the root disk?
 
-* socket-proxyd: Use sd-resolve to resolve the server address
-
 * rfkill,backlight: we probably should run the load tools inside of the udev rules so that the state is properly initialized by the time other software sees it
 
 * move config_parse_path_strv() out of conf-parser.c
diff --git a/src/socket-proxy/socket-proxyd.c b/src/socket-proxy/socket-proxyd.c
index a42e5ae..cd9b95b 100644
--- a/src/socket-proxy/socket-proxyd.c
+++ b/src/socket-proxy/socket-proxyd.c
@@ -40,13 +40,12 @@
 #include "build.h"
 #include "set.h"
 #include "path-util.h"
+#include "sd-resolve.h"
+#include "resolve-util.h"
 
 #define BUFFER_SIZE (256 * 1024)
 #define CONNECTIONS_MAX 256
 
-#define _cleanup_freeaddrinfo_ _cleanup_(freeaddrinfop)
-DEFINE_TRIVIAL_CLEANUP_FUNC(struct addrinfo *, freeaddrinfo);
-
 typedef struct Context {
         Set *listen;
         Set *connections;
@@ -125,7 +124,9 @@ static int get_remote_sockaddr(union sockaddr_union *sa, socklen_t *salen) {
                 *salen = offsetof(union sockaddr_union, un.sun_path) + 1 + strlen(sa->un.sun_path + 1);
 
         } else {
-                _cleanup_freeaddrinfo_ struct addrinfo *result = NULL;
+                _cleanup_resolve_unref_ sd_resolve *resolve = NULL;
+                _cleanup_resolve_addrinfo_free_ struct addrinfo *result = NULL;
+                sd_resolve_query *q = NULL;
                 const char *node, *service;
 
                 struct addrinfo hints = {
@@ -134,6 +135,10 @@ static int get_remote_sockaddr(union sockaddr_union *sa, socklen_t *salen) {
                         .ai_flags = AI_ADDRCONFIG
                 };
 
+                r = sd_resolve_new(&resolve);
+                if (r < 0)
+                        return -ENOMEM;
+
                 service = strrchr(arg_remote_host, ':');
                 if (service) {
                         node = strndupa(arg_remote_host, service - arg_remote_host);
@@ -144,8 +149,20 @@ static int get_remote_sockaddr(union sockaddr_union *sa, socklen_t *salen) {
                 }
 
                 log_debug("Looking up address info for %s:%s", node, service);
-                r = getaddrinfo(node, service, &hints, &result);
-                if (r != 0) {
+                r = sd_resolve_getaddrinfo(resolve, &q, node, service, &hints);
+                if (r < 0)
+                        log_error("Error: %s %d\n", gai_strerror(r), r);
+
+                while (!sd_resolve_is_done(q)) {
+                        r = sd_resolve_wait(resolve, (uint64_t) -1);
+                        if (r < 0) {
+                                log_error("Error: %s\n", strerror(-r));
+                                assert_not_reached("sd_resolve_wait() failed");
+                        }
+                }
+
+                r = sd_resolve_getaddrinfo_done(q, &result);
+                if (r < 0) {
                         log_error("Failed to resolve host %s:%s: %s", node, service, gai_strerror(r));
                         return -EHOSTUNREACH;
                 }
-- 
1.9.0



More information about the systemd-devel mailing list