From 6f22452b54d6d16d01855a0be18cbee162e141b6 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 22 Jul 2015 10:03:36 +0200 Subject: [PATCH] net/Resolver: move sockaddr_to_string() to ToString.cxx --- Makefile.am | 1 + src/client/ClientNew.cxx | 2 +- src/event/ServerSocket.cxx | 1 + src/net/Resolver.cxx | 101 +------------- src/net/Resolver.hxx | 14 +- src/net/ToString.cxx | 124 ++++++++++++++++++ src/net/ToString.hxx | 38 ++++++ .../plugins/httpd/HttpdOutputPlugin.cxx | 2 +- test/run_resolver.cxx | 1 + 9 files changed, 172 insertions(+), 112 deletions(-) create mode 100644 src/net/ToString.cxx create mode 100644 src/net/ToString.hxx diff --git a/Makefile.am b/Makefile.am index 6223cde19..2f7641c2d 100644 --- a/Makefile.am +++ b/Makefile.am @@ -424,6 +424,7 @@ libthread_a_SOURCES = \ # Networking library libnet_a_SOURCES = \ + src/net/ToString.cxx src/net/ToString.hxx \ src/net/Resolver.cxx src/net/Resolver.hxx \ src/net/StaticSocketAddress.cxx src/net/StaticSocketAddress.hxx \ src/net/SocketAddress.cxx src/net/SocketAddress.hxx \ diff --git a/src/client/ClientNew.cxx b/src/client/ClientNew.cxx index 8dca9f81f..8e5c9fc36 100644 --- a/src/client/ClientNew.cxx +++ b/src/client/ClientNew.cxx @@ -24,7 +24,7 @@ #include "Instance.hxx" #include "system/fd_util.h" #include "net/SocketAddress.hxx" -#include "net/Resolver.hxx" +#include "net/ToString.hxx" #include "Permission.hxx" #include "util/Error.hxx" #include "Log.hxx" diff --git a/src/event/ServerSocket.cxx b/src/event/ServerSocket.cxx index 47d692a1c..c963e79dc 100644 --- a/src/event/ServerSocket.cxx +++ b/src/event/ServerSocket.cxx @@ -24,6 +24,7 @@ #include "net/SocketUtil.hxx" #include "net/SocketError.hxx" #include "net/Resolver.hxx" +#include "net/ToString.hxx" #include "event/SocketMonitor.hxx" #include "system/fd_util.h" #include "fs/AllocatedPath.hxx" diff --git a/src/net/Resolver.cxx b/src/net/Resolver.cxx index 19df84096..189c5bc9c 100644 --- a/src/net/Resolver.cxx +++ b/src/net/Resolver.cxx @@ -23,21 +23,12 @@ #include "util/Error.hxx" #include "util/Domain.hxx" -#include +#include -#ifndef WIN32 -#include -#include -#ifdef HAVE_TCP -#include -#endif -#else +#ifdef WIN32 #include -#include -#endif - -#ifdef HAVE_UN -#include +#else +#include #endif #include @@ -45,90 +36,6 @@ const Domain resolver_domain("resolver"); -#ifdef HAVE_UN - -static std::string -LocalAddressToString(const struct sockaddr_un &s_un, size_t size) -{ - const size_t prefix_size = (size_t) - ((struct sockaddr_un *)nullptr)->sun_path; - assert(size >= prefix_size); - - size_t result_length = size - prefix_size; - - /* remove the trailing null terminator */ - if (result_length > 0 && s_un.sun_path[result_length - 1] == 0) - --result_length; - - if (result_length == 0) - return "local"; - - std::string result(s_un.sun_path, result_length); - - /* replace all null bytes with '@'; this also handles abstract - addresses (Linux specific) */ - std::replace(result.begin(), result.end(), '\0', '@'); - - return result; -} - -#endif - -std::string -sockaddr_to_string(SocketAddress address) -{ -#ifdef HAVE_UN - if (address.GetFamily() == AF_UNIX) - /* return path of UNIX domain sockets */ - return LocalAddressToString(*(const sockaddr_un *)address.GetAddress(), - address.GetSize()); -#endif - -#if defined(HAVE_IPV6) && defined(IN6_IS_ADDR_V4MAPPED) - const struct sockaddr_in6 *a6 = (const struct sockaddr_in6 *) - address.GetAddress(); - struct sockaddr_in a4; -#endif - int ret; - char host[NI_MAXHOST], serv[NI_MAXSERV]; - -#if defined(HAVE_IPV6) && defined(IN6_IS_ADDR_V4MAPPED) - if (address.GetFamily() == 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; - - address = { (const struct sockaddr *)&a4, sizeof(a4) }; - } -#endif - - ret = getnameinfo(address.GetAddress(), address.GetSize(), - host, sizeof(host), serv, sizeof(serv), - NI_NUMERICHOST|NI_NUMERICSERV); - if (ret != 0) - return "unknown"; - -#ifdef HAVE_IPV6 - if (strchr(host, ':') != nullptr) { - std::string result("["); - result.append(host); - result.append("]:"); - result.append(serv); - return result; - } -#endif - - std::string result(host); - result.push_back(':'); - result.append(serv); - return result; -} - struct addrinfo * resolve_host_port(const char *host_port, unsigned default_port, int flags, int socktype, diff --git a/src/net/Resolver.hxx b/src/net/Resolver.hxx index 28d2c784b..826cc4787 100644 --- a/src/net/Resolver.hxx +++ b/src/net/Resolver.hxx @@ -20,27 +20,15 @@ #ifndef MPD_RESOLVER_HXX #define MPD_RESOLVER_HXX +#include "check.h" #include "Compiler.h" -#include - -#include - struct addrinfo; class Error; class Domain; -class SocketAddress; extern const Domain resolver_domain; -/** - * Converts the specified socket address into a string in the form - * "IP:PORT". - */ -gcc_pure -std::string -sockaddr_to_string(SocketAddress address); - /** * Resolve a specification in the form "host", "host:port", * "[host]:port". This is a convenience wrapper for getaddrinfo(). diff --git a/src/net/ToString.cxx b/src/net/ToString.cxx new file mode 100644 index 000000000..49a5067a8 --- /dev/null +++ b/src/net/ToString.cxx @@ -0,0 +1,124 @@ +/* + * Copyright (C) 2003-2015 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 "ToString.hxx" +#include "SocketAddress.hxx" + +#include + +#ifdef WIN32 +#include +#else +#include +#ifdef HAVE_TCP +#include +#endif +#endif + +#ifdef HAVE_UN +#include +#endif + +#include +#include + +#ifdef HAVE_UN + +static std::string +LocalAddressToString(const struct sockaddr_un &s_un, size_t size) +{ + const size_t prefix_size = (size_t) + ((struct sockaddr_un *)nullptr)->sun_path; + assert(size >= prefix_size); + + size_t result_length = size - prefix_size; + + /* remove the trailing null terminator */ + if (result_length > 0 && s_un.sun_path[result_length - 1] == 0) + --result_length; + + if (result_length == 0) + return "local"; + + std::string result(s_un.sun_path, result_length); + + /* replace all null bytes with '@'; this also handles abstract + addresses (Linux specific) */ + std::replace(result.begin(), result.end(), '\0', '@'); + + return result; +} + +#endif + +std::string +sockaddr_to_string(SocketAddress address) +{ +#ifdef HAVE_UN + if (address.GetFamily() == AF_UNIX) + /* return path of UNIX domain sockets */ + return LocalAddressToString(*(const sockaddr_un *)address.GetAddress(), + address.GetSize()); +#endif + +#if defined(HAVE_IPV6) && defined(IN6_IS_ADDR_V4MAPPED) + const struct sockaddr_in6 *a6 = (const struct sockaddr_in6 *) + address.GetAddress(); + struct sockaddr_in a4; +#endif + int ret; + char host[NI_MAXHOST], serv[NI_MAXSERV]; + +#if defined(HAVE_IPV6) && defined(IN6_IS_ADDR_V4MAPPED) + if (address.GetFamily() == 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; + + address = { (const struct sockaddr *)&a4, sizeof(a4) }; + } +#endif + + ret = getnameinfo(address.GetAddress(), address.GetSize(), + host, sizeof(host), serv, sizeof(serv), + NI_NUMERICHOST|NI_NUMERICSERV); + if (ret != 0) + return "unknown"; + +#ifdef HAVE_IPV6 + if (strchr(host, ':') != nullptr) { + std::string result("["); + result.append(host); + result.append("]:"); + result.append(serv); + return result; + } +#endif + + std::string result(host); + result.push_back(':'); + result.append(serv); + return result; +} diff --git a/src/net/ToString.hxx b/src/net/ToString.hxx new file mode 100644 index 000000000..8027e5267 --- /dev/null +++ b/src/net/ToString.hxx @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2003-2015 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 NET_TO_STRING_HXX +#define NET_TO_STRING_HXX + +#include "check.h" +#include "Compiler.h" + +#include + +class SocketAddress; + +/** + * Converts the specified socket address into a string in the form + * "IP:PORT". + */ +gcc_pure +std::string +sockaddr_to_string(SocketAddress address); + +#endif diff --git a/src/output/plugins/httpd/HttpdOutputPlugin.cxx b/src/output/plugins/httpd/HttpdOutputPlugin.cxx index 89dbcb85f..3ed395e63 100644 --- a/src/output/plugins/httpd/HttpdOutputPlugin.cxx +++ b/src/output/plugins/httpd/HttpdOutputPlugin.cxx @@ -25,8 +25,8 @@ #include "encoder/EncoderInterface.hxx" #include "encoder/EncoderPlugin.hxx" #include "encoder/EncoderList.hxx" -#include "net/Resolver.hxx" #include "net/SocketAddress.hxx" +#include "net/ToString.hxx" #include "Page.hxx" #include "IcyMetaDataServer.hxx" #include "system/fd_util.h" diff --git a/test/run_resolver.cxx b/test/run_resolver.cxx index 389d733b1..a66dd6778 100644 --- a/test/run_resolver.cxx +++ b/test/run_resolver.cxx @@ -19,6 +19,7 @@ #include "config.h" #include "net/Resolver.hxx" +#include "net/ToString.hxx" #include "net/SocketAddress.hxx" #include "util/Error.hxx" #include "Log.hxx"