Fixed problems with platform subagent loading by server
authorVictor Kirhenshtein <victor@netxms.org>
Thu, 21 Sep 2006 07:45:53 +0000 (07:45 +0000)
committerVictor Kirhenshtein <victor@netxms.org>
Thu, 21 Sep 2006 07:45:53 +0000 (07:45 +0000)
include/nms_common.h
src/agent/subagents/linux/linux.cpp
src/libnetxms/dload.cpp
src/server/core/netinfo.cpp

index a1dcbe4..6c0cc68 100644 (file)
@@ -230,6 +230,10 @@ typedef int SOCKET;
 
 /*********** UNIX *********************/
 
+#ifndef SHL_SUFFIX
+#define SHL_SUFFIX     ".so"
+#endif
+
 #include <errno.h>
 
 #define FS_PATH_SEPARATOR  _T("/")
index e4022b0..e7eaa80 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: linux.cpp,v 1.27 2006-09-21 07:24:08 victor Exp $ */
+/* $Id: linux.cpp,v 1.28 2006-09-21 07:45:53 victor Exp $ */
 
 /* 
 ** NetXMS subagent for GNU/Linux
@@ -199,12 +199,12 @@ DECLARE_SUBAGENT_INIT(LINUX)
 // Entry points for server
 //
 
-BOOL __NxSubAgentGetIfList(NETXMS_VALUES_LIST *pValue)
+extern "C" BOOL __NxSubAgentGetIfList(NETXMS_VALUES_LIST *pValue)
 {
    return H_NetIfList("Net.InterfaceList", NULL, pValue) == SYSINFO_RC_SUCCESS;
 }
 
-BOOL __NxSubAgentGetArpCache(NETXMS_VALUES_LIST *pValue)
+extern "C" BOOL __NxSubAgentGetArpCache(NETXMS_VALUES_LIST *pValue)
 {
    return H_NetArpCache("Net.ArpCache", NULL, pValue) == SYSINFO_RC_SUCCESS;
 }
@@ -214,6 +214,9 @@ BOOL __NxSubAgentGetArpCache(NETXMS_VALUES_LIST *pValue)
 /*
 
 $Log: not supported by cvs2svn $
+Revision 1.27  2006/09/21 07:24:08  victor
+Server now can load platform subagents to obtain local ARP cache and interface list
+
 Revision 1.26  2006/06/09 07:08:40  victor
 Some minor fixes
 
index dfd316a..dc255b9 100644 (file)
@@ -76,7 +76,7 @@ HMODULE LIBNETXMS_EXPORTABLE DLOpen(TCHAR *szLibName, TCHAR *pszErrorText)
 
 #if defined(_WIN32)
    hModule = LoadLibrary(szLibName);
-   if (hModule == NULL)
+   if ((hModule == NULL) && (pszErrorText != NULL))
       GetSystemErrorText(GetLastError(), pszErrorText, 255);
 #elif defined(_NETWARE)
    TCHAR szBuffer[MAX_PATH + 4];
@@ -87,16 +87,18 @@ HMODULE LIBNETXMS_EXPORTABLE DLOpen(TCHAR *szLibName, TCHAR *pszErrorText)
    if (nError == 0)
    {
       hModule = *((HMODULE *)szBuffer);
-      *pszErrorText = 0;
+               if (pszErrorText != NULL)
+       *pszErrorText = 0;
    }
    else
    {
       hModule = NULL;
-      nx_strncpy(pszErrorText, (nError <= 19) ? m_pszErrorText[nError] : "Unknown error code", 255);
+               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)
+   if ((hModule == NULL) && (pszErrorText != NULL))
       nx_strncpy(pszErrorText, dlerror(), 255);
 #endif
    return hModule;
index 2f5ea53..6e721fa 100644 (file)
 
 #else
 
-#if HAVE_SYS_IOCTL_H
-#include <sys/ioctl.h>
-#endif
-#if HAVE_SYS_SOCKIO_H
-#include <sys/sockio.h>
+#if HAVE_SYS_UTSNAME_H
+#include <sys/utsname.h>
 #endif
+
 #if HAVE_NET_IF_H
 #include <net/if.h>
 #endif
-#if HAVE_NET_IF_ARP_H
-#include <net/if_arp.h>
-#endif
-#if HAVE_NET_IF_DL_H
-#include <net/if_dl.h>
-#endif
 
 #endif   /* _WIN32 */
 
@@ -90,7 +82,7 @@ void InitLocalNetInfo(void)
          un.sysname[i] = tolower(un.sysname[i]);
       snprintf(szName, MAX_PATH, LIBDIR "/libnsm_%s" SHL_SUFFIX, un.sysname);
 
-      m_hSubAgent = DLOpen(szName, szErrorText);
+      m_hSubAgent = DLOpen(szName, NULL);
       if (m_hSubAgent != NULL)
       {
          imp_NxSubAgentGetIfList = (BOOL (*)(NETXMS_VALUES_LIST *))DLGetSymbolAddr(m_hSubAgent, "__NxSubAgentGetIfList", NULL);
@@ -190,6 +182,7 @@ static ARP_CACHE *SysGetLocalArpCache(void)
 
    if (imp_NxSubAgentGetArpCache != NULL)
    {
+               memset(&list, 0, sizeof(NETXMS_VALUES_LIST));
       if (imp_NxSubAgentGetArpCache(&list))
       {
          // Create empty structure
@@ -249,7 +242,7 @@ static ARP_CACHE *SysGetLocalArpCache(void)
 
 static INTERFACE_LIST *SysGetLocalIfList(void)
 {
-   INTERFACE_LIST *pIfList;
+   INTERFACE_LIST *pIfList = NULL;
 
 #ifdef _WIN32
    DWORD dwSize;
@@ -327,6 +320,7 @@ static INTERFACE_LIST *SysGetLocalIfList(void)
 
    if (imp_NxSubAgentGetIfList != NULL)
    {
+               memset(&list, 0, sizeof(NETXMS_VALUES_LIST));
       if (imp_NxSubAgentGetIfList(&list))
       {
          pIfList = (INTERFACE_LIST *)malloc(sizeof(INTERFACE_LIST));