Core agent is now working on NetWare
authorVictor Kirhenshtein <victor@netxms.org>
Mon, 23 Aug 2004 08:15:36 +0000 (08:15 +0000)
committerVictor Kirhenshtein <victor@netxms.org>
Mon, 23 Aug 2004 08:15:36 +0000 (08:15 +0000)
17 files changed:
.gitattributes
netware/Makefile.inc
src/agent/core/Makefile.nw
src/agent/core/exec.cpp
src/agent/core/nxagentd.cpp
src/agent/core/nxagentd.def
src/agent/core/nxagentd.h
src/libnetxms/Makefile.nw
src/libnetxms/c_lgcc3.cpp [new file with mode: 0644]
src/libnetxms/hash.cpp
src/libnetxms/main.cpp
src/libnetxms/md5.cpp
src/libnetxms/md5.h
src/libnetxms/sha1.cpp
src/libnetxms/sha1.h
src/libnetxms/tools.cpp
tools/nwmkimp.pl

index dffcc41..117e379 100644 (file)
@@ -229,6 +229,7 @@ src/console/win32starter/nxcstart.rc -text
 src/console/win32starter/resource.h -text
 src/libnetxms/Makefile.am -text
 src/libnetxms/Makefile.nw -text
+src/libnetxms/c_lgcc3.cpp -text
 src/libnetxms/config.cpp -text
 src/libnetxms/dload.cpp -text
 src/libnetxms/getopt.c -text
index 42dbc1d..b6f7fa7 100644 (file)
@@ -3,10 +3,11 @@
 # Copyright (c) 2004 Victor Kirhenshtein
 #
 
-CFLAGS   = -nostdinc -fno-builtin -fpack-struct -c -D_NETWARE -I../../include -IC:/novell/ndk/libc/include
+CFLAGS   = -nostdinc -fno-exceptions -fno-builtin -fpack-struct -c -D_NETWARE -I../../include -I../../../include -IC:/novell/ndk/libc/include
 LDFLAGS  = --linker=c:/gcc-nlm/usr/bin/i586-netware-ld.exe --output-target=nlm32-i386 --input-target=elf32-i386
-PLDFLAGS = -r -Lc:/gcc-nlm/usr/i586-netware/lib -Lc:/gcc-nlm/usr/lib/gcc-lib/i586-netware/3.2.3 -lstdc++ -lsupc++ -lgcc
+PLDFLAGS = -r
 
 CC       = i586-netware-g++
 PRELINK  = i586-netware-ld
 LINK     = i586-netware-nlmconv
+PERL    = perl
index f30ba1e..5b6d4c6 100644 (file)
@@ -13,6 +13,8 @@ OBJTMP   = nxagentd_r.o
 
 all: $(EXEC)
 
+$(OBJECTS): nxagentd.h Makefile.nw
+
 .cpp.o:
        $(CC) $(CFLAGS) -o $*.o $<
 
index 99ba66e..605cd18 100644 (file)
@@ -71,7 +71,7 @@ DWORD ExecuteCommand(char *pszCommand, NETXMS_VALUES_LIST *pArgs)
    pszCmdLine[i] = 0;
 
    DebugPrintf("EXEC: Executing \"%s\"", pszCmdLine);
-#ifdef _WIN32
+#if defined(_WIN32)
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
 
@@ -92,6 +92,11 @@ DWORD ExecuteCommand(char *pszCommand, NETXMS_VALUES_LIST *pArgs)
       CloseHandle(pi.hThread);
       CloseHandle(pi.hProcess);
    }
+#elif defined(_NETWARE)
+   if (system(pszCmdLine) == 0)
+      dwRetCode = ERR_SUCCESS;
+   else
+      dwRetCode = ERR_INTERNAL_ERROR;
 #else
    /* TODO: add UNIX code here */
    dwRetCode = ERR_NOT_IMPLEMENTED;
index 58ef66c..62cb2a5 100644 (file)
@@ -38,8 +38,10 @@ void ListenerThread(void *);
 // Valid options for getopt()
 //
 
-#ifdef _WIN32
+#if defined(_WIN32)
 #define VALID_OPTIONS   "c:CdDhIRsSv"
