[vlc-commits] linux: implement vlc_getaddrinfo_i11e()

Rémi Denis-Courmont git at videolan.org
Sun Oct 30 21:52:36 CET 2016


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sun Oct 30 22:12:17 2016 +0200| [1a6dada36a4d5570a57e9f60b92d09db68313564] | committer: Rémi Denis-Courmont

linux: implement vlc_getaddrinfo_i11e()

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=1a6dada36a4d5570a57e9f60b92d09db68313564
---

 src/Makefile.am           | 22 +++++++-----
 src/linux/getaddrinfo.c   | 90 +++++++++++++++++++++++++++++++++++++++++++++++
 src/network/getaddrinfo.c |  3 +-
 3 files changed, 105 insertions(+), 10 deletions(-)

diff --git a/src/Makefile.am b/src/Makefile.am
index dbb1d05..bd8297e 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -347,6 +347,10 @@ libvlccore_la_SOURCES = \
 	misc/text_style.c \
 	misc/subpicture.c \
 	misc/subpicture.h
+libvlccore_la_LIBADD = $(LIBS_libvlccore) \
+	../compat/libcompat.la \
+	$(LTLIBINTL) $(LTLIBICONV) \
+	$(IDN_LIBS) $(LIBPTHREAD) $(SOCKET_LIBS) $(LIBRT) $(LIBDL) $(LIBM)
 
 if HAVE_WIN32
 libvlccore_la_SOURCES += \
@@ -379,7 +383,6 @@ libvlccore_la_SOURCES += \
 else
 libvlccore_la_SOURCES += \
 	posix/filesystem.c \
-	posix/getaddrinfo.c \
 	posix/plugin.c \
 	posix/rand.c \
 	posix/timer.c
@@ -403,15 +406,20 @@ libvlccore_la_SOURCES += \
 	posix/netconf.c \
 	posix/specific.c \
 	posix/thread.c
-endif
-endif
-endif
-endif
 if HAVE_LINUX
 libvlccore_la_SOURCES += \
 	linux/cpu.c \
 	linux/dirs.c \
+	linux/getaddrinfo.c \
 	linux/thread.c
+libvlccore_la_LIBADD += -lanl
+else
+libvlccore_la_SOURCES += \
+	posix/getaddrinfo.c
+endif
+endif
+endif
+endif
 endif
 
 if BUILD_HTTPD
@@ -432,10 +440,6 @@ libvlccore_la_LDFLAGS = \
 	-no-undefined \
 	-export-symbols $(srcdir)/libvlccore.sym \
 	-version-info 8:0:0
-libvlccore_la_LIBADD = $(LIBS_libvlccore) \
-	../compat/libcompat.la \
-	$(LTLIBINTL) $(LTLIBICONV) \
-	$(IDN_LIBS) $(LIBPTHREAD) $(SOCKET_LIBS) $(LIBRT) $(LIBDL) $(LIBM)
 libvlccore_la_DEPENDENCIES = libvlccore.sym
 if HAVE_WIN32
 libvlccore_la_DEPENDENCIES += libvlc_win32_rc.$(OBJEXT)
diff --git a/src/linux/getaddrinfo.c b/src/linux/getaddrinfo.c
new file mode 100644
index 0000000..0df6db0
--- /dev/null
+++ b/src/linux/getaddrinfo.c
@@ -0,0 +1,90 @@
+/*****************************************************************************
+ * linux/getaddrinfo.c: interruptible DNS resolution for Linux
+ *****************************************************************************
+ * Copyright (C) 2016 Rémi Denis-Courmont
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <assert.h>
+#include <stdio.h>
+#include <netdb.h>
+
+#include <vlc_common.h>
+#include <vlc_interrupt.h>
+#include <vlc_network.h>
+
+static void vlc_getaddrinfo_notify(union sigval val)
+{
+    vlc_sem_post(val.sival_ptr);
+}
+
+int vlc_getaddrinfo_i11e(const char *name, unsigned port,
+                         const struct addrinfo *hints,
+                         struct addrinfo **res)
+{
+    struct gaicb req =
+    {
+        .ar_name = name,
+        .ar_service = NULL,
+        .ar_request = hints,
+    };
+    char portbuf[6];
+    vlc_sem_t done;
+
+    if (port != 0)
+    {
+        if ((size_t)snprintf(portbuf, sizeof (portbuf), "%u",
+                             port) >= sizeof (portbuf))
+            return EAI_NONAME;
+
+        req.ar_service = portbuf;
+    }
+
+    struct sigevent sev =
+    {
+        .sigev_notify = SIGEV_THREAD,
+        .sigev_value = { .sival_ptr = &done, },
+        .sigev_notify_function = vlc_getaddrinfo_notify,
+    };
+
+    vlc_sem_init(&done, 0);
+
+    int val = getaddrinfo_a(GAI_NOWAIT, &(struct gaicb *){ &req }, 1, &sev);
+    if (val)
+    {
+        vlc_sem_destroy(&done);
+        return val;
+    }
+
+    vlc_sem_wait_i11e(&done);
+
+    if (gai_cancel(&req) == EAI_CANCELED)
+        vlc_sem_wait(&done);
+
+    while (gai_suspend(&(const struct gaicb *){ &req }, 1, NULL) == EAI_INTR);
+
+    val = gai_error(&req);
+    assert(val != EAI_INPROGRESS);
+
+    if (val == 0)
+        *res = req.ar_result;
+
+    return val;
+}
diff --git a/src/network/getaddrinfo.c b/src/network/getaddrinfo.c
index 5cc7dca..d50c187 100644
--- a/src/network/getaddrinfo.c
+++ b/src/network/getaddrinfo.c
@@ -120,7 +120,8 @@ int vlc_getaddrinfo (const char *node, unsigned port,
     return getaddrinfo (node, servname, hints, res);
 }
 
-#if defined (_WIN32) || defined (__OS2__)
+#if defined (_WIN32) || defined (__OS2__) \
+ || defined (__ANDROID__) || defined (__APPLE__)
 #warning vlc_getaddr_info_i11e() not implemented!
 int vlc_getaddrinfo_i11e(const char *node, unsigned port,
                          const struct addrinfo *hints, struct addrinfo **res)



More information about the vlc-commits mailing list