[vlc-commits] posix: 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:34:16 2016 +0200| [02789c40d6b2ed57c1526aa64c694b0f4b78ad98] | committer: Rémi Denis-Courmont
posix: implement vlc_getaddrinfo_i11e()
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=02789c40d6b2ed57c1526aa64c694b0f4b78ad98
---
src/Makefile.am | 1 +
src/network/getaddrinfo.c | 2 ++
src/posix/getaddrinfo.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 95 insertions(+)
diff --git a/src/Makefile.am b/src/Makefile.am
index fd76170..dbb1d05 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -379,6 +379,7 @@ libvlccore_la_SOURCES += \
else
libvlccore_la_SOURCES += \
posix/filesystem.c \
+ posix/getaddrinfo.c \
posix/plugin.c \
posix/rand.c \
posix/timer.c
diff --git a/src/network/getaddrinfo.c b/src/network/getaddrinfo.c
index ecbd367..5cc7dca 100644
--- a/src/network/getaddrinfo.c
+++ b/src/network/getaddrinfo.c
@@ -120,9 +120,11 @@ int vlc_getaddrinfo (const char *node, unsigned port,
return getaddrinfo (node, servname, hints, res);
}
+#if defined (_WIN32) || defined (__OS2__)
#warning vlc_getaddr_info_i11e() not implemented!
int vlc_getaddrinfo_i11e(const char *node, unsigned port,
const struct addrinfo *hints, struct addrinfo **res)
{
return vlc_getaddrinfo(node, port, hints, res);
}
+#endif
diff --git a/src/posix/getaddrinfo.c b/src/posix/getaddrinfo.c
new file mode 100644
index 0000000..4863bea
--- /dev/null
+++ b/src/posix/getaddrinfo.c
@@ -0,0 +1,92 @@
+/*****************************************************************************
+ * posix/getaddrinfo.c: interruptible DNS resolution for POSIX
+ *****************************************************************************
+ * 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>
+
+struct vlc_gai_req
+{
+ const char *name;
+ const char *service;
+ const struct addrinfo *hints;
+ struct addrinfo *result;
+ int error;
+ vlc_sem_t done;
+};
+
+static void *vlc_gai_thread(void *data)
+{
+ struct vlc_gai_req *req = data;
+
+ req->error = EAI_SYSTEM;
+ req->error = getaddrinfo(req->name, req->service, req->hints,
+ &req->result);
+ vlc_sem_post(&req->done);
+ return NULL;
+}
+
+int vlc_getaddrinfo_i11e(const char *name, unsigned port,
+ const struct addrinfo *hints,
+ struct addrinfo **res)
+{
+ struct vlc_gai_req req =
+ {
+ .name = name,
+ .service = NULL,
+ .hints = hints,
+ };
+ char portbuf[6];
+ vlc_thread_t th;
+
+ if (port != 0)
+ {
+ if ((size_t)snprintf(portbuf, sizeof (portbuf), "%u",
+ port) >= sizeof (portbuf))
+ return EAI_NONAME;
+
+ req.service = portbuf;
+ }
+
+ vlc_sem_init(&req.done, 0);
+
+ if (vlc_clone(&th, vlc_gai_thread, &req, VLC_THREAD_PRIORITY_LOW))
+ {
+ vlc_sem_destroy(&req.done);
+ return EAI_SYSTEM;
+ }
+
+ vlc_sem_wait_i11e(&req.done);
+
+ vlc_cancel(th);
+ vlc_join(th, NULL);
+ vlc_sem_destroy(&req.done);
+
+ *res = req.result;
+ return req.error;
+}
More information about the vlc-commits
mailing list