+#elif defined(_NETWARE)
+#define VALID_OPTIONS   "c:CDhv"
 #else
 #define VALID_OPTIONS   "c:CdDhv"
 #endif
@@ -118,7 +120,9 @@ static char m_szHelpText[] =
    "Where valid options are:\n"
    "   -c <file>  : Use configuration file <file> (default " AGENT_DEFAULT_CONFIG ")\n"
    "   -C         : Check configuration file and exit\n"
+#ifndef _NETWARE
    "   -d         : Run as daemon/service\n"
+#endif
    "   -D         : Turn on debug output\n"
    "   -h         : Display help and exit\n"
 #ifdef _WIN32
@@ -306,7 +310,7 @@ void Main(void)
    }
    else
    {
-#ifdef _WIN32
+#if defined(_WIN32)
       printf("Agent running. Press ESC to shutdown.\n");
       while(1)
       {
@@ -315,6 +319,9 @@ void Main(void)
       }
       printf("Agent shutting down...\n");
       Shutdown();
+#elif defined(_NETWARE)
+      printf("Agent running. Type UNLOAD NXAGENTD on the system console for shutdown.\n");
+      ConditionWait(m_hCondShutdown, INFINITE);
 #else
       printf("Agent running. Press Ctrl+C to shutdown.\n");
       ConditionWait(m_hCondShutdown, INFINITE);
@@ -413,12 +420,14 @@ int main(int argc, char *argv[])
                }
             }
 #else    /* _WIN32 */
+#ifndef _NETWARE
             if (g_dwFlags & AF_DAEMON)
                if (daemon(0, 0) == -1)
                {
                   perror("Unable to setup itself as a daemon");
                   iExitCode = 4;
                }
