[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