summaryrefslogtreecommitdiff
path: root/network_io
diff options
context:
space:
mode:
authortrawick <trawick@13f79535-47bb-0310-9956-ffa450edef68>2001-04-02 23:58:37 +0000
committertrawick <trawick@13f79535-47bb-0310-9956-ffa450edef68>2001-04-02 23:58:37 +0000
commit8038c802e293da0c3f05dee1e3977a62320f6a5c (patch)
treeae5243b9bfb7c5bbeb470b2503e174aa1d5faa8e /network_io
parent5cc76eefe322a703f61dbab24a3d11c330f0c4fa (diff)
downloadlibapr-8038c802e293da0c3f05dee1e3977a62320f6a5c.tar.gz
fix apr_recvfrom() on Win32 so that it returns APR_EOF only for a
stream socket git-svn-id: http://svn.apache.org/repos/asf/apr/apr/trunk@61434 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'network_io')
-rw-r--r--network_io/win32/sendrecv.c10
-rw-r--r--network_io/win32/sockets.c13
2 files changed, 9 insertions, 14 deletions
diff --git a/network_io/win32/sendrecv.c b/network_io/win32/sendrecv.c
index bda92c44d..8f26e07c4 100644
--- a/network_io/win32/sendrecv.c
+++ b/network_io/win32/sendrecv.c
@@ -179,22 +179,14 @@ APR_DECLARE(apr_status_t) apr_recvfrom(apr_sockaddr_t *from,
{
apr_ssize_t rv;
- if (from == NULL){
- return APR_ENOMEM;
- /* Not sure if this is correct. Maybe we should just allocate
- the memory??
- */
- }
-
rv = recvfrom(sock->sock, buf, (*len), flags,
(struct sockaddr*)&from->sa, &from->salen);
if (rv == SOCKET_ERROR) {
(*len) = 0;
return apr_get_netos_error();
}
-
(*len) = rv;
- if (rv == 0)
+ if (rv == 0 && sock->type == SOCK_STREAM)
return APR_EOF;
return APR_SUCCESS;
diff --git a/network_io/win32/sockets.c b/network_io/win32/sockets.c
index 496d09572..679c57f52 100644
--- a/network_io/win32/sockets.c
+++ b/network_io/win32/sockets.c
@@ -72,8 +72,9 @@ static apr_status_t socket_cleanup(void *sock)
return APR_SUCCESS;
}
-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;
@@ -150,7 +151,7 @@ APR_DECLARE(apr_status_t) apr_socket_create(apr_socket_t **new, int ofamily,
if ((*new)->sock == INVALID_SOCKET) {
return apr_get_netos_error();
}
- set_socket_vars(*new, AF_INET);
+ set_socket_vars(*new, AF_INET, type);
(*new)->timeout = -1;
(*new)->disconnected = 0;
@@ -222,7 +223,7 @@ APR_DECLARE(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);
(*new)->timeout = -1;
(*new)->disconnected = 0;
@@ -326,7 +327,7 @@ APR_DECLARE(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)->disconnected = 0;
(*apr_sock)->sock = *os_sock_info->os_sock;
@@ -358,7 +359,9 @@ APR_DECLARE(apr_status_t) apr_os_sock_put(apr_socket_t **sock,
{
if ((*sock) == NULL) {
alloc_socket(sock, cont);
- set_socket_vars(*sock, AF_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, AF_INET, SOCK_STREAM);
(*sock)->timeout = -1;
(*sock)->disconnected = 0;
}