+#endif
             if (iExitCode == 0)
             {
                if (Initialize())
index 886576d..91c4fbd 100644 (file)
@@ -22,6 +22,6 @@ TYPE 0
 VERSION 1,0,0
 COPYRIGHT "Copyright (c) 2004 NetXMS Team"
 DESCRIPTION "NetXMS Core Agent"
-SCREENNAME "System Console"
+SCREENNAME "NetXMS Agent"
 
 MODULE LIBC, NETXMS, NXCSCP
index bff9f69..acb9a0d 100644 (file)
 // Default files
 //
 
-#ifdef _WIN32
+#if defined(_WIN32)
 #define AGENT_DEFAULT_CONFIG  "C:\\nxagentd.conf"
 #define AGENT_DEFAULT_LOG     "C:\\nxagentd.log"
+#elif defined(_NETWARE)
+#define AGENT_DEFAULT_CONFIG  "SYS:ETC/nxagentd.conf"
+#define AGENT_DEFAULT_LOG     "SYS:ETC/nxagentd.log"
 #else
 #define AGENT_DEFAULT_CONFIG  "/etc/nxagentd.conf"
 #define AGENT_DEFAULT_LOG     "/var/log/nxagentd"
index 974fab5..3435036 100644 (file)
@@ -5,7 +5,8 @@
 
 include ../../netware/Makefile.inc
 
-OBJECTS  = config.o dload.o hash.o icmp.o inline.o main.o md5.o sha1.o tools.o
+OBJECTS  = c_lgcc3.o config.o dload.o hash.o icmp.o inline.o main.o md5.o \
+           sha1.o tools.o
 EXEC     = netxms.nlm
 DEF      = netxms.def
 OBJTMP   = netxms_r.o
@@ -13,6 +14,8 @@ IMP      = netxms.imp
 
 all: $(EXEC)
 
+$(OBJECTS): libnetxms.h Makefile.nw
+
 .cpp.o:
        $(CC) $(CFLAGS) -o $*.o $<
 
@@ -21,7 +24,7 @@ all: $(EXEC)
 
 $(EXEC): $(OBJECTS) $(DEF)
        $(PRELINK) -o $(OBJTMP) $(OBJECTS) $(PLDFLAGS)
-       perl ../../tools/nwmkimp.pl $(OBJTMP) $(IMP)
+       $(PERL) ../../tools/nwmkimp.pl $(OBJTMP) $(IMP)
        $(LINK) $(LDFLAGS) -T $(DEF)
        rm -f $(OBJTMP)
 
diff --git a/src/libnetxms/c_lgcc3.cpp b/src/libnetxms/c_lgcc3.cpp
new file mode 100644 (file)
index 0000000..f1c503f
--- /dev/null
@@ -0,0 +1,32 @@
+/* c_lgcc3.cpp -- make g++-3.2 programs linkable with gcc-2.95
+ * by pts@fazekas.hu at Wed Dec 11 16:33:03 CET 2002
+ *
+ * This file is not sam2p-specific. See also AC_PTS_GCC_LINKS_CXX in file
+ * aclocal.m4.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/* vvv make these a macro to make them fast */
+#define XMALLOC_CODE() (unsigned len) { \
+  void *p=malloc(len); \
+  if (p==0) { fputs("out of memory\n",stderr); abort(); } \
+  return p; \
+}
+#define XFREE_CODE() (void* p) { if (p!=0) free(p); }
+
+/* at Wed Dec 11 16:31:42 CET 2002
+ * This helper is here for gcc-2.95: c_lgcc3.cpp should be compiled by
+ * gcc-2.95, remaining files are compiled by g++-3.2
+ */
+void* __cxa_pure_virtual=0;
+extern "C" void  _ZdlPv (void*);
+extern "C" void* _Znwj (unsigned);
+extern "C" void  _ZdaPv (void*);
+extern "C" void* _Znaj (unsigned);
+void  _ZdlPv XFREE_CODE()
+void* _Znwj  XMALLOC_CODE()
+void  _ZdaPv XFREE_CODE()
+void* _Znaj  XMALLOC_CODE()
+
index fc46133..7194425 100644 (file)
@@ -131,9 +131,9 @@ void LIBNETXMS_EXPORTABLE CalculateMD5Hash(const unsigned char *data, int nbytes
 {
        md5_state_t state;
 
-       md5_init(&state);
-       md5_append(&state, (const md5_byte_t *)data, nbytes);
-       md5_finish(&state, (md5_byte_t *)hash);
+       I_md5_init(&state);
+       I_md5_append(&state, (const md5_byte_t *)data, nbytes);
+       I_md5_finish(&state, (md5_byte_t *)hash);
 }
 
 
@@ -145,9 +145,9 @@ void LIBNETXMS_EXPORTABLE CalculateSHA1Hash(unsigned char *data, int nbytes, BYT
 {
    SHA1_CTX context;
 
-   SHA1Init(&context);
-   SHA1Update(&context, data, nbytes);
-   SHA1Final(hash, &context);
+   I_SHA1Init(&context);
+   I_SHA1Update(&context, data, nbytes);
+   I_SHA1Final(hash, &context);
 }
 
 
@@ -165,18 +165,18 @@ BOOL LIBNETXMS_EXPORTABLE CalculateFileMD5Hash(char *pszFileName, BYTE *pHash)
    fd = open(pszFileName, O_RDONLY | O_BINARY);
    if (fd != -1)
    {
-       md5_init(&state);
+      I_md5_init(&state);
       while(1)
       {
          iSize = read(fd, szBuffer, FILE_BLOCK_SIZE);
          if (iSize <= 0)
             break;
-       md5_append(&state, (const md5_byte_t *)szBuffer, iSize);
+       I_md5_append(&state, (const md5_byte_t *)szBuffer, iSize);
       }
       close(fd);
       if (iSize == 0)
       {
-       md5_finish(&state, (md5_byte_t *)pHash);
+         I_md5_finish(&state, (md5_byte_t *)pHash);
          bSuccess = TRUE;
       }
    }
@@ -198,18 +198,18 @@ BOOL LIBNETXMS_EXPORTABLE CalculateFileSHA1Hash(char *pszFileName, BYTE *pHash)
    fd = open(pszFileName, O_RDONLY | O_BINARY);
    if (fd != -1)
    {
-      SHA1Init(&context);
+      I_SHA1Init(&context);
       while(1)
       {
          iSize = read(fd, szBuffer, FILE_BLOCK_SIZE);
          if (iSize <= 0)
             break;
-         SHA1Update(&context, (BYTE *)szBuffer, iSize);
+         I_SHA1Update(&context, (BYTE *)szBuffer, iSize);
       }
       close(fd);
       if (iSize == 0)
       {
-         SHA1Final(pHash, &context);
+         I_SHA1Final(pHash, &context);
          bSuccess = TRUE;
       }
    }
index 1ff1138..a2a4928 100644 (file)
@@ -101,3 +101,22 @@ BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
 }
 
 #endif   /* _WIN32 */
+
+
+//
+// NetWare library entry point
+//
+
+#ifdef _NETWARE
+
+int _init(void)
+{
+   return 0;
+}
+
+int _fini(void)
+{
+   return 0;
+}
+
+#endif
index 020f339..49dcda7 100644 (file)
@@ -21,7 +21,7 @@
   ghost@aladdin.com
 
  */
-/* $Id: md5.cpp,v 1.4 2004-08-20 15:12:23 victor Exp $ */
+/* $Id: md5.cpp,v 1.5 2004-08-23 08:15:31 victor Exp $ */
 /*
   Independent implementation of MD5 (RFC 1321).
 
@@ -313,8 +313,7 @@ md5_process(md5_state_t *pms, const md5_byte_t *data /*[64]*/)
     pms->abcd[3] += d;
 }
 
