Commit 3ea10738 authored by Max Kellermann's avatar Max Kellermann

socket_util: move sockaddr_to_string() to resolver.c

parent 76a959a5
...@@ -354,6 +354,7 @@ src_mpd_SOURCES = \ ...@@ -354,6 +354,7 @@ src_mpd_SOURCES = \
src/song_print.c \ src/song_print.c \
src/song_save.c \ src/song_save.c \
src/songvec.c \ src/songvec.c \
src/resolver.c src/resolver.h \
src/socket_util.c \ src/socket_util.c \
src/state_file.c \ src/state_file.c \
src/stats.c \ src/stats.c \
...@@ -1144,6 +1145,7 @@ test_run_output_SOURCES = test/run_output.c \ ...@@ -1144,6 +1145,7 @@ test_run_output_SOURCES = test/run_output.c \
src/fifo_buffer.c \ src/fifo_buffer.c \
src/page.c \ src/page.c \
src/socket_util.c \ src/socket_util.c \
src/resolver.c \
src/output_init.c src/output_finish.c src/output_list.c \ src/output_init.c src/output_finish.c src/output_list.c \
src/output_plugin.c \ src/output_plugin.c \
$(ENCODER_SRC) \ $(ENCODER_SRC) \
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
#include "client_internal.h" #include "client_internal.h"
#include "fd_util.h" #include "fd_util.h"
#include "fifo_buffer.h" #include "fifo_buffer.h"
#include "socket_util.h" #include "resolver.h"
#include "permission.h" #include "permission.h"
#include "glib_socket.h" #include "glib_socket.h"
......
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
#include "output_api.h" #include "output_api.h"
#include "encoder_plugin.h" #include "encoder_plugin.h"
#include "encoder_list.h" #include "encoder_list.h"
#include "socket_util.h" #include "resolver.h"
#include "page.h" #include "page.h"
#include "icy_server.h" #include "icy_server.h"
#include "fd_util.h" #include "fd_util.h"
......
/*
* 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);
}
/*
* 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
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include "server_socket.h" #include "server_socket.h"
#include "socket_util.h" #include "socket_util.h"
#include "resolver.h"
#include "fd_util.h" #include "fd_util.h"
#include "glib_compat.h" #include "glib_compat.h"
#include "glib_socket.h" #include "glib_socket.h"
......
...@@ -26,7 +26,6 @@ ...@@ -26,7 +26,6 @@
#ifndef G_OS_WIN32 #ifndef G_OS_WIN32
#include <sys/socket.h> #include <sys/socket.h>
#include <netdb.h>
#else /* G_OS_WIN32 */ #else /* G_OS_WIN32 */
#define WINVER 0x0501 #define WINVER 0x0501
#include <ws2tcpip.h> #include <ws2tcpip.h>
...@@ -43,55 +42,6 @@ listen_quark(void) ...@@ -43,55 +42,6 @@ listen_quark(void)
return g_quark_from_static_string("listen"); 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 int
socket_bind_listen(int domain, int type, int protocol, socket_bind_listen(int domain, int type, int protocol,
const struct sockaddr *address, size_t address_length, const struct sockaddr *address, size_t address_length,
......
...@@ -31,19 +31,6 @@ ...@@ -31,19 +31,6 @@
struct sockaddr; 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 * Creates a socket listening on the specified address. This is a
* shortcut for socket(), bind() and listen(). * shortcut for socket(), bind() and listen().
* *
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment