summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorstoddard <stoddard@13f79535-47bb-0310-9956-ffa450edef68>2000-06-14 20:55:59 +0000
committerstoddard <stoddard@13f79535-47bb-0310-9956-ffa450edef68>2000-06-14 20:55:59 +0000
commit1aec41aed99f7f62ab6b486c2838d97ac77aaa42 (patch)
tree86b5a70840057adfb13c8e8f200bc73459176bad
parent0551aaf60513a7bda0476650a46c657ce1b3bca8 (diff)
downloadlibapr-1aec41aed99f7f62ab6b486c2838d97ac77aaa42.tar.gz
Win32: Cleanup ap_setsockopt(). First cut at implementing ap_getsockopt() and iol_getopt().
Do we need to move iol into APR? git-svn-id: http://svn.apache.org/repos/asf/apr/apr/trunk@60204 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--aprlib.def2
-rw-r--r--include/apr_network_io.h26
-rw-r--r--libapr.def2
-rw-r--r--network_io/win32/sendrecv.c1
-rw-r--r--network_io/win32/sockopt.c61
5 files changed, 73 insertions, 19 deletions
diff --git a/aprlib.def b/aprlib.def
index 0cb5bc1ce..869b01f3a 100644
--- a/aprlib.def
+++ b/aprlib.def
@@ -79,7 +79,7 @@ EXPORTS
ap_get_os_sock @70
ap_remove_poll_socket @71
ap_clear_poll_sockets @72
-; ap_setipaddr @73
+ ap_getsocketopt @73
; ap_getipaddr @74
; ap_create_signal @75
; ap_setup_signal @76
diff --git a/include/apr_network_io.h b/include/apr_network_io.h
index 7bfe8302f..2de4247c9 100644
--- a/include/apr_network_io.h
+++ b/include/apr_network_io.h
@@ -422,6 +422,32 @@ ap_status_t ap_setsocketopt(ap_socket_t *sock, ap_int32_t opt, ap_int32_t on);
/*
+=head1 ap_status_t ap_getsocketopt(ap_socket_t *sock, ap_int32_t opt, ap_int32_t* on)
+
+B<Query socket options for the specified socket>
+
+ arg 1) The socket to query
+ arg 2) The option we would like to query. One of:
+ APR_SO_DEBUG -- turn on debugging information
+ APR_SO_KEEPALIVE -- keep connections active
+ APR_SO_LINGER -- lingers on close if data is present
+ APR_SO_NONBLOCK -- Turns blocking on/off for socket
+ APR_SO_REUSEADDR -- The rules used in validating addresses
+ supplied to bind should allow reuse
+ of local addresses.
+ APR_SO_TIMEOUT -- Set the timeout value in microseconds.
+ values < 0 mean wait forever. 0 means
+ don't wait at all.
+ APR_SO_SNDBUF -- Set the SendBufferSize
+ APR_SO_RCVBUF -- Set the ReceiveBufferSize
+ arg 3) Socket option returned on the call.
+
+=cut
+ */
+ap_status_t ap_getsocketopt(ap_socket_t *sock, ap_int32_t opt, ap_int32_t* on);
+
+/*
+
=head1 ap_status_t ap_set_local_port(ap_socket_t *sock, ap_uint32_t port)
Assocaite a local port with a socket.
diff --git a/libapr.def b/libapr.def
index 0cb5bc1ce..869b01f3a 100644
--- a/libapr.def
+++ b/libapr.def
@@ -79,7 +79,7 @@ EXPORTS
ap_get_os_sock @70
ap_remove_poll_socket @71
ap_clear_poll_sockets @72
-; ap_setipaddr @73
+ ap_getsocketopt @73
; ap_getipaddr @74
; ap_create_signal @75
; ap_setup_signal @76
diff --git a/network_io/win32/sendrecv.c b/network_io/win32/sendrecv.c
index aca381553..06230bf24 100644
--- a/network_io/win32/sendrecv.c
+++ b/network_io/win32/sendrecv.c
@@ -100,6 +100,7 @@ ap_status_t ap_recv(ap_socket_t *sock, char *buf, ap_ssize_t *len)
*len = dwBytes;
return APR_SUCCESS;
+
}
ap_status_t ap_sendv(ap_socket_t *sock, const struct iovec *vec,
diff --git a/network_io/win32/sockopt.c b/network_io/win32/sockopt.c
index 047f8940f..afe2b6c11 100644
--- a/network_io/win32/sockopt.c
+++ b/network_io/win32/sockopt.c
@@ -81,23 +81,21 @@ ap_status_t sononblock(SOCKET sd)
ap_status_t ap_setsocketopt(ap_socket_t *sock, ap_int32_t opt, ap_int32_t on)
{
int one;
- struct linger li;
ap_status_t stat;
- if (on)
- one = 1;
- else
- one = 0;
+ one = on ? 1 : 0;
- if (opt & APR_SO_TIMEOUT) {
+ switch (opt) {
+ case APR_SO_TIMEOUT:
+ {
int new_timeout;
if (on <= 0)
new_timeout = on;
else
new_timeout = on/1000; /* Windows needs timeout in mSeconds */
-
+
if (new_timeout == 0) {
- /* Set the socket non-blocking if it isn't already set to non-blocking */
+ /* Set the socket non-blocking if it was previously blocking */
if (sock->timeout != 0) {
if ((stat = sononblock(sock->sock)) != APR_SUCCESS)
return stat;
@@ -124,23 +122,24 @@ ap_status_t ap_setsocketopt(ap_socket_t *sock, ap_int32_t opt, ap_int32_t on)
setsockopt(sock->sock, SOL_SOCKET, SO_SNDTIMEO, (char *) &zero, sizeof(zero));
}
sock->timeout = new_timeout;
+ break;
}
- if (opt & APR_SO_KEEPALIVE) {
+ case APR_SO_KEEPALIVE:
if (setsockopt(sock->sock, SOL_SOCKET, SO_KEEPALIVE, (void *)&one, sizeof(int)) == -1) {
return WSAGetLastError();
}
- }
- if (opt & APR_SO_DEBUG) {
+ break;
+ case APR_SO_DEBUG:
if (setsockopt(sock->sock, SOL_SOCKET, SO_DEBUG, (void *)&one, sizeof(int)) == -1) {
return WSAGetLastError();
}
- }
- if (opt & APR_SO_REUSEADDR) {
+ break;
+ case APR_SO_REUSEADDR:
if (setsockopt(sock->sock, SOL_SOCKET, SO_REUSEADDR, (void *)&one, sizeof(int)) == -1) {
return WSAGetLastError();
}
- }
- if (opt & APR_SO_NONBLOCK) {
+ break;
+ case APR_SO_NONBLOCK:
if (on) {
if ((stat = soblock(sock->sock)) != APR_SUCCESS)
return stat;
@@ -149,17 +148,45 @@ ap_status_t ap_setsocketopt(ap_socket_t *sock, ap_int32_t opt, ap_int32_t on)
if ((stat = sononblock(sock->sock)) != APR_SUCCESS)
return stat;
}
- }
- if (opt & APR_SO_LINGER) {
+ break;
+ case APR_SO_LINGER:
+ {
+ struct linger li;
li.l_onoff = on;
li.l_linger = MAX_SECS_TO_LINGER;
if (setsockopt(sock->sock, SOL_SOCKET, SO_LINGER, (char *) &li, sizeof(struct linger)) == -1) {
return WSAGetLastError();
}
+ break;
+ }
+ default:
+ return APR_EINVAL;
+ break;
}
return APR_SUCCESS;
}
+ap_status_t ap_getsocketopt(ap_socket_t *sock, ap_int32_t opt, ap_int32_t *on)
+{
+ switch (opt) {
+ case APR_SO_TIMEOUT:
+ /* Do we want to store sock->timeout in APR units or windows units? */
+ *on = sock->timeout * 1000; /* Convert from milliseconds (windows units) to microseconds
+ * (APR units) */
+ break;
+ case APR_SO_KEEPALIVE:
+ case APR_SO_DEBUG:
+ case APR_SO_REUSEADDR:
+ case APR_SO_NONBLOCK:
+ case APR_SO_LINGER:
+ default:
+ return APR_ENOTIMPL;
+ break;
+ }
+ return APR_SUCCESS;
+}
+
+
ap_status_t ap_gethostname(char *buf, int len, ap_pool_t *cont)
{
if (gethostname(buf, len) == -1)