-void
-md5_init(md5_state_t *pms)
+void I_md5_init(md5_state_t *pms)
 {
     pms->count[0] = pms->count[1] = 0;
     pms->abcd[0] = 0x67452301;
@@ -323,8 +322,7 @@ md5_init(md5_state_t *pms)
     pms->abcd[3] = 0x10325476;
 }
 
-void
-md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes)
+void I_md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes)
 {
     const md5_byte_t *p = data;
     int left = nbytes;
@@ -361,8 +359,7 @@ md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes)
        memcpy(pms->buf, p, left);
 }
 
-void
-md5_finish(md5_state_t *pms, md5_byte_t digest[16])
+void I_md5_finish(md5_state_t *pms, md5_byte_t digest[16])
 {
     static const md5_byte_t pad[64] = {
        0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -377,9 +374,9 @@ md5_finish(md5_state_t *pms, md5_byte_t digest[16])
     for (i = 0; i < 8; ++i)
        data[i] = (md5_byte_t)(pms->count[i >> 2] >> ((i & 3) << 3));
     /* Pad to 56 bytes mod 64. */
-    md5_append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1);
+    I_md5_append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1);
     /* Append the length. */
-    md5_append(pms, data, 8);
+    I_md5_append(pms, data, 8);
     for (i = 0; i < 16; ++i)
        digest[i] = (md5_byte_t)(pms->abcd[i >> 2] >> ((i & 3) << 3));
 }
index f54d8a2..ceec1fe 100644 (file)
@@ -21,7 +21,7 @@
   ghost@aladdin.com
 
  */
-/* $Id: md5.h,v 1.2 2004-06-03 10:59:48 victor Exp $ */
+/* $Id: md5.h,v 1.3 2004-08-23 08:15:31 victor Exp $ */
 /*
   Independent implementation of MD5 (RFC 1321).
 
@@ -86,13 +86,13 @@ extern "C"
 #endif
 
 /* Initialize the algorithm. */
-void md5_init(md5_state_t *pms);
+void I_md5_init(md5_state_t *pms);
 
 /* Append a string to the message. */
-void md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes);
+void I_md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes);
 
 /* Finish the message and return the digest. */
-void md5_finish(md5_state_t *pms, md5_byte_t digest[16]);
+void I_md5_finish(md5_state_t *pms, md5_byte_t digest[16]);
 
 #ifdef __cplusplus
 }  /* end extern "C" */
index 1335c20..f78be7f 100644 (file)
@@ -164,7 +164,7 @@ CHAR64LONG16* block;
 
 /* SHA1Init - Initialize new context */
 
