diff options
author | stoddard <stoddard@13f79535-47bb-0310-9956-ffa450edef68> | 2000-06-14 20:55:59 +0000 |
---|---|---|
committer | stoddard <stoddard@13f79535-47bb-0310-9956-ffa450edef68> | 2000-06-14 20:55:59 +0000 |
commit | 1aec41aed99f7f62ab6b486c2838d97ac77aaa42 (patch) | |
tree | 86b5a70840057adfb13c8e8f200bc73459176bad | |
parent | 0551aaf60513a7bda0476650a46c657ce1b3bca8 (diff) | |
download | libapr-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.def | 2 | ||||
-rw-r--r-- | include/apr_network_io.h | 26 | ||||
-rw-r--r-- | libapr.def | 2 | ||||
-rw-r--r-- | network_io/win32/sendrecv.c | 1 | ||||
-rw-r--r-- | network_io/win32/sockopt.c | 61 |
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) |