summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortrawick <trawick@13f79535-47bb-0310-9956-ffa450edef68>2000-12-04 16:09:32 +0000
committertrawick <trawick@13f79535-47bb-0310-9956-ffa450edef68>2000-12-04 16:09:32 +0000
commit24b7fb3c6faedc7f29fa8918b9367beb22d97d04 (patch)
tree088e76c340df7b9ecabfb1da6e17f0b3a8bb2d84
parent12f52fad970cb049a16a18364b97597074c11a26 (diff)
downloadlibapr-24b7fb3c6faedc7f29fa8918b9367beb22d97d04.tar.gz
Add apr_make_os_sock() for constructing a fully-capable APR
socket. The BeOS sockets.c doesn't look up-to-date and I think David is(has) switching(switched) to using the Unix sockets.c. Thus, I have not messed with it. git-svn-id: http://svn.apache.org/repos/asf/apr/apr/trunk@60882 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--CHANGES3
-rw-r--r--aprlib.def1
-rw-r--r--include/apr_portable.h28
-rw-r--r--libapr.def1
-rw-r--r--network_io/os2/sockets.c26
-rw-r--r--network_io/unix/sockets.c31
-rw-r--r--network_io/win32/sockets.c29
7 files changed, 119 insertions, 0 deletions
diff --git a/CHANGES b/CHANGES
index 74121bd24..8cae6c51e 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,4 +1,7 @@
Changes with APR a9
+ *) Add apr_make_os_sock() for constructing a fully-capable APR
+ socket. [Jeff Trawick]
+
*) Make APR's shared memory routines always allocate enough memory
for the requested segment, the MM internal types, and the APR
internal types.
diff --git a/aprlib.def b/aprlib.def
index 485597e3e..8c0c2b539 100644
--- a/aprlib.def
+++ b/aprlib.def
@@ -75,6 +75,7 @@ EXPORTS
apr_set_socketdata
apr_get_polldata
apr_set_polldata
+ apr_make_os_sock
apr_put_os_sock
apr_get_os_sock
apr_remove_poll_socket
diff --git a/include/apr_portable.h b/include/apr_portable.h
index 6faf91447..ffa1246f9 100644
--- a/include/apr_portable.h
+++ b/include/apr_portable.h
@@ -185,6 +185,20 @@ typedef struct tm apr_os_exp_time_t;
#endif
/**
+ * everything APR needs to know about an active socket to construct
+ * an APR socket from it; currently, this is platform-independent
+ */
+struct apr_os_sock_info_t {
+ apr_os_sock_t *os_sock; /* always required */
+ struct sockaddr *local; /* NULL if not yet bound */
+ struct sockaddr *remote; /* NULL if not connected */
+ int family; /* always required (APR_INET, APR_INET6, etc. */
+ int type; /* always required (SOCK_STREAM, SOCK_DGRAM, etc. */
+};
+
+typedef struct apr_os_sock_info_t apr_os_sock_info_t;
+
+/**
* convert the file from apr type to os specific type.
* @param thefile The os specific file we are converting to
* @param file The apr file to convert.
@@ -275,6 +289,20 @@ apr_status_t apr_put_os_sock(apr_socket_t **sock, apr_os_sock_t *thesock,
apr_pool_t *cont);
/**
+ * Create a socket from an existing descriptor and local and remote
+ * socket addresses.
+ * @param apr_sock The new socket that has been set up
+ * @param os_sock_info The os representation of the socket handle and
+ * other characteristics of the socket
+ * @param cont The pool to use
+ * @tip If you only know the descriptor/handle or if it isn't really
+ * a true socket, use apr_put_os_sock() instead.
+ */
+apr_status_t apr_make_os_sock(apr_socket_t **apr_sock,
+ apr_os_sock_info_t *os_sock_info,
+ apr_pool_t *cont);
+
+/**
* Convert the lock from os specific type to apr type
* @param lock The apr lock we are converting to.
* @param thelock The os specific lock to convert.
diff --git a/libapr.def b/libapr.def
index 485597e3e..8c0c2b539 100644
--- a/libapr.def
+++ b/libapr.def
@@ -75,6 +75,7 @@ EXPORTS
apr_set_socketdata
apr_get_polldata
apr_set_polldata
+ apr_make_os_sock
apr_put_os_sock
apr_get_os_sock
apr_remove_poll_socket
diff --git a/network_io/os2/sockets.c b/network_io/os2/sockets.c
index 4c5071742..f8f782ef4 100644
--- a/network_io/os2/sockets.c
+++ b/network_io/os2/sockets.c
@@ -263,7 +263,33 @@ apr_status_t apr_get_os_sock(apr_os_sock_t *thesock, apr_socket_t *sock)
return APR_SUCCESS;
}
+apr_status_t apr_make_os_sock(apr_socket_t **apr_sock,
+ apr_os_sock_info_t *os_sock_info,
+ apr_pool_t *cont)
+{
+ alloc_socket(apr_sock, cont);
+ set_socket_vars(*apr_sock, os_sock_info->family);
+ (*apr_sock)->timeout = -1;
+ (*apr_sock)->socketdes = *os_sock_info->os_sock;
+ if (os_sock_info->local) {
+ memcpy(&(*apr_sock)->local_addr->sa.sin,
+ os_sock_info->local,
+ (*apr_sock)->local_addr->salen);
+ }
+ else {
+ (*apr_sock)->local_port_unknown = (*apr_sock)->local_interface_unknown = 1;
+ }
+ if (os_sock_info->remote) {
+ memcpy(&(*apr_sock)->remote_addr->sa.sin,
+ os_sock_info->remote,
+ (*apr_sock)->remote_addr->salen);
+ }
+
+ apr_register_cleanup((*apr_sock)->cntxt, (void *)(*apr_sock),
+ socket_cleanup, apr_null_cleanup);
+ return APR_SUCCESS;
+}
apr_status_t apr_put_os_sock(apr_socket_t **sock, apr_os_sock_t *thesock, apr_pool_t *cont)
{
diff --git a/network_io/unix/sockets.c b/network_io/unix/sockets.c
index 3e055e62e..9f4cd6b20 100644
--- a/network_io/unix/sockets.c
+++ b/network_io/unix/sockets.c
@@ -282,6 +282,37 @@ apr_status_t apr_get_os_sock(apr_os_sock_t *thesock, apr_socket_t *sock)
return APR_SUCCESS;
}
+apr_status_t apr_make_os_sock(apr_socket_t **apr_sock,
+ apr_os_sock_info_t *os_sock_info,
+ apr_pool_t *cont)
+{
+ alloc_socket(apr_sock, cont);
+ set_socket_vars(*apr_sock, os_sock_info->family);
+ (*apr_sock)->timeout = -1;
+ (*apr_sock)->socketdes = *os_sock_info->os_sock;
+ if (os_sock_info->local) {
+ memcpy(&(*apr_sock)->local_addr->sa.sin,
+ os_sock_info->local,
+ (*apr_sock)->local_addr->salen);
+ }
+ else {
+ (*apr_sock)->local_port_unknown = (*apr_sock)->local_interface_unknown = 1;
+ }
+ if (os_sock_info->remote) {
+#ifndef HAVE_POLL
+ (*apr_sock)->connected = 1;
+#endif
+ memcpy(&(*apr_sock)->remote_addr->sa.sin,
+ os_sock_info->remote,
+ (*apr_sock)->remote_addr->salen);
+ }
+
+ apr_register_cleanup((*apr_sock)->cntxt, (void *)(*apr_sock),
+ socket_cleanup, apr_null_cleanup);
+
+ return APR_SUCCESS;
+}
+
apr_status_t apr_put_os_sock(apr_socket_t **sock, apr_os_sock_t *thesock,
apr_pool_t *cont)
{
diff --git a/network_io/win32/sockets.c b/network_io/win32/sockets.c
index 13df55c11..0aed50f27 100644
--- a/network_io/win32/sockets.c
+++ b/network_io/win32/sockets.c
@@ -305,6 +305,35 @@ apr_status_t apr_get_os_sock(apr_os_sock_t *thesock, apr_socket_t *sock)
return APR_SUCCESS;
}
+apr_status_t apr_make_os_sock(apr_socket_t **apr_sock,
+ apr_os_sock_info_t *os_sock_info,
+ apr_pool_t *cont)
+{
+ alloc_socket(apr_sock, cont);
+ set_socket_vars(*apr_sock, os_sock_info->family);
+ (*apr_sock)->timeout = -1;
+ (*apr_sock)->disconnected = 0;
+ (*apr_sock)->sock = *os_sock_info->os_sock;
+ if (os_sock_info->local) {
+ memcpy(&(*apr_sock)->local_addr->sa.sin,
+ os_sock_info->local,
+ (*apr_sock)->local_addr->salen);
+ }
+ else {
+ (*apr_sock)->local_port_unknown = (*apr_sock)->local_interface_unknown = 1;
+ }
+ if (os_sock_info->remote) {
+ memcpy(&(*apr_sock)->remote_addr->sa.sin,
+ os_sock_info->remote,
+ (*apr_sock)->remote_addr->salen);
+ }
+
+ apr_register_cleanup((*apr_sock)->cntxt, (void *)(*apr_sock),
+ socket_cleanup, apr_null_cleanup);
+
+ return APR_SUCCESS;
+}
+
apr_status_t apr_put_os_sock(apr_socket_t **sock, apr_os_sock_t *thesock,
apr_pool_t *cont)
{