summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/arch/unix/networkio.h1
-rw-r--r--network_io/unix/sendrecv.c9
-rw-r--r--network_io/unix/sockets.c13
3 files changed, 10 insertions, 13 deletions
diff --git a/include/arch/unix/networkio.h b/include/arch/unix/networkio.h
index 9c6db4edc..af12997f4 100644
--- a/include/arch/unix/networkio.h
+++ b/include/arch/unix/networkio.h
@@ -122,6 +122,7 @@
struct apr_socket_t {
apr_pool_t *cntxt;
int socketdes;
+ int type;
apr_sockaddr_t *local_addr;
apr_sockaddr_t *remote_addr;
apr_interval_time_t timeout;
diff --git a/network_io/unix/sendrecv.c b/network_io/unix/sendrecv.c
index 9c5ba0f7a..467a7a7d8 100644
--- a/network_io/unix/sendrecv.c
+++ b/network_io/unix/sendrecv.c
@@ -193,13 +193,6 @@ apr_status_t apr_recvfrom(apr_sockaddr_t *from, apr_socket_t *sock,
{
ssize_t rv;
- if (from == NULL){
- return APR_ENOMEM;
- /* Not sure if this is correct. Maybe we should just allocate
- the memory??
- */
- }
-
do {
rv = recvfrom(sock->socketdes, buf, (*len), flags,
(struct sockaddr*)&from->sa, &from->salen);
@@ -224,7 +217,7 @@ apr_status_t apr_recvfrom(apr_sockaddr_t *from, apr_socket_t *sock,
}
(*len) = rv;
- if (rv == 0)
+ if (rv == 0 && sock->type == SOCK_STREAM)
return APR_EOF;
return APR_SUCCESS;
diff --git a/network_io/unix/sockets.c b/network_io/unix/sockets.c
index 5ab6826ab..1d40c3319 100644
--- a/network_io/unix/sockets.c
+++ b/network_io/unix/sockets.c
@@ -72,8 +72,9 @@ static apr_status_t socket_cleanup(void *sock)
}
}
-static void set_socket_vars(apr_socket_t *sock, int family)
+static void set_socket_vars(apr_socket_t *sock, int family, int type)
{
+ sock->type = type;
sock->local_addr->sa.sin.sin_family = family;
sock->remote_addr->sa.sin.sin_family = family;
@@ -152,7 +153,7 @@ apr_status_t apr_socket_create(apr_socket_t **new, int ofamily, int type,
if ((*new)->socketdes < 0) {
return errno;
}
- set_socket_vars(*new, family);
+ set_socket_vars(*new, family, type);
(*new)->timeout = -1;
apr_pool_cleanup_register((*new)->cntxt, (void *)(*new),
@@ -198,7 +199,7 @@ apr_status_t apr_listen(apr_socket_t *sock, apr_int32_t backlog)
apr_status_t apr_accept(apr_socket_t **new, apr_socket_t *sock, apr_pool_t *connection_context)
{
alloc_socket(new, connection_context);
- set_socket_vars(*new, sock->local_addr->sa.sin.sin_family);
+ set_socket_vars(*new, sock->local_addr->sa.sin.sin_family, SOCK_STREAM);
#ifndef HAVE_POLL
(*new)->connected = 1;
@@ -305,7 +306,7 @@ apr_status_t apr_os_sock_make(apr_socket_t **apr_sock,
apr_pool_t *cont)
{
alloc_socket(apr_sock, cont);
- set_socket_vars(*apr_sock, os_sock_info->family);
+ set_socket_vars(*apr_sock, os_sock_info->family, os_sock_info->type);
(*apr_sock)->timeout = -1;
(*apr_sock)->socketdes = *os_sock_info->os_sock;
if (os_sock_info->local) {
@@ -337,7 +338,9 @@ apr_status_t apr_os_sock_put(apr_socket_t **sock, apr_os_sock_t *thesock,
if ((*sock) == NULL) {
alloc_socket(sock, cont);
/* XXX IPv6 figure out the family here! */
- set_socket_vars(*sock, APR_INET);
+ /* XXX figure out the actual socket type here */
+ /* *or* just decide that apr_os_sock_put() has to be told the family and type */
+ set_socket_vars(*sock, APR_INET, SOCK_STREAM);
(*sock)->timeout = -1;
}
(*sock)->local_port_unknown = (*sock)->local_interface_unknown = 1;