summaryrefslogtreecommitdiff
path: root/src/main/cpp/inetaddress.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/cpp/inetaddress.cpp')
-rw-r--r--src/main/cpp/inetaddress.cpp144
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;
+}
+