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 2001/07/24 18:05:24 UTC
cvs commit: apr/network_io/os2 os2calls.c sendrecv_udp.c sockets.c
bjh 01/07/24 09:05:24
Modified: include/arch/os2 networkio.h os2calls.h
network_io/os2 os2calls.c sendrecv_udp.c sockets.c
Log:
OS/2: Add support for datagram sockets.
Mostly adapted from the unix code.
Revision Changes Path
1.22 +1 -0 apr/include/arch/os2/networkio.h
Index: networkio.h
===================================================================
RCS file: /home/cvs/apr/include/arch/os2/networkio.h,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- networkio.h 2001/07/16 20:37:00 1.21
+++ networkio.h 2001/07/24 16:05:24 1.22
@@ -66,6 +66,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;
1.7 +4 -0 apr/include/arch/os2/os2calls.h
Index: os2calls.h
===================================================================
RCS file: /home/cvs/apr/include/arch/os2/os2calls.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- os2calls.h 2001/02/16 04:15:50 1.6
+++ os2calls.h 2001/07/24 16:05:24 1.7
@@ -73,6 +73,8 @@
extern int (*apr_os2_shutdown)(int, int);
extern int (*apr_os2_soclose)(int);
extern int (*apr_os2_writev)(int, struct iovec *, int);
+extern int (*apr_os2_sendto)(int, const char *, int, int, const struct sockaddr *, int);
+extern int (*apr_os2_recvfrom)(int, char *, int, int, struct sockaddr *, int *);
#define socket apr_os2_socket
#define select apr_os2_select
@@ -91,3 +93,5 @@
#define shutdown apr_os2_shutdown
#define soclose apr_os2_soclose
#define writev apr_os2_writev
+#define sendto apr_os2_sendto
+#define recvfrom apr_os2_recvfrom
1.7 +8 -0 apr/network_io/os2/os2calls.c
Index: os2calls.c
===================================================================
RCS file: /home/cvs/apr/network_io/os2/os2calls.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- os2calls.c 2001/02/16 04:16:00 1.6
+++ os2calls.c 2001/07/24 16:05:24 1.7
@@ -77,6 +77,8 @@
int (*apr_os2_shutdown)(int, int) = NULL;
int (*apr_os2_soclose)(int) = NULL;
int (*apr_os2_writev)(int, struct iovec *, int) = NULL;
+int (*apr_os2_sendto)(int, const char *, int, int, const struct sockaddr *, int);
+int (*apr_os2_recvfrom)(int, char *, int, int, struct sockaddr *, int *);
static HMODULE hSO32DLL;
@@ -142,6 +144,12 @@
if (!rc)
rc = DosQueryProcAddr(hSO32DLL, 0, "WRITEV", &apr_os2_writev);
+
+ if (!rc)
+ rc = DosQueryProcAddr(hSO32DLL, 0, "SENDTO", &apr_os2_sendto);
+
+ if (!rc)
+ rc = DosQueryProcAddr(hSO32DLL, 0, "RECVFROM", &apr_os2_recvfrom);
if (rc)
return APR_OS2_STATUS(rc);
1.2 +88 -2 apr/network_io/os2/sendrecv_udp.c
Index: sendrecv_udp.c
===================================================================
RCS file: /home/cvs/apr/network_io/os2/sendrecv_udp.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- sendrecv_udp.c 2001/03/19 12:35:14 1.1
+++ sendrecv_udp.c 2001/07/24 16:05:24 1.2
@@ -59,15 +59,101 @@
#include "apr_lib.h"
#include <sys/time.h>
+apr_status_t apr_wait_for_io_or_timeout(apr_socket_t *sock, int for_read)
+{
+ int waitsock = sock->socketdes;
+ int srv;
+
+ do {
+ waitsock = sock->socketdes;
+ srv = select(&waitsock, for_read > 0, !for_read, 0, sock->timeout / 1000);
+ } while (srv < 0 && sock_errno() == SOCEINTR);
+
+ if (srv == 0) {
+ return APR_TIMEUP;
+ }
+ else if (srv < 0) {
+ return APR_FROM_OS_ERROR(sock_errno());
+ }
+
+ return APR_SUCCESS;
+}
+
+
+
apr_status_t apr_sendto(apr_socket_t *sock, apr_sockaddr_t *where,
apr_int32_t flags, const char *buf, apr_size_t *len)
{
- return APR_ENOTIMPL;
+ ssize_t rv;
+ int serrno;
+
+ do {
+ 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(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) {
+ *len = 0;
+ return APR_FROM_OS_ERROR(serrno);
+ }
+
+ *len = rv;
+ return APR_SUCCESS;
}
+
+
apr_status_t apr_recvfrom(apr_sockaddr_t *from, apr_socket_t *sock,
apr_int32_t flags, char *buf,
apr_size_t *len)
{
- return APR_ENOTIMPL;
+ ssize_t rv;
+ 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(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);
+ }
+ }
+
+ 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;
}
1.46 +7 -6 apr/network_io/os2/sockets.c
Index: sockets.c
===================================================================
RCS file: /home/cvs/apr/network_io/os2/sockets.c,v
retrieving revision 1.45
retrieving revision 1.46
diff -u -r1.45 -r1.46
--- sockets.c 2001/07/24 12:41:37 1.45
+++ sockets.c 2001/07/24 16:05:24 1.46
@@ -84,8 +84,9 @@
}
}
-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->family = family;
sock->local_addr->sa.sin.sin_family = family;
sock->remote_addr->family = family;
@@ -151,7 +152,7 @@
return APR_ENOMEM;
}
- (*new)->socketdes = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ (*new)->socketdes = socket(AF_INET, type, 0);
#if APR_HAVE_IPV6
if ((*new)->socketdes < 0 && ofamily == AF_UNSPEC) {
family = AF_INET;
@@ -162,7 +163,7 @@
if ((*new)->socketdes < 0) {
return APR_OS2_STATUS(sock_errno());
}
- set_socket_vars(*new, family);
+ set_socket_vars(*new, family, type);
(*new)->timeout = -1;
(*new)->nonblock = FALSE;
@@ -213,7 +214,7 @@
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)->nonblock = FALSE;
@@ -274,7 +275,7 @@
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) {
@@ -304,7 +305,7 @@
}
if ((*sock) == NULL) {
alloc_socket(sock, cont);
- set_socket_vars(*sock, AF_INET);
+ set_socket_vars(*sock, AF_INET, SOCK_STREAM);
}
(*sock)->socketdes = *thesock;
return APR_SUCCESS;