1/* Licensed to the Apache Software Foundation (ASF) under one or more 2 * contributor license agreements. See the NOTICE file distributed with 3 * this work for additional information regarding copyright ownership. 4 * The ASF licenses this file to You under the Apache License, Version 2.0 5 * (the "License"); you may not use this file except in compliance with 6 * the License. You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16#include <netware.h> 17#include <library.h> 18#include <nks/synch.h> 19 20#include "apr_pools.h" 21#include "apr_private.h" 22#include "apr_arch_internal_time.h" 23 24 25/* library-private data...*/ 26int gLibId = -1; 27void *gLibHandle = (void *) NULL; 28NXMutex_t *gLibLock = (NXMutex_t *) NULL; 29 30/* internal library function prototypes...*/ 31int DisposeLibraryData(void *); 32 33int _NonAppStart 34( 35 void *NLMHandle, 36 void *errorScreen, 37 const char *cmdLine, 38 const char *loadDirPath, 39 size_t uninitializedDataLength, 40 void *NLMFileHandle, 41 int (*readRoutineP)( int conn, void *fileHandle, size_t offset, 42 size_t nbytes, size_t *bytesRead, void *buffer ), 43 size_t customDataOffset, 44 size_t customDataSize, 45 int messageCount, 46 const char **messages 47) 48{ 49#ifdef USE_WINSOCK 50 WSADATA wsaData; 51#endif 52 apr_status_t status; 53 54 NX_LOCK_INFO_ALLOC(liblock, "Per-Application Data Lock", 0); 55 56#pragma unused(cmdLine) 57#pragma unused(loadDirPath) 58#pragma unused(uninitializedDataLength) 59#pragma unused(NLMFileHandle) 60#pragma unused(readRoutineP) 61#pragma unused(customDataOffset) 62#pragma unused(customDataSize) 63#pragma unused(messageCount) 64#pragma unused(messages) 65 66 gLibId = register_library(DisposeLibraryData); 67 68 if (gLibId < -1) 69 { 70 OutputToScreen(errorScreen, "Unable to register library with kernel.\n"); 71 return -1; 72 } 73 74 gLibHandle = NLMHandle; 75 76 gLibLock = NXMutexAlloc(0, 0, &liblock); 77 78 if (!gLibLock) 79 { 80 OutputToScreen(errorScreen, "Unable to allocate library data lock.\n"); 81 return -1; 82 } 83 84 apr_netware_setup_time(); 85 86 if ((status = apr_pool_initialize()) != APR_SUCCESS) 87 return status; 88 89#ifdef USE_WINSOCK 90 return WSAStartup((WORD) MAKEWORD(2, 0), &wsaData); 91#else 92 return 0; 93#endif 94} 95 96void _NonAppStop( void ) 97{ 98 apr_pool_terminate(); 99 100#ifdef USE_WINSOCK 101 WSACleanup(); 102#endif 103 104 unregister_library(gLibId); 105 NXMutexFree(gLibLock); 106} 107 108int _NonAppCheckUnload( void ) 109{ 110 return 0; 111} 112 113int register_NLM(void *NLMHandle) 114{ 115 APP_DATA *app_data = (APP_DATA*) get_app_data(gLibId); 116 117 NXLock(gLibLock); 118 if (!app_data) { 119 app_data = (APP_DATA*)library_malloc(gLibHandle, sizeof(APP_DATA)); 120 121 if (app_data) { 122 memset (app_data, 0, sizeof(APP_DATA)); 123 set_app_data(gLibId, app_data); 124 app_data->gs_nlmhandle = NLMHandle; 125 } 126 } 127 128 if (app_data && (!app_data->initialized)) { 129 app_data->initialized = 1; 130 NXUnlock(gLibLock); 131 return 0; 132 } 133 134 NXUnlock(gLibLock); 135 return 1; 136} 137 138int unregister_NLM(void *NLMHandle) 139{ 140 APP_DATA *app_data = (APP_DATA*) get_app_data(gLibId); 141 142 NXLock(gLibLock); 143 if (app_data) { 144 app_data->initialized = 0; 145 NXUnlock(gLibLock); 146 return 0; 147 } 148 NXUnlock(gLibLock); 149 return 1; 150} 151 152int DisposeLibraryData(void *data) 153{ 154 if (data) 155 { 156 library_free(data); 157 } 158 159 return 0; 160} 161 162int setGlobalPool(void *data) 163{ 164 APP_DATA *app_data = (APP_DATA*) get_app_data(gLibId); 165 166 NXLock(gLibLock); 167 168 if (app_data && !app_data->gPool) { 169 app_data->gPool = data; 170 } 171 172 NXUnlock(gLibLock); 173 return 1; 174} 175 176void* getGlobalPool() 177{ 178 APP_DATA *app_data = (APP_DATA*) get_app_data(gLibId); 179 180 if (app_data) { 181 return app_data->gPool; 182 } 183 184 return NULL; 185} 186 187