dgaudet 99/06/24 01:58:06
Modified: mpm/src/include ap_iol.h buff.h
mpm/src/main Makefile.tmpl alloc.c buff.c
mpm/src/modules/mpm/prefork prefork.c
mpm/src/os/unix Makefile.tmpl
Added: mpm/src/main iol_file.c
mpm/src/os/unix iol_socket.c iol_socket.h
Removed: mpm/src/main iol_unix.c
Log:
I think this is a better i/o layer interface.
- move main/iol_unix.c to os/unix/iol_socket.c
- create main/iol_file.c ... use APR methods eventually
- remove iol_data from ap_iol, instead the ap_iol is just embedded into
the private data of the i/o layer
- remove ap_bpushfd(), replace with ap_bpush_iol()
Revision Changes Path
1.3 +6 -4 apache-2.0/mpm/src/include/ap_iol.h
Index: ap_iol.h
===================================================================
RCS file: /home/cvs/apache-2.0/mpm/src/include/ap_iol.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- ap_iol.h 1999/06/19 20:40:16 1.2
+++ ap_iol.h 1999/06/24 08:57:58 1.3
@@ -107,8 +107,10 @@
/* TODO: accept, connect, ... */
};
+/* it is expected that each io layer will extend this structure as they
+ require; they must only ensure that the methods pointer remains in
+ the indicated position. */
struct ap_iol {
- void *iol_data;
const ap_iol_methods *methods;
};
@@ -120,8 +122,8 @@
#define iol_setopt(iol, a, b) ((iol)->methods->setopt((iol), (a), (b)))
#define iol_getopt(iol, a, b) ((iol)->methods->getopt((iol), (a), (b)))
-/* clean this up later as well */
-
-void unix_attach_fd(ap_iol *, int fd);
+/* the file iol */
+/* TODO: use APR instead of unix semantics for this */
+ap_iol *ap_open_file(const char *name, int flags, int mask);
#endif
1.5 +3 -2 apache-2.0/mpm/src/include/buff.h
Index: buff.h
===================================================================
RCS file: /home/cvs/apache-2.0/mpm/src/include/buff.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- buff.h 1999/06/24 07:29:29 1.4
+++ buff.h 1999/06/24 08:57:58 1.5
@@ -145,7 +145,7 @@
ap_pool *pool;
- ap_iol iol;
+ ap_iol *iol;
};
/* Options to bset/getopt */
@@ -155,7 +155,8 @@
/* Stream creation and modification */
API_EXPORT(BUFF *) ap_bcreate(pool *p, int flags);
-API_EXPORT(void) ap_bpushfd(BUFF *fb, int fd);
+
+API_EXPORT(void) ap_bpush_iol(BUFF *fb, ap_iol *iol);
/* XXX - unused right now - mvsk */
API_EXPORT(BUFF *) ap_bopenf(pool *a, const char *name, int flg, int mode);
1.6 +1 -1 apache-2.0/mpm/src/main/Makefile.tmpl
Index: Makefile.tmpl
===================================================================
RCS file: /home/cvs/apache-2.0/mpm/src/main/Makefile.tmpl,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- Makefile.tmpl 1999/06/20 23:49:32 1.5
+++ Makefile.tmpl 1999/06/24 08:58:00 1.6
@@ -11,7 +11,7 @@
http_config.o http_core.o http_log.o \
http_main.o http_protocol.o http_request.o http_vhost.o \
util.o util_date.o util_script.o util_uri.o util_md5.o \
- rfc1413.o http_connection.o iol_unix.o
+ rfc1413.o http_connection.o iol_file.o
.c.o:
$(CC) -c $(INCLUDES) $(CFLAGS) $<
1.5 +4 -0 apache-2.0/mpm/src/main/alloc.c
Index: alloc.c
===================================================================
RCS file: /home/cvs/apache-2.0/mpm/src/main/alloc.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- alloc.c 1999/06/22 22:26:10 1.4
+++ alloc.c 1999/06/24 08:58:00 1.5
@@ -2370,6 +2370,9 @@
enum kill_conditions kill_how,
BUFF **pipe_in, BUFF **pipe_out, BUFF
**pipe_err)
{
+ return 0;
+ /* TODO: need to abstract the spawning stuff in a more clean manner */
+#if 0
#ifdef WIN32
SECURITY_ATTRIBUTES sa = {0};
HANDLE hPipeOutputRead = NULL;
@@ -2588,6 +2591,7 @@
#endif
return pid;
+#endif
}
static void free_proc_chain(struct process_chain *procs)
1.6 +13 -14 apache-2.0/mpm/src/main/buff.c
Index: buff.c
===================================================================
RCS file: /home/cvs/apache-2.0/mpm/src/main/buff.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- buff.c 1999/06/24 07:29:31 1.5
+++ buff.c 1999/06/24 08:58:00 1.6
@@ -177,17 +177,16 @@
{
BUFF *fb = v;
- iol_close(&fb->iol);
+ iol_close(fb->iol);
}
/*
* Push some I/O file descriptors onto the stream
*/
-API_EXPORT(void) ap_bpushfd(BUFF *fb, APRFile fd)
+API_EXPORT(void) ap_bpush_iol(BUFF *fb, ap_iol *iol)
{
- ap_kill_cleanups_for_fd(fb->pool, fd);
+ fb->iol = iol;
ap_register_cleanup(fb->pool, fb, bcleanup, bcleanup);
- unix_attach_fd(&fb->iol, fd);
}
API_EXPORT(int) ap_bsetopt(BUFF *fb, int optname, const void *optval)
@@ -203,7 +202,7 @@
fb->flags |= B_NONBLOCK;
/* XXX: should remove B_WR now... */
}
- return iol_setopt(&fb->iol, AP_IOL_TIMEOUT, optval);
+ return iol_setopt(fb->iol, AP_IOL_TIMEOUT, optval);
}
errno = EINVAL;
return -1;
@@ -222,7 +221,7 @@
return 0;
case BO_TIMEOUT:
- return iol_getopt(&fb->iol, AP_IOL_TIMEOUT, optval);
+ return iol_getopt(fb->iol, AP_IOL_TIMEOUT, optval);
}
errno = EINVAL;
return -1;
@@ -313,7 +312,7 @@
{
int rv;
- rv = iol_read(&fb->iol, buf, nbyte);
+ rv = iol_read(fb->iol, buf, nbyte);
if (rv == 0) {
fb->flags |= B_EOF;
}
@@ -533,7 +532,7 @@
{
int rv;
- rv = iol_writev(&fb->iol, vec, nvec);
+ rv = iol_writev(fb->iol, vec, nvec);
if (rv == -1) {
fb->saved_errno = errno;
if (errno != EAGAIN) {
@@ -678,7 +677,7 @@
{
int rv;
- rv = iol_write(&fb->iol, buf, nbyte);
+ rv = iol_write(fb->iol, buf, nbyte);
if (rv == -1) {
fb->saved_errno = errno;
if (errno != EAGAIN) {
@@ -803,7 +802,7 @@
else
rc1 = 0;
ap_kill_cleanup(fb->pool, fb, bcleanup);
- rc2 = iol_close(&fb->iol);
+ rc2 = iol_close(fb->iol);
fb->inptr = fb->inbase;
fb->incnt = 0;
@@ -926,15 +925,15 @@
API_EXPORT(BUFF *) ap_bopenf(pool *a, const char *name, int flg, int mode)
{
- int fd;
+ ap_iol *iol;
BUFF *fb;
- fd = ap_popenf(a, name, flg, mode);
- if (!fd) {
+ iol = ap_open_file(name, flg, mode);
+ if (!iol) {
return NULL;
}
fb = ap_bcreate(a, ((flg &(B_RD|B_RDWR)) ? B_RD : 0)
| ((flg & (B_WR|B_RDWR)) ? B_WR : 0));
- ap_bpushfd(fb, fd);
+ ap_bpush_iol(fb, iol);
return fb;
}
1.1 apache-2.0/mpm/src/main/iol_file.c
Index: iol_file.c
===================================================================
/* ====================================================================
* Copyright (c) 1996-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
* [EMAIL PROTECTED]
*
* 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 and was originally based
* on public domain software written at the National Center for
* Supercomputing Applications, University of Illinois, Urbana-Champaign.
* For more information on the Apache Group and the Apache HTTP server
* project, please see <http://www.apache.org/>.
*
*/
#include "httpd.h"
#include "ap_iol.h"
#include <sys/uio.h>
typedef struct {
ap_iol iol;
int fd;
} iol_file;
#define method(syscall, args) \
static int file_##syscall args \
{ \
iol_file *iol = (iol_file *)viol; \
int rv; \
/* try writing, ignoring EINTR, the upper layer has to handle \
partial read/writes anyhow, so we can return early */ \
do { \
rv = syscall(iol->fd, arg1, arg2); \
} while (rv == -1 && errno == EINTR); \
return rv; \
}
method(write, (ap_iol *viol, const char *arg1, int arg2))
method(writev, (ap_iol *viol, const struct iovec *arg1, int arg2))
method(read, (ap_iol *viol, char *arg1, int arg2))
method(readv, (ap_iol *viol, struct iovec *arg1, int arg2))
static int file_close(ap_iol *viol)
{
iol_file *iol = (iol_file *)viol;
int rv;
int saved_errno;
rv = close(iol->fd);
saved_errno = errno;
free(iol);
errno = saved_errno;
return rv;
}
static int file_setopt(ap_iol *viol, ap_iol_option opt, const void *value)
{
errno = EINVAL;
return -1;
}
static int file_getopt(ap_iol *viol, ap_iol_option opt, void *value)
{
errno = EINVAL;
return -1;
}
static const ap_iol_methods file_methods = {
file_close,
file_write,
file_writev,
file_read,
file_readv,
file_setopt,
file_getopt
};
ap_iol *ap_open_file(const char *name, int flags, int mask)
{
int rv;
iol_file *iol;
rv = open(name, flags, mask);
if (rv < 0) {
return NULL;
}
iol = malloc(sizeof(iol_file));
iol->iol.methods = &file_methods;
iol->fd = rv;
return (ap_iol *)iol;
}
1.3 +20 -24 apache-2.0/mpm/src/modules/mpm/prefork/prefork.c
Index: prefork.c
===================================================================
RCS file: /home/cvs/apache-2.0/mpm/src/modules/mpm/prefork/prefork.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- prefork.c 1999/06/24 07:29:32 1.2
+++ prefork.c 1999/06/24 08:58:03 1.3
@@ -97,6 +97,7 @@
#include "scoreboard_prefork.h"
#include "ap_mpm.h"
#include "unixd.h"
+#include "iol_socket.h"
#ifdef USE_SHMGET_SCOREBOARD
#include <sys/types.h>
#include <sys/ipc.h>
@@ -2395,6 +2396,7 @@
listen_rec *lr;
pool *ptrans;
conn_rec *current_conn;
+ ap_iol *iol;
my_pid = getpid();
csd = -1;
@@ -2601,19 +2603,6 @@
*/
signal(SIGUSR1, SIG_IGN);
- ap_note_cleanups_for_fd(ptrans, csd);
-
- /* protect various fd_sets */
-#ifdef CHECK_FD_SETSIZE
- if (csd >= FD_SETSIZE) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_WARNING, NULL,
- "[csd] filedescriptor (%u) larger than FD_SETSIZE (%u) "
- "found, you probably need to rebuild Apache with a "
- "larger FD_SETSIZE", csd, FD_SETSIZE);
- continue;
- }
-#endif
-
/*
* We now have a connection, so set it up with the appropriate
* socket options, file descriptors, and read/write buffers.
@@ -2622,27 +2611,34 @@
clen = sizeof(sa_server);
if (getsockname(csd, &sa_server, &clen) < 0) {
ap_log_error(APLOG_MARK, APLOG_ERR, server_conf, "getsockname");
+ close(csd);
continue;
}
sock_disable_nagle(csd);
+ iol = unix_attach_socket(csd);
+ if (iol == NULL) {
+ if (errno == EBADF) {
+ ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_WARNING, NULL,
+ "filedescriptor (%u) larger than FD_SETSIZE (%u) "
+ "found, you probably need to rebuild Apache with a "
+ "larger FD_SETSIZE", csd, FD_SETSIZE);
+ }
+ else {
+ ap_log_error(APLOG_MARK, APLOG_WARNING, NULL,
+ "error attaching to socket");
+ }
+ close(csd);
+ continue;
+ }
+
(void) ap_update_child_status(my_child_num, SERVER_BUSY_READ,
(request_rec *) NULL);
conn_io = ap_bcreate(ptrans, B_RDWR);
-
-#ifdef B_SFIO
- (void) sfdisc(conn_io->sf_in, SF_POPDISC);
- sfdisc(conn_io->sf_in, bsfio_new(conn_io->pool, conn_io));
- sfsetbuf(conn_io->sf_in, NULL, 0);
-
- (void) sfdisc(conn_io->sf_out, SF_POPDISC);
- sfdisc(conn_io->sf_out, bsfio_new(conn_io->pool, conn_io));
- sfsetbuf(conn_io->sf_out, NULL, 0);
-#endif
- ap_bpushfd(conn_io, csd);
+ ap_bpush_iol(conn_io, iol);
current_conn = new_connection(ptrans, server_conf, conn_io,
(struct sockaddr_in *) &sa_client,
1.5 +1 -1 apache-2.0/mpm/src/os/unix/Makefile.tmpl
Index: Makefile.tmpl
===================================================================
RCS file: /home/cvs/apache-2.0/mpm/src/os/unix/Makefile.tmpl,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- Makefile.tmpl 1999/06/20 23:14:35 1.4
+++ Makefile.tmpl 1999/06/24 08:58:04 1.5
@@ -3,7 +3,7 @@
INCLUDES=$(INCLUDES1) $(INCLUDES0) $(EXTRA_INCLUDES)
LDFLAGS=$(LDFLAGS1) $(EXTRA_LDFLAGS)
-OBJS= os.o os-inline.o unixd.o
+OBJS= os.o os-inline.o unixd.o iol_socket.o
LIB= libos.a
1.1 apache-2.0/mpm/src/os/unix/iol_socket.c
Index: iol_socket.c
===================================================================
/* ====================================================================
* Copyright (c) 1996-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
* [EMAIL PROTECTED]
*
* 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 and was originally based
* on public domain software written at the National Center for
* Supercomputing Applications, University of Illinois, Urbana-Champaign.
* For more information on the Apache Group and the Apache HTTP server
* project, please see <http://www.apache.org/>.
*
*/
#include "httpd.h"
#include "ap_iol.h"
#include <errno.h>
#include <sys/types.h>
#include <sys/uio.h>
#define FD_NONBLOCKING_SET (1)
typedef struct {
ap_iol iol;
int fd;
int flags;
int timeout;
} iol_socket;
static int unix_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;
break;
default:
errno = EINVAL;
return -1;
}
return 0;
}
static int unix_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;
default:
errno = EINVAL;
return -1;
}
return 0;
}
static int set_nonblock(int fd)
{
int fd_flags;
fd_flags = fcntl(fd, F_GETFL, 0);
#if defined(O_NONBLOCK)
fd_flags |= O_NONBLOCK;
return fcntl(fd, F_SETFL, fd_flags);
#elif defined(O_NDELAY)
fd_flags |= O_NDELAY;
return fcntl(fd, F_SETFL, fd_flags);
#elif defined(FNDELAY)
fd_flags |= O_FNDELAY;
return fcntl(fd, F_SETFL, fd_flags);
#else
#error "your unix lacks non-blocking i/o, you lose"
#endif
}
/* 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 */
/* this macro expands into the four basic i/o methods */
#define method(name, args, syscall, selread, selwrite) \
static int unix_##name##_timeout args \
{ \
iol_socket *iol = (iol_socket *)viol; \
fd_set fdset; \
struct timeval tv; \
int rv; \
\
FD_ZERO(&fdset); \
FD_SET(iol->fd, &fdset); \
tv.tv_sec = iol->timeout; \
tv.tv_usec = 0; \
do { \
rv = select(iol->fd + 1, selread, selwrite, NULL, iol->timeout < 0
? NULL : &tv); \
} while (rv == -1 && errno == EINTR); \
if (!FD_ISSET(iol->fd, &fdset)) { \
errno = ETIMEDOUT; \
return -1; \
} \
do { \
rv = syscall(iol->fd, arg1, arg2); \
} while (rv == -1 && errno == EINTR); \
return rv; \
} \
\
static int unix_##name args \
{ \
iol_socket *iol = (iol_socket *)viol; \
int rv; \
\
if (!(iol->flags & FD_NONBLOCKING_SET)) { \
if (iol->timeout < 0) { \
return syscall(iol->fd, arg1, arg2); \
} \
/* must shift descriptor to blocking mode now */ \
if (set_nonblock(iol->fd)) { \
return -1; \
} \
iol->flags |= FD_NONBLOCKING_SET; \
} \
\
/* try writing, ignoring EINTR, the upper layer has to handle \
partial read/writes anyhow, so we can return early */ \
do { \
rv = syscall(iol->fd, arg1, arg2); \
} while (rv == -1 && errno == EINTR); \
if (rv >= 0) { \
return rv; \
} \
if (errno == EWOULDBLOCK && iol->timeout != 0) { \
return unix_##name##_timeout(viol, arg1, arg2); \
} \
return -1; \
} \
method(write, (ap_iol *viol, const char *arg1, int arg2), write, NULL, &fdset)
method(writev, (ap_iol *viol, const struct iovec *arg1, int arg2), writev,
NULL, &fdset)
method(read, (ap_iol *viol, char *arg1, int arg2), read, &fdset, NULL)
method(readv, (ap_iol *viol, struct iovec *arg1, int arg2), readv, &fdset,
NULL)
static int unix_close(ap_iol *viol)
{
iol_socket *iol = (iol_socket *)viol;
int rv;
int saved_errno;
rv = close(iol->fd);
saved_errno = errno;
free(iol);
errno = saved_errno;
return rv;
}
static const ap_iol_methods socket_methods = {
unix_close,
unix_write,
unix_writev,
unix_read,
unix_readv,
unix_setopt,
unix_getopt
};
ap_iol *unix_attach_socket(int fd)
{
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;
return (ap_iol *)iol;
}
1.1 apache-2.0/mpm/src/os/unix/iol_socket.h
Index: iol_socket.h
===================================================================
/* ====================================================================
* Copyright (c) 1998-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
* [EMAIL PROTECTED]
*
* 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 and was originally based
* on public domain software written at the National Center for
* Supercomputing Applications, University of Illinois, Urbana-Champaign.
* For more information on the Apache Group and the Apache HTTP server
* project, please see <http://www.apache.org/>.
*
*/
#ifndef OS_UNIX_IOL_SOCKET_H
#define OS_UNIX_IOL_SOCKET_H
ap_iol *unix_attach_socket(int fd);
#endif