- Fixed agent crash on NetWare (issue 86)
authorVictor Kirhenshtein <victor@netxms.org>
Sun, 14 May 2006 18:59:43 +0000 (18:59 +0000)
committerVictor Kirhenshtein <victor@netxms.org>
Sun, 14 May 2006 18:59:43 +0000 (18:59 +0000)
- NetWare platform subagent improved
- Fixed various minor NetWare portability issues

12 files changed:
ChangeLog
include/nms_threads.h
include/unicode.h
netware/Makefile.inc
netware/version.inc
src/agent/subagents/netware/netware.cpp
src/agent/subagents/netware/netware.def
src/agent/subagents/ping/ping.cpp
src/agent/subagents/ping/ping.def
src/libnetxms/dload.cpp
src/libnetxms/icmp.cpp
src/libnetxms/netxms.def

index d77cb80..ed6b78f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -10,7 +10,7 @@
 - Implemented "User must change password on next logon" function
 - UPS subagent: added support for BSMXCP protocol (used by Powerware,
   HP and Compaq UPSes)
-- Fixed issues: #52, #82, #83, #84, #85, #87, #88
+- Fixed issues: #52, #82, #83, #84, #85, #86, #87, #88
 
 
 *
index 4e6d05b..6678e3f 100644 (file)
@@ -422,12 +422,16 @@ inline BOOL ConditionWait(CONDITION cond, DWORD dwTimeOut)
       {
                   if (dwTimeOut != INFINITE)
                   {
-#if HAVE_PTHREAD_COND_RELTIMEDWAIT_NP
+#if HAVE_PTHREAD_COND_RELTIMEDWAIT_NP || defined(_NETWARE)
                           struct timespec timeout;
 
                           timeout.tv_sec = dwTimeOut / 1000;
                           timeout.tv_nsec = (dwTimeOut % 1000) * 1000000;
+#ifdef _NETWARE
+                          retcode = pthread_cond_timedwait(&cond->cond, &cond->mutex, &timeout);
+#else
                           retcode = pthread_cond_reltimedwait_np(&cond->cond, &cond->mutex, &timeout);
+#endif
 #else
                           struct timeval now;
                           struct timespec timeout;
index 4087cb5..bb1107b 100644 (file)
 
 #else    /* not _WIN32 */
 
+#ifdef _NETWARE
+#define WCHAR     wchar_t
+#else
 #define WCHAR     unsigned short
+#endif
 
 #ifdef UNICODE
 
index 1e584e8..0d8edbf 100644 (file)
@@ -4,9 +4,10 @@
 #
 
 CFLAGS   = -nostdinc -fno-exceptions -fno-builtin -fpack-struct -fno-rtti \
-           -c -D_NETWARE -I../../include -I../../../include \
-           -I../../../../include -IC:/novell/ndk/libc/include \
-           -IC:/novell/ndk/nwsdk/include
+           -c -D_NETWARE -IC:/nwsdk/libc/include \
+           -IC:/nwsdk/fs64/include \
+          -I../../include -I../../../include \
+           -I../../../../include
 LDFLAGS  = --linker=c:/gcc-nlm/usr/bin/i586-netware-ld.exe --output-target=nlm32-i386 --input-target=elf32-i386
 PLDFLAGS = -r
 
index 265f7e1..4d0dc36 100644 (file)
@@ -1,2 +1,2 @@
-VERSION 0,2,10
+VERSION 0,2,11
 COPYRIGHT "Copyright (c) 2004, 2005, 2006 NetXMS Team"
index d519f29..bc68c11 100644 (file)
@@ -41,21 +41,30 @@ static int m_iCpuHPos = 0;
 static LONG H_MemoryInfo(char *pszParam, char *pArg, char *pValue)
 {
    struct memory_info info;
+   size64_t nTotalMem;
 
    memset(&info, 0, sizeof(struct memory_info));
    if (netware_mem_info(&info) != 0)
       return SYSINFO_RC_ERROR;
 
+   // Field info.TotalKnownSystemMemoryUnder4Gb may be zero if
+   // total memory is below 4GB (or it is only on older LibC,
+   // I don't know).
+   if (info.TotalKnownSystemMemory != 0)
+      nTotalMem = info.TotalKnownSystemMemory;
+   else
+      nTotalMem = info.TotalKnownSystemMemoryUnder4Gb;
+
    switch((int)pArg)
    {
       case MEMINFO_PHYSICAL_TOTAL:
-         ret_uint64(pValue, info.TotalKnownSystemMemory);
+         ret_uint64(pValue, nTotalMem);
          break;
       case MEMINFO_PHYSICAL_USED:
          ret_uint64(pValue, info.TotalWorkMemory);
          break;
       case MEMINFO_PHYSICAL_FREE:
-         ret_uint64(pValue, info.TotalKnownSystemMemory - info.TotalWorkMemory);
+         ret_uint64(pValue, nTotalMem - info.TotalWorkMemory);
          break;
       default:
          break;
@@ -129,7 +138,7 @@ static LONG H_CpuUsage(char *pszParam, char *pArg, char *pValue)
    if (szBuffer[0] == 0)   // All CPUs?
       iCpu = -1;
    else
-      iCpu = strtol(szBuffer, 0, NULL);
+      iCpu = strtol(szBuffer, NULL, 0);
 
    iSteps = (int)pArg;
    iCpuCount = NXGetCpuCount();
@@ -237,6 +246,7 @@ static void UnloadHandler(void)
    if (m_hCondShutdown != INVALID_CONDITION_HANDLE)
       ConditionSet(m_hCondShutdown);
    ThreadJoin(m_hCollectorThread);
+   ConditionDestroy(m_hCondShutdown);
 
    // Notify main thread that NLM can exit
    ConditionSet(m_hCondTerminate);
@@ -263,7 +273,7 @@ static NETXMS_SUBAGENT_PARAM m_parameters[] =
    { "System.Memory.Physical.Free", H_MemoryInfo, (char *)MEMINFO_PHYSICAL_FREE, DCI_DT_UINT64, "Available physical memory" },
    { "System.Memory.Physical.Total", H_MemoryInfo, (char *)MEMINFO_PHYSICAL_TOTAL, DCI_DT_UINT64, "Total amount of physical memory" },
    { "System.Memory.Physical.Used", H_MemoryInfo, (char *)MEMINFO_PHYSICAL_USED, DCI_DT_UINT64, "Used physical memory" },
-   { "System.PlatformName", H_PlatformName, NULL, DCI_DT_STRING, NULL }
+   { "System.PlatformName", H_PlatformName, NULL, DCI_DT_STRING, "" }
 };
 static NETXMS_SUBAGENT_ENUM m_enums[] =
 {
@@ -297,6 +307,7 @@ extern "C" BOOL NxSubAgentInit_NETWARE(NETXMS_SUBAGENT_INFO **ppInfo, TCHAR *psz
    memset(m_iCpuUtilHistory, 0, sizeof(int) * CPU_HISTORY_SIZE * MAX_CPU);
 
    // Start collector thread
+   m_hCondShutdown = ConditionCreate(TRUE);
    m_hCollectorThread = ThreadCreateEx(CollectorThread, 0, NULL);
 
    return TRUE;
index 1c4059c..69c1105 100644 (file)
@@ -3,12 +3,13 @@
 # Copyright (c) 2004 Victor Kirhenshtein
 #
 
-# define startup object files
-INPUT c:/novell/ndk/libc/imports/libcpre.gcc.o   # clib startup code
+# common definitions
+@../../../../netware/nlmconv.inc
+
+# define input object files
 INPUT netware.o
 
 # Import/Export
-IMPORT @c:/novell/ndk/libc/imports/libc.imp
 IMPORT @../../../libnetxms/netxms.imp
 EXPORT NxSubAgentInit_NETWARE
 
@@ -18,7 +19,6 @@ EXIT _LibCPostlude
 
 # NLM header
 OUTPUT netware.nsm
-@../../../../netware/version.inc
 COPYRIGHT "Copyright (c) 2004, 2005, 2006 NetXMS Team"
 DESCRIPTION "NetXMS NetWare Platform Subagent"
 SCREENNAME "System Console"
index 7e2f480..a74acf1 100644 (file)
@@ -21,6 +21,7 @@
 **/
 
 #include "ping.h"
+#include <screen.h>
 
 #ifdef _WIN32
 #define PING_EXPORTABLE __declspec(dllexport) __cdecl
@@ -106,17 +107,22 @@ static LONG H_IcmpPing(TCHAR *pszParam, TCHAR *pArg, TCHAR *pValue)
    TCHAR szHostName[256], szTimeOut[32], szPacketSize[32];
    DWORD dwAddr, dwTimeOut = m_dwTimeout, dwRTT, dwPacketSize = m_dwDefPacketSize;
 
+consoleprintf("step 1\n");
    if (!NxGetParameterArg(pszParam, 1, szHostName, 256))
       return SYSINFO_RC_UNSUPPORTED;
    StrStrip(szHostName);
+consoleprintf("step 2\n");
    if (!NxGetParameterArg(pszParam, 2, szTimeOut, 256))
       return SYSINFO_RC_UNSUPPORTED;
    StrStrip(szTimeOut);
+consoleprintf("step 3\n");
    if (!NxGetParameterArg(pszParam, 3, szPacketSize, 256))
       return SYSINFO_RC_UNSUPPORTED;
    StrStrip(szPacketSize);
+consoleprintf("step 4\n");
 
    dwAddr = _t_inet_addr(szHostName);
+consoleprintf("step 5\n");
    if (szTimeOut[0] != 0)
    {
       dwTimeOut = _tcstoul(szTimeOut, NULL, 0);
@@ -130,9 +136,12 @@ static LONG H_IcmpPing(TCHAR *pszParam, TCHAR *pArg, TCHAR *pValue)
       dwPacketSize = _tcstoul(szPacketSize, NULL, 0);
    }
 
+consoleprintf("step 6\n");
    if (IcmpPing(dwAddr, 1, dwTimeOut, &dwRTT, dwPacketSize) != ICMP_SUCCESS)
       dwRTT = 10000;
+consoleprintf("step 7\n");
    ret_uint(pValue, dwRTT);
+consoleprintf("step 8\n");
    return SYSINFO_RC_SUCCESS;
 }
 
index bb52bb0..493ebce 100644 (file)
@@ -3,12 +3,13 @@
 # Copyright (c) 2004 Victor Kirhenshtein
 #
 
-# define startup object files
-INPUT c:/novell/ndk/libc/imports/libcpre.gcc.o   # clib startup code
+# common definitions
+@../../../../netware/nlmconv.inc
+
+# define input object files
 INPUT ping.o
 
 # Import/Export
-IMPORT @c:/novell/ndk/libc/imports/libc.imp
 IMPORT @../../../libnetxms/netxms.imp
 EXPORT NxSubAgentInit_PING
 
@@ -19,7 +20,6 @@ EXIT _LibCPostlude
 # NLM header
 OUTPUT ping.nsm
 TYPE 0
-@../../../../netware/version.inc
 DESCRIPTION "NetXMS PING Subagent"
 SCREENNAME "System Console"
 
index 3f9b48f..b03d7d2 100644 (file)
@@ -1,7 +1,7 @@
 /* 
 ** NetXMS - Network Management System
 ** Utility Library
-** Copyright (C) 2003, 2004 Victor Kirhenshtein
+** Copyright (C) 2003, 2004, 2005, 2006 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
 
 
 //
+// 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
 //
 
@@ -44,16 +77,19 @@ HMODULE LIBNETXMS_EXPORTABLE DLOpen(TCHAR *szLibName, TCHAR *pszErrorText)
       GetSystemErrorText(GetLastError(), pszErrorText, 255);
 #elif defined(_NETWARE)
    TCHAR szBuffer[MAX_PATH + 4];
+   int nError;
 
    nx_strncpy(&szBuffer[4], szLibName, MAX_PATH);
-   if (LoadModule(getscreenhandle(), &szBuffer[4], LO_RETURN_HANDLE) == 0)
+   nError = LoadModule(getnetwarelogger(), &szBuffer[4], LO_RETURN_HANDLE);
+   if (nError == 0)
    {
       hModule = *((HMODULE *)szBuffer);
+      *pszErrorText = 0;
    }
    else
    {
       hModule = NULL;
-      *pszErrorText = 0;
+      nx_strncpy(pszErrorText, (nError <= 19) ? m_pszErrorText[nError] : "Unknown error code", 255);
    }
 #else    /* _WIN32 */
    hModule = dlopen(szLibName, RTLD_NOW | RTLD_GLOBAL);
index b179ab3..716859b 100644 (file)
@@ -1,6 +1,6 @@
 /* 
 ** libnetxms - Common NetXMS utility library
-** Copyright (C) 2003, 2004 Victor Kirhenshtein
+** Copyright (C) 2003, 2004, 2005, 2006 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
@@ -27,7 +27,6 @@
 #include <poll.h>
 #endif
 
-
 //
 // Constants
 //
@@ -141,6 +140,7 @@ DWORD LIBNETXMS_EXPORTABLE IcmpPing(DWORD dwAddr, int iNumRetries,
    }
 
    // Setup destination address structure
+   memset(&saDest, 0, sizeof(sockaddr_in));
    saDest.sin_addr.s_addr = dwAddr;
    saDest.sin_family = AF_INET;
    saDest.sin_port = 0;
index a34dc16..a509194 100644 (file)
@@ -3,13 +3,13 @@
 # Copyright (c) 2004 Victor Kirhenshtein
 #
 
+# common definitions
+@../../netware/nlmconv.inc
+
 # define startup object files
-INPUT c:/novell/ndk/libc/imports/libcpre.gcc.o   # clib startup code
 INPUT netxms_r.o
 
 # Imports/Exports
-IMPORT @c:/novell/ndk/libc/imports/libc.imp
-IMPORT @c:/novell/ndk/libc/imports/netware.imp
 EXPORT @netxms.imp
 
 # Entry points
@@ -19,7 +19,6 @@ EXIT _LibCPostlude
 # NLM header
 OUTPUT netxms.nlm
 TYPE 0
-@../../netware/version.inc
 DESCRIPTION "NetXMS Foundation Library"
 SCREENNAME "System Console"
 FLAG_ON 64