diff options
author | trawick <trawick@13f79535-47bb-0310-9956-ffa450edef68> | 2003-07-08 12:53:12 +0000 |
---|---|---|
committer | trawick <trawick@13f79535-47bb-0310-9956-ffa450edef68> | 2003-07-08 12:53:12 +0000 |
commit | 7dcd99e6721a196527b774f8228e82b7704106c3 (patch) | |
tree | 3c73e1038524e73da12ef74ae00ca74b7a10c5ff | |
parent | 88ccc0d6aa07073f7a091209b145232619f97184 (diff) | |
download | libapr-7dcd99e6721a196527b774f8228e82b7704106c3.tar.gz |
apr_socket_data_set(): allow the same key to be used for
multiple sockets in the same pool.
git-svn-id: http://svn.apache.org/repos/asf/apr/apr/trunk@64565 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | CHANGES | 4 | ||||
-rw-r--r-- | include/arch/os2/apr_arch_networkio.h | 8 | ||||
-rw-r--r-- | include/arch/unix/apr_arch_networkio.h | 8 | ||||
-rw-r--r-- | include/arch/win32/apr_arch_networkio.h | 8 | ||||
-rw-r--r-- | network_io/os2/sockets.c | 32 | ||||
-rw-r--r-- | network_io/unix/sockets.c | 30 | ||||
-rw-r--r-- | network_io/win32/sockets.c | 32 | ||||
-rw-r--r-- | test/testsockets.c | 28 |
8 files changed, 139 insertions, 11 deletions
@@ -1,4 +1,8 @@ Changes with APR 0.9.4 + + *) apr_socket_data_set(): allow the same key to be used for + multiple sockets in the same pool. [Jeff Trawick] + *) Add new table function apr_table_compress() and replace red-black trees with mergesort in apr_table_overlap() [Joe Schaefer <joe+gmane@sunstarsys.com>, Brian Pane] diff --git a/include/arch/os2/apr_arch_networkio.h b/include/arch/os2/apr_arch_networkio.h index bd2900dc6..efd392a06 100644 --- a/include/arch/os2/apr_arch_networkio.h +++ b/include/arch/os2/apr_arch_networkio.h @@ -63,6 +63,13 @@ #include <netdb.h> #endif +typedef struct sock_userdata_t sock_userdata_t; +struct sock_userdata_t { + sock_userdata_t *next; + const char *key; + void *data; +}; + struct apr_socket_t { apr_pool_t *cntxt; int socketdes; @@ -77,6 +84,7 @@ struct apr_socket_t { int remote_addr_unknown; apr_int32_t netmask; apr_int32_t inherit; + sock_userdata_t *userdata; }; /* Error codes returned from sock_errno() */ diff --git a/include/arch/unix/apr_arch_networkio.h b/include/arch/unix/apr_arch_networkio.h index 9e95b9fd1..8250324a0 100644 --- a/include/arch/unix/apr_arch_networkio.h +++ b/include/arch/unix/apr_arch_networkio.h @@ -122,6 +122,13 @@ #define POLLNVAL 32 #endif +typedef struct sock_userdata_t sock_userdata_t; +struct sock_userdata_t { + sock_userdata_t *next; + const char *key; + void *data; +}; + struct apr_socket_t { apr_pool_t *cntxt; int socketdes; @@ -138,6 +145,7 @@ struct apr_socket_t { int remote_addr_unknown; apr_int32_t netmask; apr_int32_t inherit; + sock_userdata_t *userdata; }; const char *apr_inet_ntop(int af, const void *src, char *dst, apr_size_t size); diff --git a/include/arch/win32/apr_arch_networkio.h b/include/arch/win32/apr_arch_networkio.h index db7fb5b3d..8fe7e808b 100644 --- a/include/arch/win32/apr_arch_networkio.h +++ b/include/arch/win32/apr_arch_networkio.h @@ -58,6 +58,13 @@ #include "apr_network_io.h" #include "apr_general.h" +typedef struct sock_userdata_t sock_userdata_t; +struct sock_userdata_t { + sock_userdata_t *next; + const char *key; + void *data; +}; + struct apr_socket_t { apr_pool_t *cntxt; SOCKET socketdes; @@ -73,6 +80,7 @@ struct apr_socket_t { int remote_addr_unknown; apr_int32_t netmask; apr_int32_t inherit; + sock_userdata_t *userdata; }; #ifdef _WIN32_WCE diff --git a/network_io/os2/sockets.c b/network_io/os2/sockets.c index cd3b084f5..68061cd8d 100644 --- a/network_io/os2/sockets.c +++ b/network_io/os2/sockets.c @@ -58,6 +58,7 @@ #include "apr_general.h" #include "apr_portable.h" #include "apr_lib.h" +#include "apr_strings.h" #include <errno.h> #include <string.h> #include <sys/socket.h> @@ -241,17 +242,40 @@ APR_DECLARE(apr_status_t) apr_socket_connect(apr_socket_t *sock, APR_DECLARE(apr_status_t) apr_socket_data_get(void **data, const char *key, - apr_socket_t *socket) + apr_socket_t *sock) { - return apr_pool_userdata_get(data, key, socket->cntxt); + sock_userdata_t *cur = sock->userdata; + + *data = NULL; + + while (cur) { + if (!strcmp(cur->key, key)) { + *data = cur->data; + break; + } + cur = cur->next; + } + + return APR_SUCCESS; } -APR_DECLARE(apr_status_t) apr_socket_data_set(apr_socket_t *socket, void *data, const char *key, +APR_DECLARE(apr_status_t) apr_socket_data_set(apr_socket_t *sock, void *data, const char *key, apr_status_t (*cleanup) (void *)) { - return apr_pool_userdata_set(data, key, cleanup, socket->cntxt); + sock_userdata_t *new = apr_palloc(sock->cntxt, sizeof(sock_userdata_t)); + + new->key = apr_pstrdup(sock->cntxt, key); + new->data = data; + new->next = sock->userdata; + sock->userdata = new; + + if (cleanup) { + apr_pool_cleanup_register(sock->cntxt, data, cleanup, cleanup); + } + + return APR_SUCCESS; } APR_DECLARE(apr_status_t) apr_os_sock_get(apr_os_sock_t *thesock, apr_socket_t *sock) diff --git a/network_io/unix/sockets.c b/network_io/unix/sockets.c index e1d5c7e80..758be8a38 100644 --- a/network_io/unix/sockets.c +++ b/network_io/unix/sockets.c @@ -54,6 +54,7 @@ #include "apr_arch_networkio.h" #include "apr_network_io.h" +#include "apr_strings.h" #include "apr_support.h" #include "apr_portable.h" #include "apr_arch_inherit.h" @@ -318,13 +319,36 @@ apr_status_t apr_socket_connect(apr_socket_t *sock, apr_sockaddr_t *sa) apr_status_t apr_socket_data_get(void **data, const char *key, apr_socket_t *sock) { - return apr_pool_userdata_get(data, key, sock->cntxt); + sock_userdata_t *cur = sock->userdata; + + *data = NULL; + + while (cur) { + if (!strcmp(cur->key, key)) { + *data = cur->data; + break; + } + cur = cur->next; + } + + return APR_SUCCESS; } apr_status_t apr_socket_data_set(apr_socket_t *sock, void *data, const char *key, - apr_status_t (*cleanup) (void *)) + apr_status_t (*cleanup) (void *)) { - return apr_pool_userdata_set(data, key, cleanup, sock->cntxt); + sock_userdata_t *new = apr_palloc(sock->cntxt, sizeof(sock_userdata_t)); + + new->key = apr_pstrdup(sock->cntxt, key); + new->data = data; + new->next = sock->userdata; + sock->userdata = new; + + if (cleanup) { + apr_pool_cleanup_register(sock->cntxt, data, cleanup, cleanup); + } + + return APR_SUCCESS; } apr_status_t apr_os_sock_get(apr_os_sock_t *thesock, apr_socket_t *sock) diff --git a/network_io/win32/sockets.c b/network_io/win32/sockets.c index 10f648118..590e5758a 100644 --- a/network_io/win32/sockets.c +++ b/network_io/win32/sockets.c @@ -57,6 +57,7 @@ #include "apr_general.h" #include "apr_lib.h" #include "apr_portable.h" +#include "apr_strings.h" #include <string.h> #include "apr_arch_inherit.h" #include "apr_arch_misc.h" @@ -403,16 +404,39 @@ APR_DECLARE(apr_status_t) apr_socket_connect(apr_socket_t *sock, } APR_DECLARE(apr_status_t) apr_socket_data_get(void **data, const char *key, - apr_socket_t *socket) + apr_socket_t *sock) { - return apr_pool_userdata_get(data, key, socket->cntxt); + sock_userdata_t *cur = sock->userdata; + + *data = NULL; + + while (cur) { + if (!strcmp(cur->key, key)) { + *data = cur->data; + break; + } + cur = cur->next; + } + + return APR_SUCCESS; } -APR_DECLARE(apr_status_t) apr_socket_data_set(apr_socket_t *socket, void *data, +APR_DECLARE(apr_status_t) apr_socket_data_set(apr_socket_t *sock, void *data, const char *key, apr_status_t (*cleanup)(void *)) { - return apr_pool_userdata_set(data, key, cleanup, socket->cntxt); + sock_userdata_t *new = apr_palloc(sock->cntxt, sizeof(sock_userdata_t)); + + new->key = apr_pstrdup(sock->cntxt, key); + new->data = data; + new->next = sock->userdata; + sock->userdata = new; + + if (cleanup) { + apr_pool_cleanup_register(sock->cntxt, data, cleanup, cleanup); + } + + return APR_SUCCESS; } APR_DECLARE(apr_status_t) apr_os_sock_get(apr_os_sock_t *thesock, diff --git a/test/testsockets.c b/test/testsockets.c index 2afa0ace7..860ef5964 100644 --- a/test/testsockets.c +++ b/test/testsockets.c @@ -168,6 +168,31 @@ static void sendto_receivefrom(CuTest *tc) apr_socket_close(sock2); } +static void socket_userdata(CuTest *tc) +{ + apr_socket_t *sock1, *sock2; + apr_status_t rv; + char *data; + const char *key = "GENERICKEY"; + + rv = apr_socket_create(&sock1, AF_INET, SOCK_STREAM, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + rv = apr_socket_create(&sock2, AF_INET, SOCK_STREAM, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_socket_data_set(sock1, "SOCK1", key, NULL); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + rv = apr_socket_data_set(sock2, "SOCK2", key, NULL); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_socket_data_get((void **)&data, key, sock1); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertStrEquals(tc, "SOCK1", data); + rv = apr_socket_data_get((void **)&data, key, sock2); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertStrEquals(tc, "SOCK2", data); +} + CuSuite *testsockets(void) { CuSuite *suite = CuSuiteNew("Socket Creation"); @@ -179,6 +204,9 @@ CuSuite *testsockets(void) SUITE_ADD_TEST(suite, udp6_socket); SUITE_ADD_TEST(suite, sendto_receivefrom); + + SUITE_ADD_TEST(suite, socket_userdata); + return suite; } |