-void SHA1Init(SHA1_CTX* context)
+void I_SHA1Init(SHA1_CTX* context)
 {
     /* SHA1 initialization constants */
     context->state[0] = 0x67452301;
@@ -178,7 +178,7 @@ void SHA1Init(SHA1_CTX* context)
 
 /* Run your data through this. */
 
-void SHA1Update(SHA1_CTX* context, unsigned char* data, uint32 len)    /* JHB */
+void I_SHA1Update(SHA1_CTX* context, unsigned char* data, uint32 len)  /* JHB */
 {
 uint32 i, j;   /* JHB */
 
@@ -206,7 +206,7 @@ uint32 i, j;        /* JHB */
 
 /* Add padding and return the message digest. */
 
-void SHA1Final(unsigned char digest[20], SHA1_CTX* context)
+void I_SHA1Final(unsigned char digest[20], SHA1_CTX* context)
 {
 uint32 i;      /* JHB */
 unsigned char finalcount[8];
@@ -215,11 +215,11 @@ unsigned char finalcount[8];
         finalcount[i] = (unsigned char)((context->count[(i >= 4 ? 0 : 1)]
          >> ((3-(i & 3)) * 8) ) & 255);  /* Endian independent */
     }
-    SHA1Update(context, (unsigned char *)"\200", 1);
+    I_SHA1Update(context, (unsigned char *)"\200", 1);
     while ((context->count[0] & 504) != 448) {
-        SHA1Update(context, (unsigned char *)"\0", 1);
+        I_SHA1Update(context, (unsigned char *)"\0", 1);
     }
-    SHA1Update(context, finalcount, 8);  /* Should cause a SHA1Transform()
+    I_SHA1Update(context, finalcount, 8);  /* Should cause a SHA1Transform()
 */
     for (i = 0; i < 20; i++) {
         digest[i] = (unsigned char)
index 6a26bec..141d52f 100644 (file)
@@ -110,9 +110,18 @@ typedef struct {
     unsigned char buffer[64];
 } SHA1_CTX;
 
-void SHA1Init(SHA1_CTX* context);
-void SHA1Update(SHA1_CTX* context, unsigned char* data, uint32 len);   /*
+#ifdef __cplusplus
+extern "C" 
+{
+#endif
+
+void I_SHA1Init(SHA1_CTX* context);
+void I_SHA1Update(SHA1_CTX* context, unsigned char* data, uint32 len); /*
 JHB */
-void SHA1Final(unsigned char digest[20], SHA1_CTX* context);
+void I_SHA1Final(unsigned char digest[20], SHA1_CTX* context);
+
+#ifdef __cplusplus
+}
+#endif
 
 #endif   /* _sha1_h_ */
index e8cb037..b8fdd08 100644 (file)
@@ -436,7 +436,7 @@ char LIBNETXMS_EXPORTABLE *GetSystemErrorText(DWORD dwError, char *pszBuffer, in
 // daemon() implementation for systems which doesn't have one
 //
 
-#if !(HAVE_DAEMON)
+#if !(HAVE_DAEMON) && !defined(_NETWARE)
 
 int daemon(int nochdir, int noclose)
 {
index 140a9ae..4368f0a 100644 (file)
@@ -12,16 +12,30 @@ my $inFile = shift || die "Usage : nxmkimp.pl <input_file> <output_file>";
 my $outFile = shift || die "Usage : nxmkimp.pl <input_file> <output_file>";
 
 my $i;
+my $j;
 
 open(OUT, ">$outFile") || die "out: $!";
 
-my @a = `i586-netware-nm $inFile | grep -e " [BGTRD] " | cut -d" " -f3`;
-for ($i = 0; $i < $#a; $i++) 
+my @sym_list = `i586-netware-nm $inFile | grep -e " [BGTRD] " | cut -d" " -f3`;
+my @exp_list;
+
+for ($i = 0, $j = 0; $i <= $#sym_list; $i++) 
+{ 
+       chomp $sym_list[$i]; 
+       if ($sym_list[$i] =~ /^main$|^_init$|^_fini$|^__EH_FRAME.*|^g_.*|^I_.*/)
+       {
+       }
+       else
+       {
+               $exp_list[$j++] = $sym_list[$i];
+       }
+} 
+
+for ($i = 0; $i < $#exp_list; $i++) 
 { 
-       chomp $a[$i]; 
-       print OUT " $a[$i],\n"; 
+       print OUT " $exp_list[$i],\n"; 
 } 
-print OUT " $a[$i]";
+print OUT " $exp_list[$i]\n";
 
 close OUT;
 exit 0;