vlc | branch: master | Rémi Denis-Courmont <[email protected]> | 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) _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
