You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by bj...@apache.org on 2010/03/16 17:55:55 UTC
svn commit: r923868 - /apr/apr/trunk/network_io/os2/sendrecv_udp.c
Author: bjh
Date: Tue Mar 16 16:55:55 2010
New Revision: 923868
URL: http://svn.apache.org/viewvc?rev=923868&view=rev
Log:
OS/2: Rework apr_socket_sendto() & apr_socket_recvfrom() to not use
apr_wait_for_io_or_timeout() and to eliminate code duplication.
Modified:
apr/apr/trunk/network_io/os2/sendrecv_udp.c
Modified: apr/apr/trunk/network_io/os2/sendrecv_udp.c
URL: http://svn.apache.org/viewvc/apr/apr/trunk/network_io/os2/sendrecv_udp.c?rev=923868&r1=923867&r2=923868&view=diff
==============================================================================
--- apr/apr/trunk/network_io/os2/sendrecv_udp.c (original)
+++ apr/apr/trunk/network_io/os2/sendrecv_udp.c Tue Mar 16 16:55:55 2010
@@ -22,8 +22,24 @@
#include "apr_lib.h"
#include <sys/time.h>
+static apr_status_t wait_socket_ready(apr_socket_t *sock, int readwrite)
+{
+ int pollsocket = sock->socketdes;
+ int wait_rc = select(&pollsocket, readwrite == 0, readwrite == 1, 0, sock->timeout / 1000);
+
+ if (wait_rc == 0) {
+ return APR_TIMEUP;
+ }
+ else if (wait_rc < 0) {
+ return APR_FROM_OS_ERROR(sock_errno());
+ }
+
+ return APR_SUCCESS;
+}
+
+
-APR_DECLARE(apr_status_t) apr_socket_sendto(apr_socket_t *sock,
+APR_DECLARE(apr_status_t) apr_socket_sendto(apr_socket_t *sock,
apr_sockaddr_t *where,
apr_int32_t flags, const char *buf,
apr_size_t *len)
@@ -35,30 +51,28 @@ APR_DECLARE(apr_status_t) apr_socket_sen
rv = sendto(sock->socketdes, buf, (*len), flags,
(struct sockaddr*)&where->sa,
where->salen);
- } while (rv == -1 && (serrno = sock_errno()) == EINTR);
- if (rv == -1 && serrno == SOCEWOULDBLOCK && sock->timeout != 0) {
- apr_status_t arv = apr_wait_for_io_or_timeout(NULL, sock, 0);
-
- if (arv != APR_SUCCESS) {
- *len = 0;
- return arv;
- } else {
- do {
- rv = sendto(sock->socketdes, buf, *len, flags,
- (const struct sockaddr*)&where->sa,
- where->salen);
- } while (rv == -1 && (serrno = sock_errno()) == SOCEINTR);
- }
- }
+ if (rv == -1) {
+ serrno = sock_errno();
- if (rv == -1) {
- *len = 0;
- return APR_FROM_OS_ERROR(serrno);
- }
+ if (serrno == SOCEWOULDBLOCK && sock->timeout != 0) {
+ apr_status_t wait_status = wait_socket_ready(sock, 1);
- *len = rv;
- return APR_SUCCESS;
+ if (wait_status != APR_SUCCESS) {
+ *len = 0;
+ return wait_status;
+ }
+ }
+ else if (serrno != SOCEINTR) {
+ *len = 0;
+ return APR_FROM_OS_ERROR(serrno);
+ }
+ }
+ else {
+ *len = rv;
+ return APR_SUCCESS;
+ }
+ } while (1);
}
@@ -72,33 +86,31 @@ APR_DECLARE(apr_status_t) apr_socket_rec
int serrno;
do {
- rv = recvfrom(sock->socketdes, buf, (*len), flags,
- (struct sockaddr*)&from->sa, &from->salen);
- } while (rv == -1 && (serrno = sock_errno()) == EINTR);
-
- if (rv == -1 && serrno == SOCEWOULDBLOCK && sock->timeout != 0) {
- apr_status_t arv = apr_wait_for_io_or_timeout(NULL, sock, 1);
-
- if (arv != APR_SUCCESS) {
- *len = 0;
- return arv;
- } else {
- do {
- rv = recvfrom(sock->socketdes, buf, *len, flags,
- (struct sockaddr*)&from->sa, &from->salen);
- } while (rv == -1 && (serrno = sock_errno()) == EINTR);
+ from->salen = sizeof(from->sa);
+ rv = recvfrom(sock->socketdes, buf, (*len), flags,
+ (struct sockaddr*)&from->sa,
+ &from->salen);
+
+ if (rv == -1) {
+ serrno = sock_errno();
+
+ if (serrno == SOCEWOULDBLOCK && sock->timeout != 0) {
+ apr_status_t wait_status = wait_socket_ready(sock, 0);
+
+ if (wait_status != APR_SUCCESS) {
+ *len = 0;
+ return wait_status;
+ }
+ }
+ else if (serrno != SOCEINTR) {
+ *len = 0;
+ return APR_FROM_OS_ERROR(serrno);
+ }
}
- }
-
- if (rv == -1) {
- (*len) = 0;
- return APR_FROM_OS_ERROR(serrno);
- }
-
- (*len) = rv;
-
- if (rv == 0 && sock->type == SOCK_STREAM)
- return APR_EOF;
-
- return APR_SUCCESS;
+ else {
+ *len = rv;
+ apr_sockaddr_vars_set(from, from->sa.sin.sin_family, ntohs(from->sa.sin.sin_port));
+ return (rv == 0 && sock->type == SOCK_STREAM) ? APR_EOF : APR_SUCCESS;
+ }
+ } while (1);
}