diff options
-rw-r--r-- | Makefile.am | 2 | ||||
-rw-r--r-- | src/client_new.c | 2 | ||||
-rw-r--r-- | src/output/httpd_output_plugin.c | 2 | ||||
-rw-r--r-- | src/resolver.c | 83 | ||||
-rw-r--r-- | src/resolver.h | 40 | ||||
-rw-r--r-- | src/server_socket.c | 1 | ||||
-rw-r--r-- | src/socket_util.c | 50 | ||||
-rw-r--r-- | src/socket_util.h | 13 |
8 files changed, 128 insertions, 65 deletions
diff --git a/Makefile.am b/Makefile.am index 7cd4d1615..9e7095159 100644 --- a/Makefile.am +++ b/Makefile.am @@ -354,6 +354,7 @@ src_mpd_SOURCES = \ src/song_print.c \ src/song_save.c \ src/songvec.c \ + src/resolver.c src/resolver.h \ src/socket_util.c \ src/state_file.c \ src/stats.c \ @@ -1144,6 +1145,7 @@ test_run_output_SOURCES = test/run_output.c \ src/fifo_buffer.c \ src/page.c \ src/socket_util.c \ + src/resolver.c \ src/output_init.c src/output_finish.c src/output_list.c \ src/output_plugin.c \ $(ENCODER_SRC) \ diff --git a/src/client_new.c b/src/client_new.c index 1145c0236..cf28c43c5 100644 --- a/src/client_new.c +++ b/src/client_new.c @@ -21,7 +21,7 @@ #include "client_internal.h" #include "fd_util.h" #include "fifo_buffer.h" -#include "socket_util.h" +#include "resolver.h" #include "permission.h" #include "glib_socket.h" diff --git a/src/output/httpd_output_plugin.c b/src/output/httpd_output_plugin.c index 8ef0c11a6..e7344320c 100644 --- a/src/output/httpd_output_plugin.c +++ b/src/output/httpd_output_plugin.c @@ -24,7 +24,7 @@ #include "output_api.h" #include "encoder_plugin.h" #include "encoder_list.h" -#include "socket_util.h" +#include "resolver.h" #include "page.h" #include "icy_server.h" #include "fd_util.h" diff --git a/src/resolver.c b/src/resolver.c new file mode 100644 index 000000000..81099b2af --- /dev/null +++ b/src/resolver.c @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2003-2011 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 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 General Public License for more details. + * + * You should have received a copy of the GNU 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. + */ + +#include "config.h" +#include "resolver.h" + +#ifndef G_OS_WIN32 +#include <sys/socket.h> +#include <netdb.h> +#else /* G_OS_WIN32 */ +#define WINVER 0x0501 +#include <ws2tcpip.h> +#include <winsock.h> +#endif /* G_OS_WIN32 */ + +#ifdef HAVE_IPV6 +#include <string.h> +#endif + +char * +sockaddr_to_string(const struct sockaddr *sa, size_t length, GError **error) +{ +#if defined(HAVE_IPV6) && defined(IN6_IS_ADDR_V4MAPPED) + const struct sockaddr_in6 *a6 = (const struct sockaddr_in6 *)sa; + struct sockaddr_in a4; +#endif + int ret; + char host[NI_MAXHOST], serv[NI_MAXSERV]; + +#if defined(HAVE_IPV6) && defined(IN6_IS_ADDR_V4MAPPED) + if (sa->sa_family == AF_INET6 && + IN6_IS_ADDR_V4MAPPED(&a6->sin6_addr)) { + /* convert "::ffff:127.0.0.1" to "127.0.0.1" */ + + memset(&a4, 0, sizeof(a4)); + a4.sin_family = AF_INET; + memcpy(&a4.sin_addr, ((const char *)&a6->sin6_addr) + 12, + sizeof(a4.sin_addr)); + a4.sin_port = a6->sin6_port; + + sa = (const struct sockaddr *)&a4; + length = sizeof(a4); + } +#endif + + ret = getnameinfo(sa, length, host, sizeof(host), serv, sizeof(serv), + NI_NUMERICHOST|NI_NUMERICSERV); + if (ret != 0) { + g_set_error(error, g_quark_from_static_string("netdb"), ret, + "%s", gai_strerror(ret)); + return NULL; + } + +#ifdef HAVE_UN + if (sa->sa_family == AF_UNIX) + /* "serv" contains corrupt information with unix + sockets */ + return g_strdup(host); +#endif + +#ifdef HAVE_IPV6 + if (strchr(host, ':') != NULL) + return g_strconcat("[", host, "]:", serv, NULL); +#endif + + return g_strconcat(host, ":", serv, NULL); +} diff --git a/src/resolver.h b/src/resolver.h new file mode 100644 index 000000000..179f8fd75 --- /dev/null +++ b/src/resolver.h @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2003-2011 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 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 General Public License for more details. + * + * You should have received a copy of the GNU 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. + */ + +#ifndef MPD_RESOLVER_H +#define MPD_RESOLVER_H + +#include <glib.h> + +struct sockaddr; + +/** + * Converts the specified socket address into a string in the form + * "IP:PORT". The return value must be freed with g_free() when you + * don't need it anymore. + * + * @param sa the sockaddr struct + * @param length the length of #sa in bytes + * @param error location to store the error occurring, or NULL to + * ignore errors + */ +char * +sockaddr_to_string(const struct sockaddr *sa, size_t length, GError **error); + +#endif diff --git a/src/server_socket.c b/src/server_socket.c index 4affeb91b..dba549bfc 100644 --- a/src/server_socket.c +++ b/src/server_socket.c @@ -25,6 +25,7 @@ #include "server_socket.h" #include "socket_util.h" +#include "resolver.h" #include "fd_util.h" #include "glib_compat.h" #include "glib_socket.h" diff --git a/src/socket_util.c b/src/socket_util.c index f673d73e9..8f36c10cf 100644 --- a/src/socket_util.c +++ b/src/socket_util.c @@ -26,7 +26,6 @@ #ifndef G_OS_WIN32 #include <sys/socket.h> -#include <netdb.h> #else /* G_OS_WIN32 */ #define WINVER 0x0501 #include <ws2tcpip.h> @@ -43,55 +42,6 @@ listen_quark(void) return g_quark_from_static_string("listen"); } -char * -sockaddr_to_string(const struct sockaddr *sa, size_t length, GError **error) -{ -#if defined(HAVE_IPV6) && defined(IN6_IS_ADDR_V4MAPPED) - const struct sockaddr_in6 *a6 = (const struct sockaddr_in6 *)sa; - struct sockaddr_in a4; -#endif - int ret; - char host[NI_MAXHOST], serv[NI_MAXSERV]; - -#if defined(HAVE_IPV6) && defined(IN6_IS_ADDR_V4MAPPED) - if (sa->sa_family == AF_INET6 && - IN6_IS_ADDR_V4MAPPED(&a6->sin6_addr)) { - /* convert "::ffff:127.0.0.1" to "127.0.0.1" */ - - memset(&a4, 0, sizeof(a4)); - a4.sin_family = AF_INET; - memcpy(&a4.sin_addr, ((const char *)&a6->sin6_addr) + 12, - sizeof(a4.sin_addr)); - a4.sin_port = a6->sin6_port; - - sa = (const struct sockaddr *)&a4; - length = sizeof(a4); - } -#endif - - ret = getnameinfo(sa, length, host, sizeof(host), serv, sizeof(serv), - NI_NUMERICHOST|NI_NUMERICSERV); - if (ret != 0) { - g_set_error(error, g_quark_from_static_string("netdb"), ret, - "%s", gai_strerror(ret)); - return NULL; - } - -#ifdef HAVE_UN - if (sa->sa_family == AF_UNIX) - /* "serv" contains corrupt information with unix - sockets */ - return g_strdup(host); -#endif - -#ifdef HAVE_IPV6 - if (strchr(host, ':') != NULL) - return g_strconcat("[", host, "]:", serv, NULL); -#endif - - return g_strconcat(host, ":", serv, NULL); -} - int socket_bind_listen(int domain, int type, int protocol, const struct sockaddr *address, size_t address_length, diff --git a/src/socket_util.h b/src/socket_util.h index f27751aa3..93bd27362 100644 --- a/src/socket_util.h +++ b/src/socket_util.h @@ -31,19 +31,6 @@ struct sockaddr; /** - * Converts the specified socket address into a string in the form - * "IP:PORT". The return value must be freed with g_free() when you - * don't need it anymore. - * - * @param sa the sockaddr struct - * @param length the length of #sa in bytes - * @param error location to store the error occurring, or NULL to - * ignore errors - */ -char * -sockaddr_to_string(const struct sockaddr *sa, size_t length, GError **error); - -/** * Creates a socket listening on the specified address. This is a * shortcut for socket(), bind() and listen(). * |