bjh 99/10/29 07:37:33
Modified: src/os/os2 iol_socket.h iol_socket.c
src/modules/mpm/spmt_os2 spmt_os2.c
Log:
OS/2: APRize iol_socket
Revision Changes Path
1.2 +3 -1 apache-2.0/src/os/os2/iol_socket.h
Index: iol_socket.h
===================================================================
RCS file: /home/cvs/apache-2.0/src/os/os2/iol_socket.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- iol_socket.h 1999/07/11 14:49:07 1.1
+++ iol_socket.h 1999/10/29 14:37:27 1.2
@@ -58,6 +58,8 @@
#ifndef OS_UNIX_IOL_SOCKET_H
#define OS_UNIX_IOL_SOCKET_H
-ap_iol *os2_attach_socket(int fd);
+#include <apr_network_io.h>
+
+ap_iol *os2_attach_socket(ap_socket_t *sock);
#endif
1.4 +34 -50 apache-2.0/src/os/os2/iol_socket.c
Index: iol_socket.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/os/os2/iol_socket.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- iol_socket.c 1999/10/21 09:03:09 1.3
+++ iol_socket.c 1999/10/29 14:37:28 1.4
@@ -59,6 +59,8 @@
#include "httpd.h"
#include "ap_iol.h"
#include "iol_socket.h"
+#include <apr_network_io.h>
+#include <apr_file_io.h>
#include <errno.h>
#include <sys/types.h>
@@ -68,19 +70,15 @@
typedef struct {
ap_iol iol;
- int fd;
- int flags;
- int timeout;
+ ap_socket_t *sock;
} iol_socket;
static ap_status_t os2_setopt(ap_iol *viol, ap_iol_option opt,
const void *value)
{
- iol_socket *iol = (iol_socket *)viol;
-
switch (opt) {
case AP_IOL_TIMEOUT:
- iol->timeout = *(const int *)value;
+ ap_setsocketopt(((iol_socket *)viol)->sock, APR_SO_TIMEOUT, *(const
int *)value);
break;
default:
return APR_EINVAL;
@@ -90,42 +88,15 @@
static ap_status_t os2_getopt(ap_iol *viol, ap_iol_option opt, void *value)
{
- iol_socket *iol = (iol_socket *)viol;
-
switch (opt) {
case AP_IOL_TIMEOUT:
- *(int *)value = iol->timeout;
- break;
+ /* There's no APR getopt yet but nothing uses this option anyway */
default:
return APR_EINVAL;
}
return APR_SUCCESS;
}
-static ap_status_t set_nonblock(int fd)
-{
- int fd_flags;
- int rv;
-
- fd_flags = fcntl(fd, F_GETFL, 0);
-#if defined(O_NONBLOCK)
- fd_flags |= O_NONBLOCK;
- rv = fcntl(fd, F_SETFL, fd_flags);
-#elif defined(O_NDELAY)
- fd_flags |= O_NDELAY;
- rv = fcntl(fd, F_SETFL, fd_flags);
-#elif defined(FNDELAY)
- fd_flags |= O_FNDELAY;
- rv = fcntl(fd, F_SETFL, fd_flags);
-#else
-#error "your unix lacks non-blocking i/o, you lose"
-#endif
- if (rv == 0) {
- return APR_SUCCESS;
- }
- return errno;
-}
-
/* the timeout code is a separate routine because it requires
a stack frame... and we don't want to pay that setup cost
on every call */
@@ -148,6 +119,7 @@
rv = ap_select(iol->fd + 1, selread, selwrite, NULL, iol->timeout <
0 ? NULL : &tv); \
} while (rv == -1 && errno == EINTR); \
if (!FD_ISSET(iol->fd, &fdset)) { \
+ *nbytes = 0; \
return APR_ETIMEDOUT; \
} \
do { \
@@ -157,6 +129,7 @@
*nbytes = rv; \
return APR_SUCCESS; \
} \
+ *nbytes = 0; \
return errno; \
\
} \
@@ -166,7 +139,7 @@
iol_socket *iol = (iol_socket *)viol; \
int rv; \
\
- /* Present to zero until some bytes are actually written */ \
+ /* Preset to zero until some bytes are actually written */ \
*nbytes = 0; \
if (!(iol->flags & FD_NONBLOCKING_SET)) { \
if (iol->timeout < 0) { \
@@ -189,27 +162,44 @@
do { \
rv = syscall(iol->fd, arg1, arg2); \
} while (rv == -1 && errno == EINTR); \
- if ((errno == EWOULDBLOCK || errno == EAGAIN) && iol->timeout != 0) { \
- return os2_##name##_timeout(viol, arg1, arg2, nbytes); \
- } \
if (rv >= 0) { \
*nbytes = rv; \
return APR_SUCCESS; \
} \
+ if ((errno == EWOULDBLOCK || errno == EAGAIN) && iol->timeout != 0) { \
+ return os2_##name##_timeout(viol, arg1, arg2, nbytes); \
+ } \
return errno; \
}
+
+// method(write, (ap_iol *viol, const char *arg1, ap_size_t arg2, ap_ssize_t
*nbytes), write, NULL, &fdset)
+ap_status_t os2_write(ap_iol *viol, const char *buf, ap_size_t size,
ap_ssize_t *nbytes)
+{
+ *nbytes = size;
+ return ap_send(((iol_socket *)viol)->sock, buf, nbytes);
+}
-method(write, (ap_iol *viol, const char *arg1, ap_size_t arg2, ap_ssize_t
*nbytes), write, NULL, &fdset)
-method(writev, (ap_iol *viol, const struct iovec *arg1, int arg2, ap_ssize_t
*nbytes), writev, NULL, &fdset)
-method(read, (ap_iol *viol, char *arg1, ap_size_t arg2, ap_ssize_t *nbytes),
read, &fdset, NULL)
+// method(writev, (ap_iol *viol, const struct iovec *arg1, int arg2,
ap_ssize_t *nbytes), writev, NULL, &fdset)
+ap_status_t os2_writev(ap_iol *viol, const struct iovec *vec, int size,
ap_ssize_t *nbytes)
+{
+ *nbytes = size;
+ return ap_sendv(((iol_socket *)viol)->sock, vec, size, nbytes);
+}
+// method(read, (ap_iol *viol, char *arg1, ap_size_t arg2, ap_ssize_t
*nbytes), read, &fdset, NULL)
+ap_status_t os2_read(ap_iol *viol, char *buf, ap_size_t size, ap_ssize_t
*nbytes)
+{
+ *nbytes = size;
+ return ap_recv(((iol_socket *)viol)->sock, buf, nbytes);
+}
+
static ap_status_t os2_close(ap_iol *viol)
{
iol_socket *iol = (iol_socket *)viol;
int rv;
int saved_errno;
- rv = close(iol->fd);
+ rv = ap_close_socket(iol->sock);
saved_errno = errno;
free(iol);
if (rv == 0) {
@@ -227,18 +217,12 @@
os2_getopt
};
-ap_iol *os2_attach_socket(int fd)
+ap_iol *os2_attach_socket(ap_socket_t *sock)
{
iol_socket *iol;
- if (fd >= FD_SETSIZE) {
- errno = EBADF;
- return NULL;
- }
iol = malloc(sizeof(iol_socket));
iol->iol.methods = &socket_methods;
- iol->fd = fd;
- iol->timeout = -1;
- iol->flags = 0;
+ iol->sock = sock;
return (ap_iol *)iol;
}
1.19 +10 -29 apache-2.0/src/modules/mpm/spmt_os2/spmt_os2.c
Index: spmt_os2.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/modules/mpm/spmt_os2/spmt_os2.c,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -r1.18 -r1.19
--- spmt_os2.c 1999/10/24 13:08:30 1.18
+++ spmt_os2.c 1999/10/29 14:37:31 1.19
@@ -100,7 +100,6 @@
/* *Non*-shared http_main globals... */
static server_rec *server_conf;
-static int listenmaxfd;
/* one_process --- debugging mode variable; can be set from the command line
* with the -X flag. If set, this gets you the child_main loop running
@@ -834,7 +833,7 @@
}
#if defined(TCP_NODELAY) && !defined(MPE) && !defined(TPF)
-static void sock_disable_nagle(int s)
+static void sock_disable_nagle(ap_socket_t *s)
{
/* The Nagle algorithm says that we should delay sending partial
* packets in hopes of getting more data. We don't want to do
@@ -846,10 +845,11 @@
* In spite of these problems, failure here is not a shooting offense.
*/
int just_say_no = 1;
+ ap_status_t status;
- if (setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char *) &just_say_no,
- sizeof(int)) < 0) {
- ap_log_error(APLOG_MARK, APLOG_WARNING, errno, server_conf,
+ status = ap_setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char *)
&just_say_no, sizeof(int));
+ if (status != APR_SUCCESS) {
+ ap_log_error(APLOG_MARK, APLOG_WARNING, status, server_conf,
"setsockopt: (TCP_NODELAY)");
}
}
@@ -901,9 +901,6 @@
static void child_main(void *child_num_arg)
{
- NET_SIZE_T clen;
- struct sockaddr sa_server;
- struct sockaddr sa_client;
ap_listen_rec *lr = NULL;
ap_listen_rec *first_lr = NULL;
ap_context_t *ptrans;
@@ -914,7 +911,7 @@
int requests_this_child = 0;
ap_pollfd_t *listen_poll;
ap_socket_t *csd = NULL;
- int nsds, rv, sockdes;
+ int nsds, rv;
/* Disable the restart signal handlers and enable the just_die stuff.
* Note that since restart() just notes that a restart has been
@@ -1133,29 +1130,13 @@
* socket options, file descriptors, and read/write buffers.
*/
- ap_get_os_sock(&sockdes, csd);
- clen = sizeof(sa_server);
- if (getsockname(sockdes, &sa_server, &clen) < 0) {
- ap_log_error(APLOG_MARK, APLOG_ERR, errno, server_conf,
"getsockname");
- ap_close_socket(csd);
- continue;
- }
-
- sock_disable_nagle(sockdes);
+ sock_disable_nagle(csd);
- iol = os2_attach_socket(sockdes);
+ iol = os2_attach_socket(csd);
if (iol == NULL) {
- if (errno == EBADF) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_WARNING, 0, NULL,
- "filedescriptor (%u) larger than FD_SETSIZE (%u) "
- "found, you probably need to rebuild Apache with a "
- "larger FD_SETSIZE", sockdes, FD_SETSIZE);
- }
- else {
- ap_log_error(APLOG_MARK, APLOG_WARNING, errno, NULL,
- "error attaching to socket");
- }
+ ap_log_error(APLOG_MARK, APLOG_WARNING|APLOG_NOERRNO, 0, NULL,
+ "error attaching to socket");
ap_close_socket(csd);
continue;
}