diff options
author | Jeff Trawick <trawick@apache.org> | 2003-07-08 12:53:12 +0000 |
---|---|---|
committer | Jeff Trawick <trawick@apache.org> | 2003-07-08 12:53:12 +0000 |
commit | b4bdddea3234cb92c023d380ce84b126e4b9e420 (patch) | |
tree | 3c73e1038524e73da12ef74ae00ca74b7a10c5ff /network_io/os2 | |
parent | 55323c8721af5ced5ba82eb4442b30bafdcd6430 (diff) | |
download | apr-b4bdddea3234cb92c023d380ce84b126e4b9e420.tar.gz |
apr_socket_data_set(): allow the same key to be used for
multiple sockets in the same pool.
git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@64565 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'network_io/os2')
-rw-r--r-- | network_io/os2/sockets.c | 32 |
1 files changed, 28 insertions, 4 deletions
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) |