license headers in libnetxms changed to LGPL
[public/netxms.git] / src / libnetxms / dload.cpp
index 7a1f28a..520c794 100644 (file)
@@ -1,11 +1,11 @@
 /* 
 ** NetXMS - Network Management System
 ** Utility Library
-** Copyright (C) 2003, 2004 Victor Kirhenshtein
+** Copyright (C) 2003-2010 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
-** it under the terms of the GNU General Public License as published by
-** the Free Software Foundation; either version 2 of the License, or
+** it under the terms of the GNU Lesser General Public License as published
+** by the Free Software Foundation; either version 3 of the License, or
 ** (at your option) any later version.
 **
 ** This program is distributed in the hope that it will be useful,
 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 ** GNU General Public License for more details.
 **
-** You should have received a copy of the GNU General Public License
+** You should have received a copy of the GNU Lesser General Public License
 ** along with this program; if not, write to the Free Software
 ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 **
-** $module: dload.cpp
+** File: dload.cpp
 **
 **/
 
 #include "libnetxms.h"
 
 #if defined(_NETWARE)
+#undef SEVERITY_CRITICAL
 #include <netware.h>
 #elif !defined(_WIN32)
 #include <dlfcn.h>
+#ifndef RTLD_GLOBAL
+#define RTLD_GLOBAL    0
+#endif
+#endif
+
+
+//
+// Error texts for NetWare LoadModule()
+//
+
+#ifdef _NETWARE
+
+static char *m_pszErrorText[] =
+{
+   "No error",
+   "File not found",
+   "Error reading file",
+   "File not in NLM format",
+   "Wrong NLM file version",
+   "Reentrant initialization failure",
+   "Cannot load multiple copies",
+   "Operation already in progress",
+   "Not enough memory",
+   "Initialization failure",
+   "Inconsistent file format",
+   "Cannot load module at startup",
+   "Unresolved dependencies",
+   "Unresolved external symbols",
+   "Public symbol already defined",
+   "XDC data error",
+   "Module must be loaded in the kernel",
+   "Module is NIOS compatible only and cannot be loaded on NetWare",
+   "Cannot create specified address space",
+   "Module initialization failed"
+};
+
 #endif
 
 
 // Load DLL/shared library
 //
 
-HMODULE LIBNETXMS_EXPORTABLE DLOpen(TCHAR *szLibName, TCHAR *pszErrorText)
+HMODULE LIBNETXMS_EXPORTABLE DLOpen(const TCHAR *pszLibName, TCHAR *pszErrorText)
 {
    HMODULE hModule;
 
 #if defined(_WIN32)
-   hModule = LoadLibrary(szLibName);
-   if (hModule == NULL)
+   hModule = LoadLibrary(pszLibName);
+   if ((hModule == NULL) && (pszErrorText != NULL))
       GetSystemErrorText(GetLastError(), pszErrorText, 255);
 #elif defined(_NETWARE)
    TCHAR szBuffer[MAX_PATH + 4];
+   int nError;
 
-   _tcsncpy(&szBuffer[4], szLibName, MAX_PATH);
-   if (LoadModule(getscreenhandle(), &szBuffer[4], LO_RETURN_HANDLE) == 0)
+   nx_strncpy(&szBuffer[4], pszLibName, MAX_PATH);
+   nError = LoadModule(getnetwarelogger(), &szBuffer[4], LO_RETURN_HANDLE);
+   if (nError == 0)
    {
       hModule = *((HMODULE *)szBuffer);
+               if (pszErrorText != NULL)
+       *pszErrorText = 0;
    }
    else
    {
       hModule = NULL;
-      *pszErrorText = 0;
+               if (pszErrorText != NULL)
+       nx_strncpy(pszErrorText, (nError <= 19) ? m_pszErrorText[nError] : "Unknown error code", 255);
    }
-#else    /* _WIN32 */
-   hModule = dlopen(szLibName, RTLD_NOW | RTLD_GLOBAL);
-   if (hModule == NULL)
-      strncpy(pszErrorText, dlerror(), 255);
+#else    /* not _WIN32 and not _NETWARE */
+#ifdef UNICODE
+       char *mbbuffer = MBStringFromWideString(pszLibName);
+   hModule = dlopen(mbbuffer, RTLD_NOW | RTLD_GLOBAL);
+   if ((hModule == NULL) && (pszErrorText != NULL))
+   {
+       WCHAR *wbuffer = WideStringFromMBString(dlerror());
+      nx_strncpy(pszErrorText, wbuffer, 255);
+      free(wbuffer);
+   }
+   free(mbbuffer);
+#else
+   hModule = dlopen(pszLibName, RTLD_NOW | RTLD_GLOBAL);
+   if ((hModule == NULL) && (pszErrorText != NULL))
+      nx_strncpy(pszErrorText, dlerror(), 255);
+#endif
 #endif
    return hModule;
 }
@@ -92,7 +146,7 @@ void LIBNETXMS_EXPORTABLE DLClose(HMODULE hModule)
 //
 
 void LIBNETXMS_EXPORTABLE *DLGetSymbolAddr(HMODULE hModule,
-                                                                                  TCHAR *pszSymbol,
+                                                                                  const TCHAR *pszSymbol,
                                                                                   TCHAR *pszErrorText)
 {
    void *pAddr;
@@ -107,15 +161,30 @@ void LIBNETXMS_EXPORTABLE *DLGetSymbolAddr(HMODULE hModule,
 #else
    pAddr = GetProcAddress(hModule, pszSymbol);
 #endif
-   if (pAddr == NULL)
+   if ((pAddr == NULL) && (pszErrorText != NULL))
       GetSystemErrorText(GetLastError(), pszErrorText, 255);
 #elif defined(_NETWARE)
    pAddr = ImportPublicObject(hModule, pszSymbol);
-   *pszErrorText = 0;
+   if (pszErrorText != NULL)
+      *pszErrorText = 0;
 #else    /* _WIN32 */
+#ifdef UNICODE
+   char mbbuffer[256];
+
+   WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK | WC_DEFAULTCHAR,
+                       pszSymbol, -1, mbbuffer, 256, NULL, NULL);
+   pAddr = dlsym(hModule, mbbuffer);
+   if ((pAddr == NULL) && (pszErrorText != NULL))
+   {
+       WCHAR *wbuffer = WideStringFromMBString(dlerror());
+      nx_strncpy(pszErrorText, wbuffer, 255);
+      free(wbuffer);
+   }
+#else
    pAddr = dlsym(hModule, pszSymbol);
-   if (pAddr == NULL)
-      _tcsncpy(pszErrorText, dlerror(), 255);
+   if ((pAddr == NULL) && (pszErrorText != NULL))
+      nx_strncpy(pszErrorText, dlerror(), 255);
+#endif
 #endif
    return pAddr;
 }