[vlc-commits] vlc_getProxyUrl: add function to retrieve proxy URL
Rémi Denis-Courmont
git at videolan.org
Fri Apr 12 18:22:34 CEST 2013
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Fri Apr 12 19:03:54 2013 +0300| [6c34b58e2a3d29d5bd36358e143bcffbb353625e] | committer: Rémi Denis-Courmont
vlc_getProxyUrl: add function to retrieve proxy URL
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=6c34b58e2a3d29d5bd36358e143bcffbb353625e
---
include/vlc_network.h | 3 ++
src/Makefile.am | 3 ++
src/libvlccore.sym | 1 +
src/posix/netconf.c | 113 +++++++++++++++++++++++++++++++++++++++++++++++++
src/win32/netconf.c | 83 ++++++++++++++++++++++++++++++++++++
5 files changed, 203 insertions(+)
diff --git a/include/vlc_network.h b/include/vlc_network.h
index 699e8af..25680cc 100644
--- a/include/vlc_network.h
+++ b/include/vlc_network.h
@@ -373,6 +373,9 @@ static inline void net_SetPort (struct sockaddr *addr, uint16_t port)
break;
}
}
+
+VLC_API char *vlc_getProxyUrl(const char *);
+
# ifdef __cplusplus
}
# endif
diff --git a/src/Makefile.am b/src/Makefile.am
index 9257a0e..2e3da57 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -269,6 +269,7 @@ SOURCES_libvlc_android = \
SOURCES_libvlc_linux = \
posix/dirs.c \
posix/filesystem.c \
+ posix/netconf.c \
posix/plugin.c \
posix/thread.c \
posix/timer.c \
@@ -281,6 +282,7 @@ SOURCES_libvlc_linux = \
SOURCES_libvlc_win32 = \
win32/dirs.c \
win32/filesystem.c \
+ win32/netconf.c \
win32/plugin.c \
win32/thread.c \
win32/specific.c \
@@ -308,6 +310,7 @@ SOURCES_libvlc_os2 = \
SOURCES_libvlc_other = \
posix/dirs.c \
posix/filesystem.c \
+ posix/netconf.c \
posix/thread.c \
posix/timer.c \
posix/plugin.c \
diff --git a/src/libvlccore.sym b/src/libvlccore.sym
index e657854..ddae89b 100644
--- a/src/libvlccore.sym
+++ b/src/libvlccore.sym
@@ -506,6 +506,7 @@ vlc_fourcc_AreUVPlanesSwapped
vlc_GetActionId
vlc_getaddrinfo
vlc_getnameinfo
+vlc_getProxyUrl
vlc_gettext
vlc_ngettext
vlc_iconv
diff --git a/src/posix/netconf.c b/src/posix/netconf.c
new file mode 100644
index 0000000..f5a61c3
--- /dev/null
+++ b/src/posix/netconf.c
@@ -0,0 +1,113 @@
+/*****************************************************************************
+ * netconf.c : Network configuration
+ *****************************************************************************
+ * Copyright (C) 2013 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 <stdlib.h>
+#include <string.h>
+#include <signal.h>
+
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <fcntl.h>
+#include <spawn.h>
+#include <unistd.h>
+
+extern char **environ;
+
+#include <vlc_common.h>
+#include <vlc_fs.h>
+#include <vlc_network.h>
+
+/**
+ * Determines the network proxy server to use (if any).
+ * @param url absolute URL for which to get the proxy server
+ * @return proxy URL, NULL if no proxy or error
+ */
+char *vlc_getProxyUrl(const char *url)
+{
+ /* libproxy helper */
+ pid_t pid;
+ posix_spawn_file_actions_t actions;
+ posix_spawnattr_t attr;
+ char *argv[3] = { (char *)"proxy", (char *)url, NULL };
+ int fd[2];
+
+ if (vlc_pipe(fd))
+ return NULL;
+
+ posix_spawn_file_actions_init(&actions);
+ posix_spawn_file_actions_addopen(&actions, STDIN_FILENO, "/dev/null",
+ O_RDONLY, 0644);
+ posix_spawn_file_actions_adddup2(&actions, fd[1], STDOUT_FILENO);
+
+ posix_spawnattr_init(&attr);
+ {
+ sigset_t set;
+
+ sigemptyset(&set);
+ posix_spawnattr_setsigmask(&attr, &set);
+ sigaddset (&set, SIGPIPE);
+ posix_spawnattr_setsigdefault(&attr, &set);
+ posix_spawnattr_setflags(&attr, POSIX_SPAWN_SETSIGDEF
+ | POSIX_SPAWN_SETSIGMASK);
+ }
+
+ if (posix_spawnp(&pid, "proxy", &actions, &attr, argv, environ))
+ pid = -1;
+
+ posix_spawnattr_destroy(&attr);
+ posix_spawn_file_actions_destroy(&actions);
+ close(fd[1]);
+
+ if (pid != -1)
+ {
+ char buf[1024];
+ size_t len = 0;
+
+ do
+ {
+ ssize_t val = read(fd[0], buf + len, sizeof (buf) - len);
+ if (val <= 0)
+ break;
+ }
+ while (len < sizeof (buf));
+
+ close(fd[0]);
+ while (waitpid(pid, &(int){ 0 }, 0) == -1);
+
+ if (len >= sizeof (buf))
+ return NULL; /* overflow */
+ if (len >= 9 && !strncasecmp(buf, "direct://", 9))
+ return NULL;
+ if (len > 0)
+ return strndup(buf, len);
+ }
+ else
+ close(fd[0]);
+
+ /* Fallback to environment variable */
+ char *var = getenv("http_proxy");
+ if (var != NULL)
+ var = strdup(var);
+ return var;
+}
diff --git a/src/win32/netconf.c b/src/win32/netconf.c
new file mode 100644
index 0000000..f1e0707
--- /dev/null
+++ b/src/win32/netconf.c
@@ -0,0 +1,83 @@
+/*****************************************************************************
+ * netconf.c : Network configuration
+ *****************************************************************************
+ * Copyright (C) 2001-2008 VLC authors and VideoLAN
+ *
+ * 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 <string.h>
+#include <windows.h>
+
+#include <vlc_common.h>
+#include <vlc_network.h>
+
+char *vlc_getProxyUrl(const char *url)
+{
+ char *proxy_url = NULL;
+#if 0
+ /* Try to get the proxy server address from Windows internet settings. */
+ HKEY h_key;
+
+ /* Open the key */
+ if( RegOpenKeyEx( HKEY_CURRENT_USER, "Software\\Microsoft"
+ "\\Windows\\CurrentVersion\\Internet Settings",
+ 0, KEY_READ, &h_key ) == ERROR_SUCCESS )
+ return NULL;
+
+ DWORD len = sizeof( DWORD );
+ BYTE proxyEnable;
+
+ /* Get the proxy enable value */
+ if( RegQueryValueEx( h_key, "ProxyEnable", NULL, NULL,
+ &proxyEnable, &len ) != ERROR_SUCCESS
+ || !proxyEnable )
+ goto out;
+
+ /* Proxy is enabled */
+ /* Get the proxy URL :
+ Proxy server value in the registry can be something like "address:port"
+ or "ftp=address1:port1;http=address2:port2 ..."
+ depending of the confirguration. */
+ unsigned char key[256];
+
+ len = sizeof( key );
+ if( RegQueryValueEx( h_key, "ProxyServer", NULL, NULL,
+ key, &len ) == ERROR_SUCCESS )
+ {
+ /* FIXME: This is lame. The string should be tokenized. */
+#warning FIXME.
+ char *psz_proxy = strstr( (char *)key, "http=" );
+ if( psz_proxy != NULL )
+ {
+ psz_proxy += 5;
+ char *end = strchr( psz_proxy, ';' );
+ if( end != NULL )
+ *end = '\0';
+ }
+ else
+ psz_proxy = (char *)key;
+ proxy_url = strdup( psz_proxy );
+ }
+
+out:
+ RegCloseKey( h_key );
+#endif
+ return proxy_url;
+}
More information about the vlc-commits
mailing list