diff options
Diffstat (limited to 'src/main/cpp/inetaddress.cpp')
-rw-r--r-- | src/main/cpp/inetaddress.cpp | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/src/main/cpp/inetaddress.cpp b/src/main/cpp/inetaddress.cpp new file mode 100644 index 0000000..a0cce3c --- /dev/null +++ b/src/main/cpp/inetaddress.cpp @@ -0,0 +1,144 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#if defined(_MSC_VER) +#pragma warning ( disable: 4231 4251 4275 4786 ) +#endif + +#include <log4cxx/logstring.h> +#include <log4cxx/helpers/inetaddress.h> +#include <log4cxx/helpers/loglog.h> +#include <log4cxx/helpers/transcoder.h> +#include <log4cxx/helpers/pool.h> + +#include "apr_network_io.h" + +using namespace log4cxx; +using namespace log4cxx::helpers; + +IMPLEMENT_LOG4CXX_OBJECT(InetAddress) + +UnknownHostException::UnknownHostException(const LogString& msg1) + : Exception(msg1) { +} + +UnknownHostException::UnknownHostException(const UnknownHostException& src) + : Exception(src) { +} + +UnknownHostException& UnknownHostException::operator=(const UnknownHostException& src) { + Exception::operator=(src); + return *this; +} + + +InetAddress::InetAddress(const LogString& hostName, const LogString& hostAddr) + : ipAddrString(hostAddr), hostNameString(hostName) { +} + + +/** Determines all the IP addresses of a host, given the host's name. +*/ +std::vector<InetAddressPtr> InetAddress::getAllByName(const LogString& host) { + LOG4CXX_ENCODE_CHAR(encodedHost, host); + + // retrieve information about the given host + Pool addrPool; + + apr_sockaddr_t *address = 0; + apr_status_t status = + apr_sockaddr_info_get(&address, encodedHost.c_str(), + APR_INET, 0, 0, addrPool.getAPRPool()); + if (status != APR_SUCCESS) { + LogString msg(LOG4CXX_STR("Cannot get information about host: ")); + msg.append(host); + LogLog::error(msg); + throw UnknownHostException(msg); + } + + std::vector<InetAddressPtr> result; + apr_sockaddr_t *currentAddr = address; + while(currentAddr != NULL) { + // retrieve the IP address of this InetAddress. + LogString ipAddrString; + char *ipAddr; + status = apr_sockaddr_ip_get(&ipAddr, currentAddr); + if (status == APR_SUCCESS) { + std::string ip(ipAddr); + Transcoder::decode(ip, ipAddrString); + } + + // retrieve the host name of this InetAddress. + LogString hostNameString; + char *hostName; + status = apr_getnameinfo(&hostName, currentAddr, 0); + if (status == APR_SUCCESS) { + std::string host(hostName); + Transcoder::decode(host, hostNameString); + } + + result.push_back(new InetAddress(hostNameString, ipAddrString)); + currentAddr = currentAddr->next; + } + + return result; +} + + +/** Determines the IP address of a host, given the host's name. +*/ +InetAddressPtr InetAddress::getByName(const LogString& host) { + return getAllByName(host)[0]; +} + +/** Returns the IP address string "%d.%d.%d.%d". +*/ +LogString InetAddress::getHostAddress() const +{ + return ipAddrString; +} + +/** Gets the host name for this IP address. +*/ +LogString InetAddress::getHostName() const +{ + return hostNameString; +} + +/** Returns the local host. +*/ +InetAddressPtr InetAddress::getLocalHost() +{ + return getByName(LOG4CXX_STR("127.0.0.1")); +} + + +InetAddressPtr InetAddress::anyAddress() { + // APR_ANYADDR does not work with the LOG4CXX_STR macro + return getByName(LOG4CXX_STR("0.0.0.0")); +} + + +/** Converts this IP address to a String. +*/ +LogString InetAddress::toString() const +{ + LogString rv(getHostName()); + rv.append(LOG4CXX_STR("/")); + rv.append(getHostAddress()); + return rv; +} + |