summaryrefslogtreecommitdiff
path: root/misc
diff options
context:
space:
mode:
authorbnicholes <bnicholes@13f79535-47bb-0310-9956-ffa450edef68>2004-07-06 23:32:54 +0000
committerbnicholes <bnicholes@13f79535-47bb-0310-9956-ffa450edef68>2004-07-06 23:32:54 +0000
commit73f22670a22473aa7fe96edf53f8e5634ff58704 (patch)
tree40d84b1ed08a26599793dac14026061b95a7cbfc /misc
parent3e53c4b52942a420278e74e26b5b7a0ca458a159 (diff)
downloadlibapr-73f22670a22473aa7fe96edf53f8e5634ff58704.tar.gz
Make sure that Winsock is started up properly for all NLMs that link to aprlib.nlm
git-svn-id: http://svn.apache.org/repos/asf/apr/apr/branches/APR_0_9_BRANCH@65264 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'misc')
-rw-r--r--misc/netware/libprews.c1
-rw-r--r--misc/netware/start.c109
2 files changed, 95 insertions, 15 deletions
diff --git a/misc/netware/libprews.c b/misc/netware/libprews.c
index 6246e1e4a..01467aab0 100644
--- a/misc/netware/libprews.c
+++ b/misc/netware/libprews.c
@@ -112,6 +112,7 @@ int register_NLM(void *NLMHandle)
if (app_data) {
memset (app_data, 0, sizeof(APP_DATA));
set_app_data(gLibId, app_data);
+ app_data->gs_nlmhandle = NLMHandle;
}
}
diff --git a/misc/netware/start.c b/misc/netware/start.c
index ab0117348..8b6976927 100644
--- a/misc/netware/start.c
+++ b/misc/netware/start.c
@@ -22,6 +22,86 @@
#include "apr_arch_proc_mutex.h" /* for apr_proc_mutex_unix_setup_lock() */
#include "apr_arch_internal_time.h"
+/*
+** Resource tag signatures for using NetWare WinSock 2. These will no longer
+** be needed by anyone once the new WSAStartupWithNlmHandle() is available
+** since WinSock will make the calls to AllocateResourceTag().
+*/
+#define WS_LOAD_ENTRY_SIGNATURE (*(unsigned long *) "WLDE")
+#define WS_SKT_SIGNATURE (*(unsigned long *) "WSKT")
+#define WS_LOOKUP_SERVICE_SIGNATURE (*(unsigned long *) "WLUP")
+#define WS_WSAEVENT_SIGNATURE (*(unsigned long *) "WEVT")
+#define WS_CPORT_SIGNATURE (*(unsigned long *) "WCPT")
+
+
+int (*WSAStartupWithNLMHandle)( WORD version, LPWSADATA data, void *handle ) = NULL;
+int (*WSACleanupWithNLMHandle)( void *handle ) = NULL;
+
+static int wsa_startup_with_handle (WORD wVersionRequested, LPWSADATA data, void *handle)
+{
+ APP_DATA *app_data;
+
+ if (!(app_data = (APP_DATA*) get_app_data(gLibId)))
+ return APR_EGENERAL;
+
+ app_data->gs_startup_rtag = AllocateResourceTag(handle, "WinSock Start-up", WS_LOAD_ENTRY_SIGNATURE);
+ app_data->gs_socket_rtag = AllocateResourceTag(handle, "WinSock socket()", WS_SKT_SIGNATURE);
+ app_data->gs_lookup_rtag = AllocateResourceTag(handle, "WinSock Look-up", WS_LOOKUP_SERVICE_SIGNATURE);
+ app_data->gs_event_rtag = AllocateResourceTag(handle, "WinSock Event", WS_WSAEVENT_SIGNATURE);
+ app_data->gs_pcp_rtag = AllocateResourceTag(handle, "WinSock C-Port", WS_CPORT_SIGNATURE);
+
+ return WSAStartupRTags(wVersionRequested, data,
+ app_data->gs_startup_rtag,
+ app_data->gs_socket_rtag,
+ app_data->gs_lookup_rtag,
+ app_data->gs_event_rtag,
+ app_data->gs_pcp_rtag);
+}
+
+static int wsa_cleanup_with_handle (void *handle)
+{
+ APP_DATA *app_data;
+
+ if (!(app_data = (APP_DATA*) get_app_data(gLibId)))
+ return APR_EGENERAL;
+
+ return WSACleanupRTag(app_data->gs_startup_rtag);
+}
+
+static int UnregisterAppWithWinSock (void *nlm_handle)
+{
+ if (!WSACleanupWithNLMHandle)
+ {
+ if (!(WSACleanupWithNLMHandle = ImportPublicObject(gLibHandle, "WSACleanupWithNLMHandle")))
+ WSACleanupWithNLMHandle = wsa_cleanup_with_handle;
+ }
+
+ return (*WSACleanupWithNLMHandle)(nlm_handle);
+}
+
+static int RegisterAppWithWinSock (void *nlm_handle)
+{
+ int err;
+ WSADATA wsaData;
+ WORD wVersionRequested = MAKEWORD(WSAHighByte, WSALowByte);
+
+ if (!WSAStartupWithNLMHandle)
+ {
+ if (!(WSAStartupWithNLMHandle = ImportPublicObject(gLibHandle, "WSAStartupWithNLMHandle")))
+ WSAStartupWithNLMHandle = wsa_startup_with_handle;
+ }
+
+ err = (*WSAStartupWithNLMHandle)(wVersionRequested, &wsaData, nlm_handle);
+
+ if (LOBYTE(wsaData.wVersion) != WSAHighByte ||
+ HIBYTE(wsaData.wVersion) != WSALowByte) {
+
+ UnregisterAppWithWinSock (nlm_handle);
+ return APR_EEXIST;
+ }
+
+ return err;
+}
APR_DECLARE(apr_status_t) apr_app_initialize(int *argc,
const char * const * *argv,
@@ -38,14 +118,12 @@ APR_DECLARE(apr_status_t) apr_app_initialize(int *argc,
APR_DECLARE(apr_status_t) apr_initialize(void)
{
apr_pool_t *pool;
- apr_status_t status;
- int iVersionRequested;
- WSADATA wsaData;
int err;
+ void *nlmhandle = getnlmhandle();
/* Register the NLM as using APR. If it is already
registered then just return. */
- if (register_NLM(getnlmhandle()) != 0) {
+ if (register_NLM(nlmhandle) != 0) {
return APR_SUCCESS;
}
@@ -59,28 +137,28 @@ APR_DECLARE(apr_status_t) apr_initialize(void)
apr_pool_tag(pool, "apr_initilialize");
- iVersionRequested = MAKEWORD(WSAHighByte, WSALowByte);
- err = WSAStartup((WORD) iVersionRequested, &wsaData);
+ err = RegisterAppWithWinSock (nlmhandle);
+
if (err) {
return err;
}
- if (LOBYTE(wsaData.wVersion) != WSAHighByte ||
- HIBYTE(wsaData.wVersion) != WSALowByte) {
- WSACleanup();
- return APR_EEXIST;
- }
-
+
apr_signal_init(pool);
-// setGlobalPool((void*)pool);
return APR_SUCCESS;
}
APR_DECLARE_NONSTD(void) apr_terminate(void)
{
+ APP_DATA *app_data;
+
+ /* Get our instance data for shutting down. */
+ if (!(app_data = (APP_DATA*) get_app_data(gLibId)))
+ return;
+
/* Unregister the NLM. If it is not registered
then just return. */
- if (unregister_NLM(getnlmhandle()) != 0) {
+ if (unregister_NLM(app_data->gs_nlmhandle) != 0) {
return;
}
@@ -91,7 +169,8 @@ APR_DECLARE_NONSTD(void) apr_terminate(void)
/* Just clean up the memory for the app that is going
away. */
netware_pool_proc_cleanup ();
- WSACleanup();
+
+ UnregisterAppWithWinSock (app_data->gs_nlmhandle);
}
APR_DECLARE(void) apr_terminate2(void)