You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by bj...@hyperreal.org on 1999/10/29 16:21:04 UTC
cvs commit: apache-2.0/src/lib/apr/network_io/os2 os2calls.c os2calls.h Makefile.in networkio.h poll.c sendrecv.c sockets.c sockopt.c
bjh 99/10/29 07:21:04
Modified: src/lib/apr/file_io/os2 maperrorcode.c
src/lib/apr/network_io/os2 Makefile.in networkio.h poll.c
sendrecv.c sockets.c sockopt.c
Added: src/lib/apr/network_io/os2 os2calls.c os2calls.h
Log:
OS/2: Bypass EMX library's socket code and go straight to the OS/2 TCP/IP
stack. This should be more efficient and prevents handle collisions when using
native file API calls. This also means that file I/O calls (read()/write()
etc) can no longer be used on sockets.
Revision Changes Path
1.3 +35 -1 apache-2.0/src/lib/apr/file_io/os2/maperrorcode.c
Index: maperrorcode.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/lib/apr/file_io/os2/maperrorcode.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- maperrorcode.c 1999/10/18 10:23:21 1.2
+++ maperrorcode.c 1999/10/29 14:20:59 1.3
@@ -59,6 +59,7 @@
#include <errno.h>
#include <string.h>
#include <os2.h>
+#include "../../network_io/os2/os2calls.h"
int errormap[][2] = {
@@ -74,7 +75,40 @@
{ ERROR_FILENAME_EXCED_RANGE, APR_ENAMETOOLONG },
{ ERROR_INVALID_FUNCTION, APR_EINVAL },
{ ERROR_INVALID_HANDLE, APR_EBADF },
- { ERROR_NEGATIVE_SEEK, APR_ESPIPE }
+ { ERROR_NEGATIVE_SEEK, APR_ESPIPE },
+ { SOCEWOULDBLOCK, EWOULDBLOCK },
+ { SOCEINPROGRESS, EINPROGRESS },
+ { SOCEALREADY, EALREADY },
+ { SOCENOTSOCK, ENOTSOCK },
+ { SOCEDESTADDRREQ, EDESTADDRREQ },
+ { SOCEMSGSIZE, EMSGSIZE },
+ { SOCEPROTOTYPE, EPROTOTYPE },
+ { SOCENOPROTOOPT, ENOPROTOOPT },
+ { SOCEPROTONOSUPPORT, EPROTONOSUPPORT },
+ { SOCESOCKTNOSUPPORT, ESOCKTNOSUPPORT },
+ { SOCEOPNOTSUPP, EOPNOTSUPP },
+ { SOCEPFNOSUPPORT, EPFNOSUPPORT },
+ { SOCEAFNOSUPPORT, EAFNOSUPPORT },
+ { SOCEADDRINUSE, EADDRINUSE },
+ { SOCEADDRNOTAVAIL, EADDRNOTAVAIL },
+ { SOCENETDOWN, ENETDOWN },
+ { SOCENETUNREACH, ENETUNREACH },
+ { SOCENETRESET, ENETRESET },
+ { SOCECONNABORTED, ECONNABORTED },
+ { SOCECONNRESET, ECONNRESET },
+ { SOCENOBUFS, ENOBUFS },
+ { SOCEISCONN, EISCONN },
+ { SOCENOTCONN, ENOTCONN },
+ { SOCESHUTDOWN, ESHUTDOWN },
+ { SOCETOOMANYREFS, ETOOMANYREFS },
+ { SOCETIMEDOUT, ETIMEDOUT },
+ { SOCECONNREFUSED, ECONNREFUSED },
+ { SOCELOOP, ELOOP },
+ { SOCENAMETOOLONG, ENAMETOOLONG },
+ { SOCEHOSTDOWN, EHOSTDOWN },
+ { SOCEHOSTUNREACH, EHOSTUNREACH },
+ { SOCENOTEMPTY, ENOTEMPTY },
+ { SOCEPIPE, EPIPE }
};
#define MAPSIZE (sizeof(errormap)/sizeof(errormap[0]))
1.6 +2 -1 apache-2.0/src/lib/apr/network_io/os2/Makefile.in
Index: Makefile.in
===================================================================
RCS file: /home/cvs/apache-2.0/src/lib/apr/network_io/os2/Makefile.in,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- Makefile.in 1999/10/24 05:59:13 1.5
+++ Makefile.in 1999/10/29 14:21:00 1.6
@@ -18,7 +18,8 @@
sendrecv.o \
sockets.o \
sockopt.o \
- sockaddr.o
+ sockaddr.o \
+ os2calls.o
.c.o:
$(CC) $(CFLAGS) -c $(INCLUDES) $<
1.5 +3 -4 apache-2.0/src/lib/apr/network_io/os2/networkio.h
Index: networkio.h
===================================================================
RCS file: /home/cvs/apache-2.0/src/lib/apr/network_io/os2/networkio.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- networkio.h 1999/10/24 05:59:13 1.4
+++ networkio.h 1999/10/29 14:21:00 1.5
@@ -58,7 +58,10 @@
#include "apr_network_io.h"
#include "apr_general.h"
+#include "os2calls.h"
+int os2errno( unsigned long oserror );
+
struct socket_t {
ap_context_t *cntxt;
int socketdes;
@@ -77,10 +80,6 @@
int num_except;
int num_total;
};
-
-/* Pointers to dynamically linked API functions */
-extern int (*os2_select)(int *, int, int, int, long);
-extern int (*os2_sock_errno)();
/* Error codes returned from sock_errno() */
#define SOCBASEERR 10000
1.7 +9 -67 apache-2.0/src/lib/apr/network_io/os2/poll.c
Index: poll.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/lib/apr/network_io/os2/poll.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- poll.c 1999/10/18 14:53:24 1.6
+++ poll.c 1999/10/29 14:21:01 1.7
@@ -66,13 +66,6 @@
/* OS/2 doesn't have a poll function, implement using OS/2 style select */
-static int os2_select_init( int *s, int noreads, int nowrites, int noexcepts, long timeout );
-static int os2_sock_errno_init();
-
-int (*os2_select)(int *, int, int, int, long) = os2_select_init;
-int (*os2_sock_errno)() = os2_sock_errno_init;
-static HMODULE hSO32DLL;
-
ap_status_t ap_setup_poll(struct pollfd_t **new, ap_int32_t num, ap_context_t *cont)
{
*new = (struct pollfd_t *)ap_palloc(cont, sizeof(struct pollfd_t));
@@ -148,16 +141,16 @@
do {
for (i=0; i<pollfdset->num_total; i++) {
- pollfdset->r_socket_list[i] = _getsockhandle(pollfdset->socket_list[i]);
+ pollfdset->r_socket_list[i] = pollfdset->socket_list[i];
}
- rv = os2_select(pollfdset->r_socket_list,
- pollfdset->num_read,
- pollfdset->num_write,
- pollfdset->num_except,
- timeout > 0 ? timeout * 1000 : -1);
+ rv = select(pollfdset->r_socket_list,
+ pollfdset->num_read,
+ pollfdset->num_write,
+ pollfdset->num_except,
+ timeout >= 0 ? timeout * 1000 : -1);
- if (rv < 0 && os2_sock_errno() == SOCEINTR && timeout >= 0 ) {
+ if (rv < 0 && sock_errno() == SOCEINTR && timeout >= 0 ) {
time_t elapsed = time(NULL) - starttime;
if (timeout <= elapsed)
@@ -165,10 +158,10 @@
timeout -= elapsed;
}
- } while ( rv < 0 && os2_sock_errno() == SOCEINTR );
+ } while ( rv < 0 && sock_errno() == SOCEINTR );
(*nsds) = rv;
- return rv < 0 ? os2errno(os2_sock_errno()) : APR_SUCCESS;
+ return rv < 0 ? os2errno(sock_errno()) : APR_SUCCESS;
}
@@ -231,55 +224,4 @@
}
return APR_SUCCESS;
-}
-
-
-
-static int os2_fn_link()
-{
- if (os2_select == os2_select_init || os2_select == NULL) {
- DosEnterCritSec(); /* Stop two threads doing this at the same time */
-
- if (os2_select == os2_select_init || os2_select == NULL) {
- ULONG rc;
- char errorstr[200];
-
- rc = DosLoadModule(errorstr, sizeof(errorstr), "SO32DLL", &hSO32DLL);
-
- if (rc)
- return os2errno(rc);
-
- rc = DosQueryProcAddr(hSO32DLL, 0, "SELECT", &os2_select);
-
- if (rc)
- return os2errno(rc);
-
- rc = DosQueryProcAddr(hSO32DLL, 0, "SOCK_ERRNO", &os2_sock_errno);
-
- if (rc)
- return os2errno(rc);
- }
- DosExitCritSec();
- }
- return APR_SUCCESS;
-}
-
-
-
-static int os2_select_init(int *s, int noreads, int nowrites, int noexcepts, long timeout)
-{
- int rc = os2_fn_link();
- if (rc == APR_SUCCESS)
- return os2_select(s, noreads, nowrites, noexcepts, timeout);
- return rc;
-}
-
-
-
-static int os2_sock_errno_init()
-{
- int rc = os2_fn_link();
- if (rc == APR_SUCCESS)
- return os2_sock_errno();
- return rc;
}
1.5 +18 -18 apache-2.0/src/lib/apr/network_io/os2/sendrecv.c
Index: sendrecv.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/lib/apr/network_io/os2/sendrecv.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- sendrecv.c 1999/10/29 14:00:03 1.4
+++ sendrecv.c 1999/10/29 14:21:01 1.5
@@ -67,17 +67,17 @@
ssize_t rv;
do {
- rv = write(sock->socketdes, buf, (*len));
- } while (rv == -1 && errno == EINTR);
+ rv = send(sock->socketdes, buf, (*len), 0);
+ } while (rv == -1 && sock_errno() == SOCEINTR);
- if (rv == -1 && errno == EAGAIN && sock->timeout > 0) {
+ if (rv == -1 && sock_errno() == SOCEWOULDBLOCK && sock->timeout != 0) {
int fds;
int srv;
do {
fds = sock->socketdes;
- srv = os2_select(&fds, 0, 1, 0, sock->timeout);
- } while (srv == -1 && errno == EINTR);
+ srv = select(&fds, 0, 1, 0, sock->timeout >= 0 ? sock->timeout*1000 : -1);
+ } while (srv == -1 && sock_errno() == SOCEINTR);
if (srv == 0) {
(*len) = -1;
@@ -85,18 +85,18 @@
}
else if (srv < 0) {
(*len) = -1;
- return errno;
+ return os2errno(sock_errno());
}
else {
do {
- rv = write(sock->socketdes, buf, (*len));
- } while (rv == -1 && errno == EINTR);
+ rv = send(sock->socketdes, buf, (*len), 0);
+ } while (rv == -1 && sock_errno() == SOCEINTR);
}
}
if (rv < 0) {
*len = 0;
- return errno;
+ return os2errno(sock_errno());
}
(*len) = rv;
@@ -110,17 +110,17 @@
ssize_t rv;
do {
- rv = read(sock->socketdes, buf, (*len));
- } while (rv == -1 && errno == EINTR);
+ rv = recv(sock->socketdes, buf, (*len), 0);
+ } while (rv == -1 && sock_errno() == SOCEINTR);
- if (rv == -1 && errno == EAGAIN && sock->timeout > 0) {
+ if (rv == -1 && sock_errno() == SOCEWOULDBLOCK && sock->timeout != 0) {
int fds;
int srv;
do {
fds = sock->socketdes;
- srv = os2_select(&fds, 1, 0, 0, sock->timeout);
- } while (srv == -1 && errno == EINTR);
+ srv = select(&fds, 1, 0, 0, sock->timeout >= 0 ? sock->timeout*1000 : -1);
+ } while (srv == -1 && sock_errno() == SOCEINTR);
if (srv == 0) {
(*len) = -1;
@@ -128,18 +128,18 @@
}
else if (srv < 0) {
(*len) = -1;
- return errno;
+ return os2errno(sock_errno());
}
else {
do {
- rv = read(sock->socketdes, buf, (*len));
- } while (rv == -1 && errno == EINTR);
+ rv = recv(sock->socketdes, buf, (*len), 0);
+ } while (rv == -1 && sock_errno() == SOCEINTR);
}
}
if (rv < 0) {
*len = 0;
- return errno;
+ return os2errno(sock_errno());
}
(*len) = rv;
1.7 +12 -11 apache-2.0/src/lib/apr/network_io/os2/sockets.c
Index: sockets.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/lib/apr/network_io/os2/sockets.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- sockets.c 1999/10/24 13:08:25 1.6
+++ sockets.c 1999/10/29 14:21:01 1.7
@@ -65,16 +65,17 @@
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
+#include "os2calls.h"
ap_status_t socket_cleanup(void *sock)
{
struct socket_t *thesocket = sock;
- if (close(thesocket->socketdes) == 0) {
+ if (soclose(thesocket->socketdes) == 0) {
thesocket->socketdes = -1;
return APR_SUCCESS;
}
else {
- return errno;
+ return os2errno(sock_errno());
}
}
@@ -95,7 +96,7 @@
return APR_ENOMEM;
}
- (*new)->socketdes = socket(AF_INET ,SOCK_STREAM, IPPROTO_TCP);
+ (*new)->socketdes = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
(*new)->local_addr->sin_family = AF_INET;
(*new)->remote_addr->sin_family = AF_INET;
@@ -103,7 +104,7 @@
(*new)->addr_len = sizeof(*(*new)->local_addr);
if ((*new)->socketdes < 0) {
- return errno;
+ return os2errno(sock_errno());
}
(*new)->timeout = -1;
ap_register_cleanup((*new)->cntxt, (void *)(*new),
@@ -117,7 +118,7 @@
return APR_SUCCESS;
}
else {
- return errno;
+ return os2errno(sock_errno());
}
}
@@ -134,7 +135,7 @@
{
sock->local_addr->sin_addr.s_addr = INADDR_ANY;
if (bind(sock->socketdes, (struct sockaddr *)sock->local_addr, sock->addr_len) == -1)
- return errno;
+ return os2errno(sock_errno());
else
return APR_SUCCESS;
}
@@ -142,7 +143,7 @@
ap_status_t ap_listen(struct socket_t *sock, ap_int32_t backlog)
{
if (listen(sock->socketdes, backlog) == -1)
- return errno;
+ return os2errno(sock_errno());
else
return APR_SUCCESS;
}
@@ -162,7 +163,7 @@
&(*new)->addr_len);
if ((*new)->socketdes < 0) {
- return errno;
+ return os2errno(sock_errno());
}
ap_register_cleanup((*new)->cntxt, (void *)(*new),
@@ -191,9 +192,9 @@
sock->addr_len = sizeof(*sock->remote_addr);
}
- if ((connect(sock->socketdes, (const struct sockaddr *)sock->remote_addr, sock->addr_len) < 0) &&
- (errno != EINPROGRESS)) {
- return errno;
+ if ((connect(sock->socketdes, (struct sockaddr *)sock->remote_addr, sock->addr_len) < 0) &&
+ (sock_errno() != SOCEINPROGRESS)) {
+ return os2errno(sock_errno());
}
else {
int namelen = sizeof(*sock->local_addr);
1.6 +93 -1 apache-2.0/src/lib/apr/network_io/os2/sockopt.c
Index: sockopt.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/lib/apr/network_io/os2/sockopt.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- sockopt.c 1999/10/18 11:32:13 1.5
+++ sockopt.c 1999/10/29 14:21:02 1.6
@@ -53,4 +53,96 @@
*
*/
-#include "../unix/sockopt.c"
+#include "networkio.h"
+#include "apr_network_io.h"
+#include "apr_general.h"
+#include "apr_lib.h"
+#include <errno.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <netinet/tcp.h>
+#include <netinet/in.h>
+#include <unistd.h>
+#include <netdb.h>
+#include <sys/so_ioctl.h>
+
+
+ap_status_t ap_setsocketopt(struct socket_t *sock, ap_int32_t opt, ap_int32_t on)
+{
+ int one;
+ struct linger li;
+
+ if (on)
+ one = 1;
+ else
+ one = 0;
+
+ if (opt & APR_SO_KEEPALIVE) {
+ if (setsockopt(sock->socketdes, SOL_SOCKET, SO_KEEPALIVE, (void *)&one, sizeof(int)) == -1) {
+ return os2errno(sock_errno());
+ }
+ }
+ if (opt & APR_SO_DEBUG) {
+ if (setsockopt(sock->socketdes, SOL_SOCKET, SO_DEBUG, (void *)&one, sizeof(int)) == -1) {
+ return os2errno(sock_errno());
+ }
+ }
+ if (opt & APR_SO_REUSEADDR) {
+ if (setsockopt(sock->socketdes, SOL_SOCKET, SO_REUSEADDR, (void *)&one, sizeof(int)) == -1) {
+ return os2errno(sock_errno());
+ }
+ }
+ if (opt & APR_SO_SNDBUF) {
+ if (setsockopt(sock->socketdes, SOL_SOCKET, SO_SNDBUF, (void *)&on, sizeof(int)) == -1) {
+ return os2errno(sock_errno());
+ }
+ }
+ if (opt & APR_SO_NONBLOCK) {
+ if (ioctl(sock->socketdes, FIONBIO, (caddr_t)&on, sizeof(on)) == -1) {
+ return os2errno(sock_errno());
+ }
+ }
+ if (opt & APR_SO_LINGER) {
+ li.l_onoff = on;
+ li.l_linger = MAX_SECS_TO_LINGER;
+ if (setsockopt(sock->socketdes, SOL_SOCKET, SO_LINGER, (char *) &li, sizeof(struct linger)) == -1) {
+ return os2errno(sock_errno());
+ }
+ }
+ if (opt & APR_SO_TIMEOUT) {
+ sock->timeout = on;
+ }
+ return APR_SUCCESS;
+}
+
+
+
+ap_status_t ap_gethostname(char *buf, ap_int32_t len, ap_context_t *cont)
+{
+ if (gethostname(buf, len) == -1)
+ return os2errno(sock_errno());
+ else
+ return APR_SUCCESS;
+}
+
+
+
+ap_status_t ap_get_remote_hostname(char **name, struct socket_t *sock)
+{
+ struct hostent *hptr;
+
+ hptr = gethostbyaddr((char *)&(sock->remote_addr->sin_addr),
+ sizeof(struct in_addr), AF_INET);
+ if (hptr != NULL) {
+ *name = ap_pstrdup(sock->cntxt, hptr->h_name);
+ if (*name) {
+ return APR_SUCCESS;
+ }
+ return APR_ENOMEM;
+ }
+
+ /* XXX - Is this threadsafe? */
+ return h_errno;
+}
+
+
1.1 apache-2.0/src/lib/apr/network_io/os2/os2calls.c
Index: os2calls.c
===================================================================
/* ====================================================================
* Copyright (c) 1999 The Apache Group. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. All advertising materials mentioning features or use of this
* software must display the following acknowledgment:
* "This product includes software developed by the Apache Group
* for use in the Apache HTTP server project (http://www.apache.org/)."
*
* 4. The names "Apache Server" and "Apache Group" must not be used to
* endorse or promote products derived from this software without
* prior written permission. For written permission, please contact
* apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* 6. Redistributions of any form whatsoever must retain the following
* acknowledgment:
* "This product includes software developed by the Apache Group
* for use in the Apache HTTP server project (http://www.apache.org/)."
*
* THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE APACHE GROUP OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Group.
* For more information on the Apache Group and the Apache HTTP server
* project, please see <http://www.apache.org/>.
*
*/
#include "networkio.h"
#include "apr_network_io.h"
#include "apr_portable.h"
#include "apr_general.h"
#include "apr_lib.h"
#define INCL_DOS
#include <os2.h>
static int os2_socket_init(int, int ,int);
int (*apr_os2_socket)(int, int, int) = os2_socket_init;
int (*apr_os2_select)(int *, int, int, int, long) = NULL;
int (*apr_os2_sock_errno)() = NULL;
int (*apr_os2_accept)(int, struct sockaddr *, int *) = NULL;
int (*apr_os2_bind)(int, struct sockaddr *, int) = NULL;
int (*apr_os2_connect)(int, struct sockaddr *, int) = NULL;
int (*apr_os2_getpeername)(int, struct sockaddr *, int *) = NULL;
int (*apr_os2_getsockname)(int, struct sockaddr *, int *) = NULL;
int (*apr_os2_getsockopt)(int, int, int, char *, int *) = NULL;
int (*apr_os2_ioctl)(int, int, caddr_t, int) = NULL;
int (*apr_os2_listen)(int, int) = NULL;
int (*apr_os2_recv)(int, char *, int, int) = NULL;
int (*apr_os2_send)(int, const char *, int, int) = NULL;
int (*apr_os2_setsockopt)(int, int, int, char *, int) = NULL;
int (*apr_os2_shutdown)(int, int) = NULL;
int (*apr_os2_soclose)(int) = NULL;
int (*apr_os2_writev)(int, struct iovec *, int) = NULL;
static HMODULE hSO32DLL;
static int os2_fn_link()
{
DosEnterCritSec(); /* Stop two threads doing this at the same time */
if (apr_os2_socket == os2_socket_init) {
ULONG rc;
char errorstr[200];
rc = DosLoadModule(errorstr, sizeof(errorstr), "SO32DLL", &hSO32DLL);
if (rc)
return os2errno(rc);
rc = DosQueryProcAddr(hSO32DLL, 0, "SOCKET", &apr_os2_socket);
if (!rc)
rc = DosQueryProcAddr(hSO32DLL, 0, "SELECT", &apr_os2_select);
if (!rc)
rc = DosQueryProcAddr(hSO32DLL, 0, "SOCK_ERRNO", &apr_os2_sock_errno);
if (!rc)
rc = DosQueryProcAddr(hSO32DLL, 0, "ACCEPT", &apr_os2_accept);
if (!rc)
rc = DosQueryProcAddr(hSO32DLL, 0, "BIND", &apr_os2_bind);
if (!rc)
rc = DosQueryProcAddr(hSO32DLL, 0, "CONNECT", &apr_os2_connect);
if (!rc)
rc = DosQueryProcAddr(hSO32DLL, 0, "GETPEERNAME", &apr_os2_getpeername);
if (!rc)
rc = DosQueryProcAddr(hSO32DLL, 0, "GETSOCKNAME", &apr_os2_getsockname);
if (!rc)
rc = DosQueryProcAddr(hSO32DLL, 0, "GETSOCKOPT", &apr_os2_getsockopt);
if (!rc)
rc = DosQueryProcAddr(hSO32DLL, 0, "IOCTL", &apr_os2_ioctl);
if (!rc)
rc = DosQueryProcAddr(hSO32DLL, 0, "LISTEN", &apr_os2_listen);
if (!rc)
rc = DosQueryProcAddr(hSO32DLL, 0, "RECV", &apr_os2_recv);
if (!rc)
rc = DosQueryProcAddr(hSO32DLL, 0, "SEND", &apr_os2_send);
if (!rc)
rc = DosQueryProcAddr(hSO32DLL, 0, "SETSOCKOPT", &apr_os2_setsockopt);
if (!rc)
rc = DosQueryProcAddr(hSO32DLL, 0, "SHUTDOWN", &apr_os2_shutdown);
if (!rc)
rc = DosQueryProcAddr(hSO32DLL, 0, "SOCLOSE", &apr_os2_soclose);
if (!rc)
rc = DosQueryProcAddr(hSO32DLL, 0, "WRITEV", &apr_os2_writev);
if (rc)
return os2errno(rc);
}
DosExitCritSec();
return APR_SUCCESS;
}
static int os2_socket_init(int domain, int type, int protocol)
{
int rc = os2_fn_link();
if (rc == APR_SUCCESS)
return apr_os2_socket(domain, type, protocol);
return rc;
}
1.1 apache-2.0/src/lib/apr/network_io/os2/os2calls.h
Index: os2calls.h
===================================================================
/* ====================================================================
* Copyright (c) 1999 The Apache Group. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. All advertising materials mentioning features or use of this
* software must display the following acknowledgment:
* "This product includes software developed by the Apache Group
* for use in the Apache HTTP server project (http://www.apache.org/)."
*
* 4. The names "Apache Server" and "Apache Group" must not be used to
* endorse or promote products derived from this software without
* prior written permission. For written permission, please contact
* apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* 6. Redistributions of any form whatsoever must retain the following
* acknowledgment:
* "This product includes software developed by the Apache Group
* for use in the Apache HTTP server project (http://www.apache.org/)."
*
* THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE APACHE GROUP OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Group.
* For more information on the Apache Group and the Apache HTTP server
* project, please see <http://www.apache.org/>.
*
*/
#include <sys/types.h>
#include <sys/socket.h>
extern int (*apr_os2_socket)(int, int, int);
extern int (*apr_os2_select)(int *, int, int, int, long);
extern int (*apr_os2_sock_errno)();
extern int (*apr_os2_accept)(int, struct sockaddr *, int *);
extern int (*apr_os2_bind)(int, struct sockaddr *, int);
extern int (*apr_os2_connect)(int, struct sockaddr *, int);
extern int (*apr_os2_getpeername)(int, struct sockaddr *, int *);
extern int (*apr_os2_getsockname)(int, struct sockaddr *, int *);
extern int (*apr_os2_getsockopt)(int, int, int, char *, int *);
extern int (*apr_os2_ioctl)(int, int, caddr_t, int);
extern int (*apr_os2_listen)(int, int);
extern int (*apr_os2_recv)(int, char *, int, int);
extern int (*apr_os2_send)(int, const char *, int, int);
extern int (*apr_os2_setsockopt)(int, int, int, char *, int);
extern int (*apr_os2_shutdown)(int, int);
extern int (*apr_os2_soclose)(int);
extern int (*apr_os2_writev)(int, struct iovec *, int);
#define socket apr_os2_socket
#define select apr_os2_select
#define sock_errno apr_os2_sock_errno
#define accept apr_os2_accept
#define bind apr_os2_bind
#define connect apr_os2_connect
#define getpeername apr_os2_getpeername
#define getsockname apr_os2_getsockname
#define getsockopt apr_os2_getsockopt
#define ioctl apr_os2_ioctl
#define listen apr_os2_listen
#define recv apr_os2_recv
#define send apr_os2_send
#define setsockopt apr_os2_setsockopt
#define shutdown apr_os2_shutdown
#define soclose apr_os2_soclose
#define writev apr_os2_writev
/* Error codes returned by above calls */
#define SOCBASEERR 10000
#define SOCEPERM (SOCBASEERR+1) /* Not owner */
#define SOCESRCH (SOCBASEERR+3) /* No such process */
#define SOCEINTR (SOCBASEERR+4) /* Interrupted system call */
#define SOCENXIO (SOCBASEERR+6) /* No such device or address */
#define SOCEBADF (SOCBASEERR+9) /* Bad file number */
#define SOCEACCES (SOCBASEERR+13) /* Permission denied */
#define SOCEFAULT (SOCBASEERR+14) /* Bad address */
#define SOCEINVAL (SOCBASEERR+22) /* Invalid argument */
#define SOCEMFILE (SOCBASEERR+24) /* Too many open files */
#define SOCEPIPE (SOCBASEERR+32) /* Broken pipe */
#define SOCEOS2ERR (SOCBASEERR+100) /* OS/2 Error */
#define SOCEWOULDBLOCK (SOCBASEERR+35) /* Operation would block */
#define SOCEINPROGRESS (SOCBASEERR+36) /* Operation now in progress */
#define SOCEALREADY (SOCBASEERR+37) /* Operation already in progress */
#define SOCENOTSOCK (SOCBASEERR+38) /* Socket operation on non-socket */
#define SOCEDESTADDRREQ (SOCBASEERR+39) /* Destination address required */
#define SOCEMSGSIZE (SOCBASEERR+40) /* Message too long */
#define SOCEPROTOTYPE (SOCBASEERR+41) /* Protocol wrong type for socket */
#define SOCENOPROTOOPT (SOCBASEERR+42) /* Protocol not available */
#define SOCEPROTONOSUPPORT (SOCBASEERR+43) /* Protocol not supported */
#define SOCESOCKTNOSUPPORT (SOCBASEERR+44) /* Socket type not supported */
#define SOCEOPNOTSUPP (SOCBASEERR+45) /* Operation not supported on socket */
#define SOCEPFNOSUPPORT (SOCBASEERR+46) /* Protocol family not supported */
#define SOCEAFNOSUPPORT (SOCBASEERR+47) /* Address family not supported by protocol family */
#define SOCEADDRINUSE (SOCBASEERR+48) /* Address already in use */
#define SOCEADDRNOTAVAIL (SOCBASEERR+49) /* Can't assign requested address */
#define SOCENETDOWN (SOCBASEERR+50) /* Network is down */
#define SOCENETUNREACH (SOCBASEERR+51) /* Network is unreachable */
#define SOCENETRESET (SOCBASEERR+52) /* Network dropped connection on reset */
#define SOCECONNABORTED (SOCBASEERR+53) /* Software caused connection abort */
#define SOCECONNRESET (SOCBASEERR+54) /* Connection reset by peer */
#define SOCENOBUFS (SOCBASEERR+55) /* No buffer space available */
#define SOCEISCONN (SOCBASEERR+56) /* Socket is already connected */
#define SOCENOTCONN (SOCBASEERR+57) /* Socket is not connected */
#define SOCESHUTDOWN (SOCBASEERR+58) /* Can't send after socket shutdown */
#define SOCETOOMANYREFS (SOCBASEERR+59) /* Too many references: can't splice */
#define SOCETIMEDOUT (SOCBASEERR+60) /* Connection timed out */
#define SOCECONNREFUSED (SOCBASEERR+61) /* Connection refused */
#define SOCELOOP (SOCBASEERR+62) /* Too many levels of symbolic links */
#define SOCENAMETOOLONG (SOCBASEERR+63) /* File name too long */
#define SOCEHOSTDOWN (SOCBASEERR+64) /* Host is down */
#define SOCEHOSTUNREACH (SOCBASEERR+65) /* No route to host */
#define SOCENOTEMPTY (SOCBASEERR+66) /* Directory not empty */