[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