You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4cxx-dev@logging.apache.org by af...@apache.org on 2006/05/13 18:05:51 UTC

svn commit: r406123 - in /logging/log4cxx/trunk: include/log4cxx/helpers/ include/log4cxx/net/ simplesocketserver/ src/ tests/src/ tests/src/helpers/

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.");