Damir Dezeljin <[EMAIL PROTECTED]> writes: > Hi. > > I writen an daemon which is executed in inetd (part of the code is below). > I have problems getting remote IP address and remote port. I use: > apr_socket_addr_get(&addr_local, APR_LOCAL, apr_sock); > to get local address and port, and > apr_socket_addr_get(&addr_local, APR_LOCAL, apr_sock); > to get the remote one, but this doesn't work (I get 0.0.0.0 for the IP and > port 0).
Please try this patch. I'm 99% sure it is golden, but I can't commit until I have Win32 and OS/2 paths fixed up and if you're awake in the meantime you might as well test it too :) Index: include/arch/unix/networkio.h =================================================================== RCS file: /home/cvs/apr/include/arch/unix/networkio.h,v retrieving revision 1.56 diff -u -r1.56 networkio.h --- include/arch/unix/networkio.h 22 Oct 2002 20:05:35 -0000 1.56 +++ include/arch/unix/networkio.h 25 Oct 2002 13:04:04 -0000 @@ -135,6 +135,7 @@ #endif int local_port_unknown; int local_interface_unknown; + int remote_addr_unknown; apr_int32_t netmask; apr_int32_t inherit; }; Index: network_io/unix/sa_common.c =================================================================== RCS file: /home/cvs/apr/network_io/unix/sa_common.c,v retrieving revision 1.68 diff -u -r1.68 sa_common.c --- network_io/unix/sa_common.c 15 Oct 2002 12:27:38 -0000 1.68 +++ network_io/unix/sa_common.c 25 Oct 2002 13:04:05 -0000 @@ -209,6 +209,13 @@ *sa = sock->local_addr; } else if (which == APR_REMOTE) { + if (sock->remote_addr_unknown) { + apr_status_t rv = get_remote_addr(sock); + + if (rv != APR_SUCCESS) { + return rv; + } + } *sa = sock->remote_addr; } else { Index: network_io/unix/sockaddr.c =================================================================== RCS file: /home/cvs/apr/network_io/unix/sockaddr.c,v retrieving revision 1.29 diff -u -r1.29 sockaddr.c --- network_io/unix/sockaddr.c 5 Apr 2002 22:15:04 -0000 1.29 +++ network_io/unix/sockaddr.c 25 Oct 2002 13:04:05 -0000 @@ -70,6 +70,21 @@ } } +static apr_status_t get_remote_addr(apr_socket_t *sock) +{ + sock->remote_addr->salen = sizeof(sock->remote_addr->sa); + if (getpeername(sock->socketdes, (struct sockaddr *)&sock->remote_addr->sa, + &sock->remote_addr->salen) < 0) { + return errno; + } + else { + sock->remote_addr_unknown = 0; + /* XXX assumes sin_port and sin6_port at same offset */ + sock->remote_addr->port = ntohs(sock->remote_addr->sa.sin.sin_port); + return APR_SUCCESS; + } +} + /* included here to allow us to use get_local_addr(). NOTE: this file (sockaddr.c) can be included from other directories. If Index: network_io/unix/sockets.c =================================================================== RCS file: /home/cvs/apr/network_io/unix/sockets.c,v retrieving revision 1.103 diff -u -r1.103 sockets.c --- network_io/unix/sockets.c 18 Oct 2002 14:13:38 -0000 1.103 +++ network_io/unix/sockets.c 25 Oct 2002 13:04:05 -0000 @@ -362,6 +362,9 @@ /* XXX IPv6 - this assumes sin_port and sin6_port at same offset */ (*apr_sock)->remote_addr->port = ntohs((*apr_sock)->remote_addr->sa.sin.sin_port); } + else { + (*apr_sock)->remote_addr_unknown = 1; + } (*apr_sock)->inherit = 0; apr_pool_cleanup_register((*apr_sock)->cntxt, (void *)(*apr_sock), @@ -381,6 +384,7 @@ (*sock)->timeout = -1; } (*sock)->local_port_unknown = (*sock)->local_interface_unknown = 1; + (*sock)->remote_addr_unknown = 1; (*sock)->socketdes = *thesock; return APR_SUCCESS; } -- Jeff Trawick | [EMAIL PROTECTED] Born in Roswell... married an alien...