Author: afester Date: Sat May 13 09:05:49 2006 New Revision: 406123 URL: http://svn.apache.org/viewcvs?rev=406123&view=rev Log: LOGCXX-64: ported InetAddress to the APR
Added: logging/log4cxx/trunk/tests/src/helpers/inetaddresstestcase.cpp Modified: logging/log4cxx/trunk/include/log4cxx/helpers/datagrampacket.h logging/log4cxx/trunk/include/log4cxx/helpers/datagramsocket.h logging/log4cxx/trunk/include/log4cxx/helpers/inetaddress.h logging/log4cxx/trunk/include/log4cxx/helpers/serversocket.h logging/log4cxx/trunk/include/log4cxx/helpers/socket.h logging/log4cxx/trunk/include/log4cxx/helpers/socketimpl.h logging/log4cxx/trunk/include/log4cxx/helpers/syslogwriter.h logging/log4cxx/trunk/include/log4cxx/net/socketappender.h logging/log4cxx/trunk/include/log4cxx/net/socketappenderskeleton.h logging/log4cxx/trunk/include/log4cxx/net/xmlsocketappender.h logging/log4cxx/trunk/simplesocketserver/simplesocketserver.cpp logging/log4cxx/trunk/src/datagrampacket.cpp logging/log4cxx/trunk/src/datagramsocket.cpp logging/log4cxx/trunk/src/inetaddress.cpp logging/log4cxx/trunk/src/serversocket.cpp logging/log4cxx/trunk/src/socket.cpp logging/log4cxx/trunk/src/socketappender.cpp logging/log4cxx/trunk/src/socketappenderskeleton.cpp logging/log4cxx/trunk/src/sockethubappender.cpp logging/log4cxx/trunk/src/socketimpl.cpp logging/log4cxx/trunk/src/xmlsocketappender.cpp logging/log4cxx/trunk/tests/src/Makefile.am logging/log4cxx/trunk/tests/src/shortsocketserver.cpp Modified: logging/log4cxx/trunk/include/log4cxx/helpers/datagrampacket.h URL: http://svn.apache.org/viewcvs/logging/log4cxx/trunk/include/log4cxx/helpers/datagrampacket.h?rev=406123&r1=406122&r2=406123&view=diff ============================================================================== --- logging/log4cxx/trunk/include/log4cxx/helpers/datagrampacket.h (original) +++ logging/log4cxx/trunk/include/log4cxx/helpers/datagrampacket.h Sat May 13 09:05:49 2006 @@ -48,7 +48,7 @@ int length; /** The IP address for this packet. */ - InetAddress address; + InetAddressPtr address; /** The UDP port number of the remote host. */ int port; @@ -66,7 +66,7 @@ /** Constructs a datagram packet for sending packets of length <code>length</code> to the specified port number on the specified host. */ - DatagramPacket(void * buf, int length, InetAddress address, int port); + DatagramPacket(void * buf, int length, InetAddressPtr address, int port); /** Constructs a DatagramPacket for receiving packets of length <code>length</code>, specifying an offset into the buffer. */ @@ -75,14 +75,14 @@ /** Constructs a datagram packet for sending packets of length <code>length</code> with offset <code>offset</code> to the specified port number on the specified host. */ - DatagramPacket(void * buf, int offset, int length, InetAddress address, + DatagramPacket(void * buf, int offset, int length, InetAddressPtr address, int port); ~DatagramPacket(); /** Returns the IP address of the machine to which this datagram is being sent or from which the datagram was received. */ - inline InetAddress getAddress() const + inline InetAddressPtr getAddress() const { return address; } /** Returns the data received or the data to be sent. */ @@ -104,7 +104,7 @@ inline int getPort() const { return port; } - inline void setAddress(InetAddress address) + inline void setAddress(InetAddressPtr address) { this->address = address; } /** Set the data buffer for this packet. */ Modified: logging/log4cxx/trunk/include/log4cxx/helpers/datagramsocket.h URL: http://svn.apache.org/viewcvs/logging/log4cxx/trunk/include/log4cxx/helpers/datagramsocket.h?rev=406123&r1=406122&r2=406123&view=diff ============================================================================== --- logging/log4cxx/trunk/include/log4cxx/helpers/datagramsocket.h (original) +++ logging/log4cxx/trunk/include/log4cxx/helpers/datagramsocket.h Sat May 13 09:05:49 2006 @@ -55,13 +55,13 @@ /** Creates a datagram socket, bound to the specified local address. */ - DatagramSocket(int port, InetAddress laddr); + DatagramSocket(int port, InetAddressPtr laddr); /** ensure the socket is closed. */ ~DatagramSocket(); /** Binds a datagram socket to a local port and address.*/ - void bind(int lport, InetAddress laddress); + void bind(int lport, InetAddressPtr laddress); /** Creates a datagram socket.*/ void create(); @@ -70,14 +70,14 @@ void close(); /** Connects the socket to a remote address for this socket. */ - void connect(InetAddress address, int port); + void connect(InetAddressPtr address, int port); /** Returns the address to which this socket is connected. */ - inline InetAddress getInetAddress() const + inline InetAddressPtr getInetAddress() const { return address; } /** Gets the local address to which the socket is bound. */ - inline InetAddress getLocalAddress() const + inline InetAddressPtr getLocalAddress() const { return localAddress; } /** Returns the port number on the local host to which this @@ -114,9 +114,9 @@ /** The memory pool for the socket */ Pool socketPool; - InetAddress address; + InetAddressPtr address; - InetAddress localAddress; + InetAddressPtr localAddress; int port; Modified: logging/log4cxx/trunk/include/log4cxx/helpers/inetaddress.h URL: http://svn.apache.org/viewcvs/logging/log4cxx/trunk/include/log4cxx/helpers/inetaddress.h?rev=406123&r1=406122&r2=406123&view=diff ============================================================================== --- logging/log4cxx/trunk/include/log4cxx/helpers/inetaddress.h (original) +++ logging/log4cxx/trunk/include/log4cxx/helpers/inetaddress.h Sat May 13 09:05:49 2006 @@ -17,6 +17,8 @@ #ifndef _LOG4CXX_HELPER_INETADDRESS_H #define _LOG4CXX_HELPER_INETADDRESS_H +#include <log4cxx/helpers/objectimpl.h> +#include <log4cxx/helpers/objectptr.h> #include <log4cxx/logstring.h> #include <vector> #include <log4cxx/helpers/exception.h> @@ -33,22 +35,27 @@ UnknownHostException& operator=(const UnknownHostException& src); }; - class LOG4CXX_EXPORT InetAddress + + class InetAddress; + typedef ObjectPtrT<InetAddress> InetAddressPtr; + + class LOG4CXX_EXPORT InetAddress : public ObjectImpl { public: - InetAddress(); + DECLARE_ABSTRACT_LOG4CXX_OBJECT(InetAddress) + BEGIN_LOG4CXX_CAST_MAP() + LOG4CXX_CAST_ENTRY(InetAddress) + END_LOG4CXX_CAST_MAP() - /** Returns the raw IP address of this InetAddress object. - */ - int getAddress() const; + InetAddress(const LogString& hostName, const LogString& hostAddr); /** Determines all the IP addresses of a host, given the host's name. */ - static std::vector<InetAddress> getAllByName(const LogString& host); + static std::vector<InetAddressPtr> getAllByName(const LogString& host); /** Determines the IP address of a host, given the host's name. */ - static InetAddress getByName(const LogString& host); + static InetAddressPtr getByName(const LogString& host); /** Returns the IP address string "%d.%d.%d.%d". */ @@ -60,19 +67,26 @@ /** Returns the local host. */ - static InetAddress getLocalHost(); + static InetAddressPtr getLocalHost(); - /** Utility routine to check if the InetAddress is an IP multicast address. - */ - bool isMulticastAddress() const; + /** Returns an InetAddress which can be used as any + * address, for example when listening on a port from any + * remote addresss. + */ + static InetAddressPtr anyAddress(); /** Converts this IP address to a String. */ LogString toString() const; - int address; + private: + LogString ipAddrString; + + LogString hostNameString; + }; // class InetAddress } // namespace helpers } // namespace log4cxx #endif // _LOG4CXX_HELPER_INETADDRESS_H + Modified: logging/log4cxx/trunk/include/log4cxx/helpers/serversocket.h URL: http://svn.apache.org/viewcvs/logging/log4cxx/trunk/include/log4cxx/helpers/serversocket.h?rev=406123&r1=406122&r2=406123&view=diff ============================================================================== --- logging/log4cxx/trunk/include/log4cxx/helpers/serversocket.h (original) +++ logging/log4cxx/trunk/include/log4cxx/helpers/serversocket.h Sat May 13 09:05:49 2006 @@ -40,7 +40,7 @@ and local IP address to bind to. */ - ServerSocket(int port, int backlog, InetAddress bindAddr); + ServerSocket(int port, int backlog, InetAddressPtr bindAddr); ~ServerSocket(); @@ -56,7 +56,7 @@ /** Returns the local address of this server socket. */ - inline InetAddress getInetAddress() const + inline InetAddressPtr getInetAddress() const { return socketImpl->getInetAddress(); } /** Returns the port on which this socket is listening. Modified: logging/log4cxx/trunk/include/log4cxx/helpers/socket.h URL: http://svn.apache.org/viewcvs/logging/log4cxx/trunk/include/log4cxx/helpers/socket.h?rev=406123&r1=406122&r2=406123&view=diff ============================================================================== --- logging/log4cxx/trunk/include/log4cxx/helpers/socket.h (original) +++ logging/log4cxx/trunk/include/log4cxx/helpers/socket.h Sat May 13 09:05:49 2006 @@ -62,13 +62,13 @@ /** Creates a stream socket and connects it to the specified port number at the specified IP address. */ - Socket(InetAddress address, int port); + Socket(InetAddressPtr address, int port); /** Creates a socket and connects it to the specified remote address on the specified remote port. */ - Socket(InetAddress address, int port, - InetAddress localAddr, int localPort); + Socket(InetAddressPtr address, int port, + InetAddressPtr localAddr, int localPort); protected: /** Creates an unconnected Socket @@ -86,7 +86,7 @@ host on the specified remote port. */ Socket(const LogString& host, int port, - InetAddress localAddr, int localPort); + InetAddressPtr localAddr, int localPort); size_t read(void * buf, size_t len) const { return socketImpl->read(buf, len); } @@ -99,7 +99,7 @@ { socketImpl->close(); } /** Returns the value of this socket's address field. */ - inline InetAddress getInetAddress() const + inline InetAddressPtr getInetAddress() const { return socketImpl->getInetAddress(); } /** Returns the value of this socket's localport field. */ Modified: logging/log4cxx/trunk/include/log4cxx/helpers/socketimpl.h URL: http://svn.apache.org/viewcvs/logging/log4cxx/trunk/include/log4cxx/helpers/socketimpl.h?rev=406123&r1=406122&r2=406123&view=diff ============================================================================== --- logging/log4cxx/trunk/include/log4cxx/helpers/socketimpl.h (original) +++ logging/log4cxx/trunk/include/log4cxx/helpers/socketimpl.h Sat May 13 09:05:49 2006 @@ -170,7 +170,7 @@ { protected: /** The IP address of the remote end of this socket. */ - InetAddress address; + InetAddressPtr address; /** The APR memory pool to use for this socket */ Pool memoryPool; @@ -216,7 +216,7 @@ @param port the port number. @exception BindException if an I/O error occurs when binding this socket. */ - void bind(InetAddress host, int port); + void bind(InetAddressPtr host, int port); /** Closes this socket. */ void close(); @@ -224,7 +224,7 @@ /** Connects this socket to the specified port number on the specified host. */ - void connect(InetAddress address, int port); + void connect(InetAddressPtr address, int port); /** Connects this socket to the specified port on the named host. */ void connect(const LogString& host, int port); @@ -233,7 +233,7 @@ void create(bool stream); /** Returns the value of this socket's address field. */ - inline InetAddress getInetAddress() const + inline InetAddressPtr getInetAddress() const { return address; } /** Returns the value of this socket's localport field. */ Modified: logging/log4cxx/trunk/include/log4cxx/helpers/syslogwriter.h URL: http://svn.apache.org/viewcvs/logging/log4cxx/trunk/include/log4cxx/helpers/syslogwriter.h?rev=406123&r1=406122&r2=406123&view=diff ============================================================================== --- logging/log4cxx/trunk/include/log4cxx/helpers/syslogwriter.h (original) +++ logging/log4cxx/trunk/include/log4cxx/helpers/syslogwriter.h Sat May 13 09:05:49 2006 @@ -40,7 +40,7 @@ private: LogString syslogHost; - InetAddress address; + InetAddressPtr address; DatagramSocketPtr ds; }; } // namespace helpers Modified: logging/log4cxx/trunk/include/log4cxx/net/socketappender.h URL: http://svn.apache.org/viewcvs/logging/log4cxx/trunk/include/log4cxx/net/socketappender.h?rev=406123&r1=406122&r2=406123&view=diff ============================================================================== --- logging/log4cxx/trunk/include/log4cxx/net/socketappender.h (original) +++ logging/log4cxx/trunk/include/log4cxx/net/socketappender.h Sat May 13 09:05:49 2006 @@ -110,7 +110,7 @@ /** Connects to remote server at <code>address</code> and <code>port</code>. */ - SocketAppender(unsigned long address, int port); + SocketAppender(helpers::InetAddressPtr& address, int port); /** Connects to remote server at <code>host</code> and <code>port</code>. Modified: logging/log4cxx/trunk/include/log4cxx/net/socketappenderskeleton.h URL: http://svn.apache.org/viewcvs/logging/log4cxx/trunk/include/log4cxx/net/socketappenderskeleton.h?rev=406123&r1=406122&r2=406123&view=diff ============================================================================== --- logging/log4cxx/trunk/include/log4cxx/net/socketappenderskeleton.h (original) +++ logging/log4cxx/trunk/include/log4cxx/net/socketappenderskeleton.h Sat May 13 09:05:49 2006 @@ -48,7 +48,7 @@ /** IP address */ - helpers::InetAddress address; + helpers::InetAddressPtr address; int port; helpers::SocketOutputStreamPtr os; @@ -62,7 +62,7 @@ /** Connects to remote server at <code>address</code> and <code>port</code>. */ - SocketAppenderSkeleton(unsigned long address, int port, int reconnectionDelay); + SocketAppenderSkeleton(helpers::InetAddressPtr address, int port, int reconnectionDelay); /** Connects to remote server at <code>host</code> and <code>port</code>. Modified: logging/log4cxx/trunk/include/log4cxx/net/xmlsocketappender.h URL: http://svn.apache.org/viewcvs/logging/log4cxx/trunk/include/log4cxx/net/xmlsocketappender.h?rev=406123&r1=406122&r2=406123&view=diff ============================================================================== --- logging/log4cxx/trunk/include/log4cxx/net/xmlsocketappender.h (original) +++ logging/log4cxx/trunk/include/log4cxx/net/xmlsocketappender.h Sat May 13 09:05:49 2006 @@ -118,7 +118,7 @@ /** Connects to remote server at <code>address</code> and <code>port</code>. */ - XMLSocketAppender(unsigned long address, int port); + XMLSocketAppender(helpers::InetAddressPtr address, int port); /** Connects to remote server at <code>host</code> and <code>port</code>. Modified: logging/log4cxx/trunk/simplesocketserver/simplesocketserver.cpp URL: http://svn.apache.org/viewcvs/logging/log4cxx/trunk/simplesocketserver/simplesocketserver.cpp?rev=406123&r1=406122&r2=406123&view=diff ============================================================================== --- logging/log4cxx/trunk/simplesocketserver/simplesocketserver.cpp (original) +++ logging/log4cxx/trunk/simplesocketserver/simplesocketserver.cpp Sat May 13 09:05:49 2006 @@ -97,7 +97,7 @@ SocketPtr socket = serverSocket.accept(); logstream << "Connected to client at " - << socket->getInetAddress().toString(); + << socket->getInetAddress()->toString(); logstream << "Starting new socket node."; Thread * thread = new Thread(); Modified: logging/log4cxx/trunk/src/datagrampacket.cpp URL: http://svn.apache.org/viewcvs/logging/log4cxx/trunk/src/datagrampacket.cpp?rev=406123&r1=406122&r2=406123&view=diff ============================================================================== --- logging/log4cxx/trunk/src/datagrampacket.cpp (original) +++ logging/log4cxx/trunk/src/datagrampacket.cpp Sat May 13 09:05:49 2006 @@ -30,7 +30,7 @@ /** Constructs a datagram packet for sending packets of length <code>length/<code> to the specified port number on the specified host. */ -DatagramPacket::DatagramPacket(void * buf, int length, InetAddress address, +DatagramPacket::DatagramPacket(void * buf, int length, InetAddressPtr address, int port) : buf(buf), offset(0), length(length), address(address), port(port) { @@ -46,7 +46,7 @@ <code>length</code> with offset <code>offset</code> to the specified port number on the specified host. */ DatagramPacket::DatagramPacket(void * buf, int offset, int length, -InetAddress address, int port) +InetAddressPtr address, int port) : buf(buf), offset(offset), length(length), address(address), port(port) { } Modified: logging/log4cxx/trunk/src/datagramsocket.cpp URL: http://svn.apache.org/viewcvs/logging/log4cxx/trunk/src/datagramsocket.cpp?rev=406123&r1=406122&r2=406123&view=diff ============================================================================== --- logging/log4cxx/trunk/src/datagramsocket.cpp (original) +++ logging/log4cxx/trunk/src/datagramsocket.cpp Sat May 13 09:05:49 2006 @@ -36,14 +36,13 @@ DatagramSocket::DatagramSocket(int localPort) : socket(0), address(), localAddress(), port(0), localPort(0) { - InetAddress bindAddr; - bindAddr.address = INADDR_ANY; + InetAddressPtr bindAddr = InetAddress::anyAddress(); create(); bind(localPort, bindAddr); } -DatagramSocket::DatagramSocket(int localPort, InetAddress localAddress) +DatagramSocket::DatagramSocket(int localPort, InetAddressPtr localAddress) : socket(0), address(), localAddress(), port(0), localPort(0) { create(); @@ -62,12 +61,12 @@ } /** Binds a datagram socket to a local port and address.*/ -void DatagramSocket::bind(int localPort, InetAddress localAddress) +void DatagramSocket::bind(int localPort, InetAddressPtr localAddress) { Pool addrPool; - // Create server socket address - LOG4CXX_ENCODE_CHAR(hostAddr, localAddress.getHostAddress()); + // Create server socket address (including port number) + LOG4CXX_ENCODE_CHAR(hostAddr, localAddress->getHostAddress()); apr_sockaddr_t *server_addr; apr_status_t status = apr_sockaddr_info_get(&server_addr, hostAddr.c_str(), APR_INET, @@ -101,7 +100,7 @@ } } -void DatagramSocket::connect(InetAddress address, int port) +void DatagramSocket::connect(InetAddressPtr address, int port) { this->address = address; @@ -110,7 +109,7 @@ Pool addrPool; // create socket address - LOG4CXX_ENCODE_CHAR(hostAddr, address.getHostAddress()); + LOG4CXX_ENCODE_CHAR(hostAddr, address->getHostAddress()); apr_sockaddr_t *client_addr; apr_status_t status = apr_sockaddr_info_get(&client_addr, hostAddr.c_str(), APR_INET, @@ -145,7 +144,7 @@ Pool addrPool; // Create the address from which to receive the datagram packet - LOG4CXX_ENCODE_CHAR(hostAddr, p->getAddress().getHostAddress()); + LOG4CXX_ENCODE_CHAR(hostAddr, p->getAddress()->getHostAddress()); apr_sockaddr_t *addr; apr_status_t status = apr_sockaddr_info_get(&addr, hostAddr.c_str(), APR_INET, @@ -169,7 +168,7 @@ Pool addrPool; // create the adress to which to send the datagram packet - LOG4CXX_ENCODE_CHAR(hostAddr, p->getAddress().getHostAddress()); + LOG4CXX_ENCODE_CHAR(hostAddr, p->getAddress()->getHostAddress()); apr_sockaddr_t *addr; apr_status_t status = apr_sockaddr_info_get(&addr, hostAddr.c_str(), APR_INET, p->getPort(), Modified: logging/log4cxx/trunk/src/inetaddress.cpp URL: http://svn.apache.org/viewcvs/logging/log4cxx/trunk/src/inetaddress.cpp?rev=406123&r1=406122&r2=406123&view=diff ============================================================================== --- logging/log4cxx/trunk/src/inetaddress.cpp (original) +++ logging/log4cxx/trunk/src/inetaddress.cpp Sat May 13 09:05:49 2006 @@ -14,26 +14,18 @@ * limitations under the License. */ -#if defined(WIN32) || defined(_WIN32) -#include <windows.h> -#include <winsock.h> -#else -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <unistd.h> -#include <netdb.h> -#include <string.h> -#endif - #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 std::string& msg) : Exception(msg) { } @@ -48,134 +40,89 @@ } -InetAddress::InetAddress() : address(0) -{ +InetAddress::InetAddress(const LogString& hostName, const LogString& hostAddr) + : hostNameString(hostName), ipAddrString(hostAddr) { } -/** Returns the raw IP address of this InetAddress object. -*/ -int InetAddress::getAddress() const -{ - return address; -} /** Determines all the IP addresses of a host, given the host's name. */ -std::vector<InetAddress> InetAddress::getAllByName(const LogString& host) -{ - struct hostent * hostinfo; +std::vector<InetAddressPtr> InetAddress::getAllByName(const LogString& host) { + LOG4CXX_ENCODE_CHAR(encodedHost, host); - std::string hostname; - Transcoder::encode(host, hostname); - hostinfo = ::gethostbyname(hostname.c_str()); - - if (hostinfo == 0) - { - LogLog::error( - ((LogString) LOG4CXX_STR("Cannot get information about host :")) - + host); - return std::vector<InetAddress>(); - } - else - { - std::vector<InetAddress> addresses; - InetAddress address; - char ** addrs = hostinfo->h_addr_list; - - while(*addrs != 0) - { - address.address = ntohl(((in_addr *)*addrs)->s_addr); - addresses.push_back(address); - } + // retrieve information about the given host + Pool addrPool; - return addresses; - } + apr_sockaddr_t *address; + apr_status_t status = + apr_sockaddr_info_get(&address, encodedHost.c_str(), + APR_INET, 0, 0, (apr_pool_t*) addrPool.getAPRPool()); + if (status != APR_SUCCESS) { + LogString msg(LOG4CXX_STR("Cannot get information about host: ")); + msg.append(host); + LogLog::error(msg); + std::string s; + Transcoder::encode(msg, s); + throw UnknownHostException(s); + } + + std::vector<InetAddressPtr> result; + apr_sockaddr_t *currentAddr = address; + while(currentAddr != NULL) { + // retrieve the IP address of this InetAddress. + LogString ipAddrString; + char *ipAddr; + apr_sockaddr_ip_get(&ipAddr, currentAddr); + Transcoder::decode(ipAddr, strlen(ipAddr), ipAddrString); + + // retrieve the host name of this InetAddress. + LogString hostNameString; + char *hostName; + apr_getnameinfo(&hostName, currentAddr, 0); + Transcoder::decode(hostName, strlen(hostName), 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. */ -InetAddress InetAddress::getByName(const LogString& host) -{ - struct hostent * hostinfo; - InetAddress address; - - std::string hostname; - Transcoder::encode(host, hostname); - hostinfo = ::gethostbyname(hostname.c_str()); - - if (hostinfo == 0) - { - LogString msg(LOG4CXX_STR("Cannot get information about host: ")); - msg.append(host); - LogLog::error(msg); - std::string s; - Transcoder::encode(msg, s); - throw UnknownHostException(s); - } - else - { - address.address = ntohl(((in_addr *)*hostinfo->h_addr_list)->s_addr); - } - - return address; +InetAddressPtr InetAddress::getByName(const LogString& host) { + return getAllByName(host)[0]; } /** Returns the IP address string "%d.%d.%d.%d". */ LogString InetAddress::getHostAddress() const { - in_addr addr; - addr.s_addr = htonl(address); - const char* rv = ::inet_ntoa(addr); - LOG4CXX_DECODE_CHAR(wrv, rv); - return wrv; + return ipAddrString; } /** Gets the host name for this IP address. */ LogString InetAddress::getHostName() const { - LogString hostName; - struct hostent * hostinfo; - - in_addr addr; - addr.s_addr = htonl(address); - hostinfo = ::gethostbyaddr((const char *)&addr, sizeof(addr), AF_INET); - - if (hostinfo != 0) - { - Transcoder::decode(hostinfo->h_name, strlen(hostinfo->h_name), hostName); - } - else - { - LogString msg(LOG4CXX_STR("Cannot get host name: ")); -// TODO: -// msg += address->toString(); - LogLog::error(msg); - } - - return hostName; + return hostNameString; } /** Returns the local host. */ -InetAddress InetAddress::getLocalHost() +InetAddressPtr InetAddress::getLocalHost() { - InetAddress address; - address.address = ntohl(inet_addr("127.0.0.1")); - return address; + return getByName(LOG4CXX_STR("127.0.0.1")); } -/** Utility routine to check if the InetAddress is an IP multicast address. -IP multicast address is a Class D address -i.e first four bits of the address are 1110. -*/ -bool InetAddress::isMulticastAddress() const -{ - return (address & 0xF000) == 0xE000; + +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 @@ -185,3 +132,4 @@ rv.append(getHostAddress()); return rv; } + Modified: logging/log4cxx/trunk/src/serversocket.cpp URL: http://svn.apache.org/viewcvs/logging/log4cxx/trunk/src/serversocket.cpp?rev=406123&r1=406122&r2=406123&view=diff ============================================================================== --- logging/log4cxx/trunk/src/serversocket.cpp (original) +++ logging/log4cxx/trunk/src/serversocket.cpp Sat May 13 09:05:49 2006 @@ -14,14 +14,6 @@ * limitations under the License. */ -#if defined(_WIN32) -#include <windows.h> -#include <winsock.h> -#else -#include <sys/types.h> -#include <netinet/in.h> -#endif - #include <log4cxx/helpers/serversocket.h> #include <log4cxx/helpers/socket.h> @@ -33,8 +25,7 @@ */ ServerSocket::ServerSocket(int port) { - InetAddress bindAddr; - bindAddr.address = INADDR_ANY; + InetAddressPtr bindAddr = InetAddress::anyAddress(); socketImpl = new SocketImpl(); socketImpl->create(true); @@ -47,8 +38,7 @@ */ ServerSocket::ServerSocket(int port, int backlog) { - InetAddress bindAddr; - bindAddr.address = INADDR_ANY; + InetAddressPtr bindAddr = InetAddress::anyAddress(); socketImpl = new SocketImpl(); socketImpl->create(true); @@ -59,7 +49,7 @@ /** Create a server with the specified port, listen backlog, and local IP address to bind to. */ -ServerSocket::ServerSocket(int port, int backlog, InetAddress bindAddr) +ServerSocket::ServerSocket(int port, int backlog, InetAddressPtr bindAddr) { socketImpl = new SocketImpl(); socketImpl->create(true); Modified: logging/log4cxx/trunk/src/socket.cpp URL: http://svn.apache.org/viewcvs/logging/log4cxx/trunk/src/socket.cpp?rev=406123&r1=406122&r2=406123&view=diff ============================================================================== --- logging/log4cxx/trunk/src/socket.cpp (original) +++ logging/log4cxx/trunk/src/socket.cpp Sat May 13 09:05:49 2006 @@ -14,25 +14,11 @@ * limitations under the License. */ -#if defined(_WIN32) -#include <windows.h> -#include <winsock.h> -#else -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <unistd.h> -#include <netdb.h> -#endif - #include <log4cxx/helpers/socket.h> #include <log4cxx/helpers/loglog.h> #include <log4cxx/helpers/socketoutputstream.h> #include <log4cxx/helpers/socketinputstream.h> -#include <string.h> - using namespace log4cxx; using namespace log4cxx::helpers; @@ -47,7 +33,7 @@ /** Creates a stream socket and connects it to the specified port number at the specified IP address. */ -Socket::Socket(InetAddress address, int port) : socketImpl(new SocketImpl()) +Socket::Socket(InetAddressPtr address, int port) : socketImpl(new SocketImpl()) { socketImpl->create(true); socketImpl->connect(address, port); @@ -56,8 +42,8 @@ /** Creates a socket and connects it to the specified remote address on the specified remote port. */ -Socket::Socket(InetAddress address, int port, - InetAddress localAddr, int localPort) : socketImpl(new SocketImpl()) +Socket::Socket(InetAddressPtr address, int port, + InetAddressPtr localAddr, int localPort) : socketImpl(new SocketImpl()) { socketImpl->create(true); socketImpl->connect(address, port); @@ -86,7 +72,7 @@ host on the specified remote port. */ Socket::Socket(const LogString& host, int port, - InetAddress localAddr, int localPort) + InetAddressPtr localAddr, int localPort) : socketImpl(new SocketImpl()) { socketImpl->create(true); Modified: logging/log4cxx/trunk/src/socketappender.cpp URL: http://svn.apache.org/viewcvs/logging/log4cxx/trunk/src/socketappender.cpp?rev=406123&r1=406122&r2=406123&view=diff ============================================================================== --- logging/log4cxx/trunk/src/socketappender.cpp (original) +++ logging/log4cxx/trunk/src/socketappender.cpp Sat May 13 09:05:49 2006 @@ -46,7 +46,7 @@ : SocketAppenderSkeleton(DEFAULT_PORT, DEFAULT_RECONNECTION_DELAY) { } -SocketAppender::SocketAppender(unsigned long address, int port) +SocketAppender::SocketAppender(InetAddressPtr& address, int port) : SocketAppenderSkeleton(address, port, DEFAULT_RECONNECTION_DELAY) { connect(); } Modified: logging/log4cxx/trunk/src/socketappenderskeleton.cpp URL: http://svn.apache.org/viewcvs/logging/log4cxx/trunk/src/socketappenderskeleton.cpp?rev=406123&r1=406122&r2=406123&view=diff ============================================================================== --- logging/log4cxx/trunk/src/socketappenderskeleton.cpp (original) +++ logging/log4cxx/trunk/src/socketappenderskeleton.cpp Sat May 13 09:05:49 2006 @@ -45,18 +45,17 @@ thread() { } -SocketAppenderSkeleton::SocketAppenderSkeleton(unsigned long address, int port, int delay) +SocketAppenderSkeleton::SocketAppenderSkeleton(InetAddressPtr address, int port, int delay) : pool(), remoteHost(), - address(), + address(address), port(port), os(), reconnectionDelay(delay), locationInfo(false), thread() { - this->address.address = address; - remoteHost = this->address.getHostName(); + remoteHost = this->address->getHostName(); } SocketAppenderSkeleton::SocketAppenderSkeleton(const LogString& host, int port, int delay) @@ -107,7 +106,7 @@ void SocketAppenderSkeleton::append(const spi::LoggingEventPtr& event, Pool& p) { - if(address.address == 0) + if(address == 0) { errorHandler->error( LOG4CXX_STR("No remote host is set for appender named \"") + @@ -165,7 +164,7 @@ void SocketAppenderSkeleton::connect() { - if(address.address == 0) + if(address == 0) { return; } @@ -182,7 +181,7 @@ { LogString msg = LOG4CXX_STR("Could not connect to remote log4cxx server at [") - +address.getHostName()+LOG4CXX_STR("]."); + +address->getHostName()+LOG4CXX_STR("]."); if(reconnectionDelay > 0) { @@ -214,7 +213,7 @@ { apr_sleep(APR_INT64_C(1000) * socketAppender->reconnectionDelay); LogLog::debug(LOG4CXX_STR("Attempting connection to ") - +socketAppender->address.getHostName()); + +socketAppender->address->getHostName()); socket = new Socket(socketAppender->address, socketAppender->port); synchronized sync(socketAppender->mutex); @@ -228,7 +227,7 @@ catch(ConnectException&) { LogLog::debug(LOG4CXX_STR("Remote host ") - +socketAppender->address.getHostName() + +socketAppender->address->getHostName() +LOG4CXX_STR(" refused connection.")); } catch(IOException& e) @@ -237,7 +236,7 @@ log4cxx::helpers::Transcoder::decode(e.what(), exmsg); LogLog::debug(((LogString) LOG4CXX_STR("Could not connect to ")) - + socketAppender->address.getHostName() + + socketAppender->address->getHostName() + LOG4CXX_STR(". Exception is ") + exmsg); } Modified: logging/log4cxx/trunk/src/sockethubappender.cpp URL: http://svn.apache.org/viewcvs/logging/log4cxx/trunk/src/sockethubappender.cpp?rev=406123&r1=406122&r2=406123&view=diff ============================================================================== --- logging/log4cxx/trunk/src/sockethubappender.cpp (original) +++ logging/log4cxx/trunk/src/sockethubappender.cpp Sat May 13 09:05:49 2006 @@ -194,11 +194,11 @@ { try { - InetAddress remoteAddress = socket->getInetAddress(); + InetAddressPtr remoteAddress = socket->getInetAddress(); LogLog::debug(LOG4CXX_STR("accepting connection from ") - + remoteAddress.getHostName() + + remoteAddress->getHostName() + LOG4CXX_STR(" (") - + remoteAddress.getHostAddress() + + remoteAddress->getHostAddress() + LOG4CXX_STR(")")); // create an ObjectOutputStream Modified: logging/log4cxx/trunk/src/socketimpl.cpp URL: http://svn.apache.org/viewcvs/logging/log4cxx/trunk/src/socketimpl.cpp?rev=406123&r1=406122&r2=406123&view=diff ============================================================================== --- logging/log4cxx/trunk/src/socketimpl.cpp (original) +++ logging/log4cxx/trunk/src/socketimpl.cpp Sat May 13 09:05:49 2006 @@ -177,7 +177,7 @@ // Accept new connection apr_socket_t *clientSocket = 0; apr_status_t status = - apr_socket_accept(&clientSocket, (apr_socket_t*) socket, (apr_pool_t*) memoryPool.getAPRPool()); + apr_socket_accept(&clientSocket, (apr_socket_t*) socket, (apr_pool_t*) s->memoryPool.getAPRPool()); if (status != APR_SUCCESS) { throw SocketException(status); } @@ -189,7 +189,19 @@ throw SocketException(status); } - s->address.address = *((int*) client_addr->ipaddr_ptr); + // retrieve the IP address from the client socket's apr_sockaddr_t + LogString ipAddrString; + char *ipAddr; + apr_sockaddr_ip_get(&ipAddr, client_addr); + Transcoder::decode(ipAddr, strlen(ipAddr), ipAddrString); + + // retrieve the host name from the client socket's apr_sockaddr_t + LogString hostNameString; + char *hostName; + apr_getnameinfo(&hostName, client_addr, 0); + Transcoder::decode(hostName, strlen(hostName), hostNameString); + + s->address = new InetAddress(hostNameString, ipAddrString); s->socket = clientSocket; s->port = client_addr->port; } @@ -206,11 +218,11 @@ /** Binds this socket to the specified port number on the specified host. */ -void SocketImpl::bind(InetAddress address, int port) +void SocketImpl::bind(InetAddressPtr address, int port) { - LOG4CXX_ENCODE_CHAR(host, address.getHostAddress()); + LOG4CXX_ENCODE_CHAR(host, address->getHostAddress()); - // Create server socket address + // Create server socket address (including port number) apr_sockaddr_t *server_addr; apr_status_t status = apr_sockaddr_info_get(&server_addr, host.c_str(), APR_INET, @@ -238,7 +250,7 @@ throw SocketException(status); } - address.address = 0; + address = 0; socket = 0; port = 0; localport = -1; @@ -248,11 +260,11 @@ /** Connects this socket to the specified port number on the specified host. */ -void SocketImpl::connect(InetAddress address, int port) +void SocketImpl::connect(InetAddressPtr address, int port) { - LOG4CXX_ENCODE_CHAR(host, address.getHostAddress()); + LOG4CXX_ENCODE_CHAR(host, address->getHostAddress()); - // create socket address + // create socket address (including port) apr_sockaddr_t *client_addr; apr_status_t status = apr_sockaddr_info_get(&client_addr, host.c_str(), APR_INET, @@ -306,7 +318,7 @@ */ LogString SocketImpl::toString() const { - LogString oss(address.getHostAddress()); + LogString oss(address->getHostAddress()); oss.append(1, LOG4CXX_STR(':')); Pool p; oss.append(StringHelper::toString(port, p)); Modified: logging/log4cxx/trunk/src/xmlsocketappender.cpp URL: http://svn.apache.org/viewcvs/logging/log4cxx/trunk/src/xmlsocketappender.cpp?rev=406123&r1=406122&r2=406123&view=diff ============================================================================== --- logging/log4cxx/trunk/src/xmlsocketappender.cpp (original) +++ logging/log4cxx/trunk/src/xmlsocketappender.cpp Sat May 13 09:05:49 2006 @@ -50,7 +50,7 @@ memset(zeroBuffer, 0, MAX_EVENT_LEN); } -XMLSocketAppender::XMLSocketAppender(unsigned long address, int port) +XMLSocketAppender::XMLSocketAppender(InetAddressPtr address, int port) : SocketAppenderSkeleton(address, port, DEFAULT_RECONNECTION_DELAY) { layout = new XMLLayout(); Modified: logging/log4cxx/trunk/tests/src/Makefile.am URL: http://svn.apache.org/viewcvs/logging/log4cxx/trunk/tests/src/Makefile.am?rev=406123&r1=406122&r2=406123&view=diff ============================================================================== --- logging/log4cxx/trunk/tests/src/Makefile.am (original) +++ logging/log4cxx/trunk/tests/src/Makefile.am Sat May 13 09:05:49 2006 @@ -30,6 +30,7 @@ helpers/charsetencodertestcase.cpp \ helpers/cyclicbuffertestcase.cpp\ helpers/datetimedateformattestcase.cpp \ + helpers/inetaddresstestcase.cpp \ helpers/iso8601dateformattestcase.cpp \ helpers/localechanger.cpp\ helpers/optionconvertertestcase.cpp \ Added: logging/log4cxx/trunk/tests/src/helpers/inetaddresstestcase.cpp URL: http://svn.apache.org/viewcvs/logging/log4cxx/trunk/tests/src/helpers/inetaddresstestcase.cpp?rev=406123&view=auto ============================================================================== --- logging/log4cxx/trunk/tests/src/helpers/inetaddresstestcase.cpp (added) +++ logging/log4cxx/trunk/tests/src/helpers/inetaddresstestcase.cpp Sat May 13 09:05:49 2006 @@ -0,0 +1,88 @@ +/* + * Copyright 2005 The Apache Software Foundation. + * + * Licensed 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. + */ + +#include <cppunit/extensions/HelperMacros.h> +#include <log4cxx/helpers/inetaddress.h> + +using namespace log4cxx; +using namespace log4cxx::helpers; + + +class InetAddressTestCase : public CppUnit::TestFixture +{ + CPPUNIT_TEST_SUITE(InetAddressTestCase); + CPPUNIT_TEST(testGetLocalHost); + CPPUNIT_TEST(testByNameLocal); + CPPUNIT_TEST(testAllByNameLocal); + CPPUNIT_TEST_EXCEPTION(testUnknownHost, UnknownHostException); +// CPPUNIT_TEST(testByNameRemote); + CPPUNIT_TEST_SUITE_END(); + +public: + /** + * Tests the InetAddress::getLocalHost() method. + */ + void testGetLocalHost() { + InetAddressPtr addr = InetAddress::getLocalHost(); + + CPPUNIT_ASSERT(addr->getHostAddress() == LOG4CXX_STR("127.0.0.1")); + CPPUNIT_ASSERT(addr->getHostName().find(LOG4CXX_STR("localhost")) == 0); + } + + /** + * Tests the InetAddress::getByName() method with the + * "localhost" host name. + */ + void testByNameLocal() { + InetAddressPtr addr = InetAddress::getByName(LOG4CXX_STR("localhost")); + + CPPUNIT_ASSERT(addr->getHostAddress() == LOG4CXX_STR("127.0.0.1")); + CPPUNIT_ASSERT(addr->getHostName().find(LOG4CXX_STR("localhost")) == 0); + } + + /** + * Tests the InetAddress::getAllByName() method with the + * "localhost" host name. + */ + void testAllByNameLocal() { + std::vector<InetAddressPtr> addr = InetAddress::getAllByName(LOG4CXX_STR("localhost")); + + CPPUNIT_ASSERT(addr.size() > 0); + } + + /** + * Tests the UnknownHostException. + */ + void testUnknownHost() { + InetAddressPtr addr = InetAddress::getByName(LOG4CXX_STR("unknown.host.local")); + } + + /** + * Tests resolving a remote host name. + * This test is usually disabled in the test suite because it + * probably produces volatile data. + */ + void testByNameRemote() { + InetAddressPtr addr = InetAddress::getByName(LOG4CXX_STR("www.apache.org")); + + CPPUNIT_ASSERT(addr->getHostAddress() == LOG4CXX_STR("209.237.227.195")); + CPPUNIT_ASSERT(addr->getHostName() == LOG4CXX_STR("minotaur-2.apache.org")); + } +}; + + +CPPUNIT_TEST_SUITE_REGISTRATION(InetAddressTestCase); + Modified: logging/log4cxx/trunk/tests/src/shortsocketserver.cpp URL: http://svn.apache.org/viewcvs/logging/log4cxx/trunk/tests/src/shortsocketserver.cpp?rev=406123&r1=406122&r2=406123&view=diff ============================================================================== --- logging/log4cxx/trunk/tests/src/shortsocketserver.cpp (original) +++ logging/log4cxx/trunk/tests/src/shortsocketserver.cpp Sat May 13 09:05:49 2006 @@ -77,7 +77,7 @@ PropertyConfigurator::configure(sbuf.str()); LOG4CXX_INFO(logger, "Waiting to accept a new client."); SocketPtr socket = serverSocket.accept(); - LogString msg(socket->getInetAddress().toString()); + LogString msg(socket->getInetAddress()->toString()); msg.insert(0, LOG4CXX_STR("Connected to client at ")); LOG4CXX_INFO(logger, msg); LOG4CXX_INFO(logger, "Starting new socket node.");