5178c348d5b68beff83abc32f07783f96e196efc
2 ** NetXMS - Network Management System
3 ** Copyright (C) 2003, 2004, 2005, 2006, 2007 Victor Kirhenshtein
5 ** This program is free software; you can redistribute it and/or modify
6 ** it under the terms of the GNU General Public License as published by
7 ** the Free Software Foundation; either version 2 of the License, or
8 ** (at your option) any later version.
10 ** This program is distributed in the hope that it will be useful,
11 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
12 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 ** GNU General Public License for more details.
15 ** You should have received a copy of the GNU General Public License
16 ** along with this program; if not, write to the Free Software
17 ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 #ifndef _nms_common_h_
24 #define _nms_common_h_
34 // Symbian compiler defines _WIN32 in builds for emulator.
39 #if !defined(_WIN32) && !defined(UNDER_CE)
42 #include <config-netware.h>
46 #define _WITH_ENCRYPTION 1
53 #define _WITH_ENCRYPTION 1
54 #if !defined(WINDOWS_ONLY) && !defined(_CRT_SECURE_NO_DEPRECATE)
55 #define _CRT_SECURE_NO_DEPRECATE
61 #endif /* __SYMBIAN32__ */
73 #include <netxms-version.h>
77 // Define __64BIT__ if compiling for 64bit platform with Visual C++
80 #if defined(_M_X64) || defined(_M_IA64)
88 // Wrappers for 64-bit constants
91 #if defined(__GNUC__) || defined(__HP_aCC)
92 #define _LL(x) (x ## LL)
93 #define _ULL(x) (x ## ULL)
104 #define MAX_SECRET_LENGTH 64
105 #define MAX_DB_STRING 256
106 #define MAX_PARAM_NAME 256
107 #define GROUP_FLAG ((DWORD)0x80000000)
109 #define NETXMS_MAX_CIPHERS 4
110 #define NETXMS_RSA_KEYLEN 2048
113 #define LLONG_MAX _LL(9223372036854775807)
117 #define LLONG_MIN (-LLONG_MAX - 1)
121 #define ULLONG_MAX _ULL(18446744073709551615)
124 #ifndef EVENTLOG_DEBUG_TYPE
125 #define EVENTLOG_DEBUG_TYPE 0x0080
128 #define INVALID_INDEX 0xFFFFFFFF
129 #define MD5_DIGEST_SIZE 16
130 #define SHA1_DIGEST_SIZE 20
134 // Compatibility defines for C sources
143 // Platform dependent includes and defines
146 #if defined(_WIN32) || defined(UNDER_CE)
148 /********** WINDOWS ********************/
152 #define _WIN32_WINNT 0x0500
154 #define _WIN32_WINNT 0x0501
158 #define FS_PATH_SEPARATOR _T("\\")
159 #define FS_PATH_SEPARATOR_CHAR _T('\\')
162 #define HAVE_SCPRINTF 1
163 #define HAVE_VSCPRINTF 1
164 #define HAVE_SCWPRINTF 1
165 #define HAVE_VSCWPRINTF 1
169 #define va_copy(x,y) (x = y)
171 #define HAVE_DECL_VA_COPY 1
173 #include <winsock2.h>
178 #include <sys/stat.h>
186 # define S_IRUSR 0400
189 # define S_IWUSR 0200
192 #define snprintf _snprintf
193 #define vsnprintf _vsnprintf
194 #define snwprintf _snwprintf
195 #define vsnwprintf _vsnwprintf
196 #define scprintf _scprintf
197 #define vscprintf _vscprintf
198 #define scwprintf _scwprintf
199 #define vscwprintf _vscwprintf
201 #define pclose _pclose
202 #define strdup _strdup
203 #define wcsdup _wcsdup
204 #define stricmp _stricmp
205 #define strnicmp _strnicmp
206 #define strupr(s) _strupr(s)
207 #define getpid _getpid
208 #define fileno(f) _fileno(f)
209 #define chdir(p) _chdir(p)
210 #define mkdir(p,m) _mkdir(p,m)
211 #define lseek(f,o,w) _lseek(f,o,w)
212 #define unlink(x) _unlink(x)
214 typedef unsigned __int64 QWORD
;
215 typedef __int64 INT64
;
216 typedef int socklen_t
;
218 typedef LONG ssize_t
;
220 typedef signed __int8
int8_t;
221 typedef signed __int16
int16_t;
222 typedef signed __int32
int32_t;
223 typedef signed __int64
int64_t;
224 typedef unsigned __int8
uint8_t;
225 typedef unsigned __int16
uint16_t;
226 typedef unsigned __int32
uint32_t;
227 typedef unsigned __int64
uint64_t;
229 #define INT64_FMT _T("%I64d")
230 #define UINT64_FMT _T("%I64u")
231 #define UINT64X_FMT(m) _T("%") m _T("I64X")
232 #if defined(__64BIT__) || (_MSC_VER > 1300)
233 #define TIME_T_FMT _T("%I64u")
234 #define TIME_T_FCAST(x) ((QWORD)(x))
236 #define TIME_T_FMT _T("%u")
237 #define TIME_T_FCAST(x) ((DWORD)(x))
240 // Socket compatibility
245 #define SetSocketReuseFlag(sd)
246 #define SELECT_NFDS(x) ((int)(x))
247 #define SetSocketNonBlocking(s) { \
249 ioctlsocket(s, FIONBIO, &one); \
251 #define SetSocketBlocking(s) { \
253 ioctlsocket(s, FIONBIO, &zero); \
257 #define O_RDONLY 0x0004
258 #define O_WRONLY 0x0001
259 #define O_RDWR 0x0002
260 #define O_CREAT 0x0100
261 #define O_EXCL 0x0200
262 #define O_TRUNC 0x0800
265 #if !defined(UNDER_CE)
266 #define HAVE_LIBEXPAT 1
269 #elif defined(_NETWARE)
271 /********** NETWARE ********************/
273 #define FS_PATH_SEPARATOR _T("/")
274 #define FS_PATH_SEPARATOR_CHAR _T('/')
278 #include <sys/types.h>
279 #include <sys/stat.h>
280 #include <sys/socket.h>
281 #include <sys/select.h>
282 #include <netinet/in.h>
283 #include <arpa/inet.h>
292 #if (SIZEOF_LONG == 4)
297 #if (SIZEOF_LONG == 4)
298 typedef unsigned long DWORD
;
300 typedef unsigned int DWORD
;
302 typedef unsigned short WORD
;
303 typedef unsigned char BYTE
;
304 typedef void * HANDLE
;
305 typedef void * HMODULE
;
308 typedef X_INT64_X INT64
;
310 #error Target system does not have signed 64bit integer type
314 typedef X_UINT64_X QWORD
;
316 #error Target system does not have unsigned 64bit integer type
319 #define INT64_FMT _T("%lld")
320 #define UINT64_FMT _T("%llu")
321 #define UINT64X_FMT(m) _T("%") m _T("llX")
322 #define TIME_T_FMT _T("%u")
323 #define TIME_T_FCAST(x) ((DWORD)(x))
329 // Socket compatibility
332 #define closesocket(x) close(x)
333 #define WSAGetLastError() (errno)
335 #define WSAEINTR EINTR
336 #define WSAEWOULDBLOCK EWOULDBLOCK
337 #define WSAEINPROGRESS EINPROGRESS
338 #define INVALID_SOCKET (-1)
340 #define SetSocketReuseFlag(sd) { \
342 setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, (const void *)&nVal, \
343 (socklen_t)sizeof(nVal)); \
346 #define SetSocketNonBlocking(s) { \
347 int f = fcntl(s, F_GETFL); \
348 if (f != -1) fcntl(s, F_SETFL, f | O_NONBLOCK); \
351 #define SELECT_NFDS(x) (x)
353 #elif defined(__SYMBIAN32__)
355 /********** SYMBIAN ********************/
362 #include <sys/types.h>
363 #include <stdlib_r.h>
364 #include <sys/stat.h>
365 #include <netinet/in.h>
367 #define FS_PATH_SEPARATOR _T("\\")
368 #define FS_PATH_SEPARATOR_CHAR _T('\\')
372 typedef TUint32 DWORD
;
373 typedef TUint16 WORD
;
374 typedef unsigned char BYTE
;
375 typedef TInt64 INT64
;
376 typedef TUint64 QWORD
;
378 #define INT64_FMT _T("%lld")
379 #define UINT64_FMT _T("%llu")
380 #define UINT64X_FMT(m) _T("%") m _T("llX")
381 #define TIME_T_FMT _T("%u")
382 #define TIME_T_FCAST(x) ((DWORD)(x))
388 #else /* not _WIN32, _NETWARE, or __SYMBIAN32__ */
390 /*********** UNIX *********************/
393 #define PREFIX "/usr/local"
394 #define PREFIXW L"/usr/local"
395 #warning Installation prefix not defined, defaulting to /usr/local
408 #define FS_PATH_SEPARATOR _T("/")
409 #define FS_PATH_SEPARATOR_CHAR _T('/')
420 #include <sys/types.h>
423 #if HAVE_SYS_INT_TYPES_H
424 #include <sys/int_types.h>
428 #include <sys/stat.h>
431 #if HAVE_SYS_SOCKET_H
432 #include <sys/socket.h>
435 #if HAVE_SYS_SELECT_H
436 #include <sys/select.h>
439 #if HAVE_NETINET_IN_H
440 #include <netinet/in.h>
448 #include <arpa/inet.h>
466 #if (SIZEOF_LONG == 4)
468 typedef unsigned long DWORD
;
472 typedef unsigned int DWORD
;
477 typedef unsigned short WORD
;
478 typedef unsigned char BYTE
;
479 typedef void * HANDLE
;
480 typedef void * HMODULE
;
486 #if HAVE_LONG_LONG && (SIZEOF_LONG_LONG == 8)
487 typedef long long INT64
;
489 typedef int64_t INT64
;
491 #error Target system does not have signed 64bit integer type
494 #if HAVE_UNSIGNED_LONG_LONG && (SIZEOF_LONG_LONG == 8)
495 typedef unsigned long long QWORD
;
497 typedef uint64_t QWORD
;
499 typedef u_int64_t QWORD
;
501 #error Target system does not have unsigned 64bit integer type
504 #define INT64_FMT _T("%lld")
505 #define UINT64_FMT _T("%llu")
506 #define UINT64X_FMT(m) _T("%") m _T("llX")
508 #define TIME_T_FMT _T("%llu")
509 #define TIME_T_FCAST(x) ((QWORD)(x))
511 #define TIME_T_FMT _T("%u")
512 #define TIME_T_FCAST(x) ((DWORD)(x))
526 // Socket compatibility
529 #define closesocket(x) close(x)
530 #define WSAGetLastError() (errno)
532 #define WSAEINTR EINTR
533 #define WSAEWOULDBLOCK EWOULDBLOCK
534 #define WSAEINPROGRESS EINPROGRESS
535 #define INVALID_SOCKET (-1)
537 #define SetSocketReuseFlag(sd) { \
539 setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, (const void *)&nVal, \
540 (socklen_t)sizeof(nVal)); \
543 #define SetSocketNonBlocking(s) { \
544 int f = fcntl(s, F_GETFL); \
545 if (f != -1) fcntl(s, F_SETFL, f | O_NONBLOCK); \
548 #define SELECT_NFDS(x) (x)
550 #if !(HAVE_SOCKLEN_T) && !defined(_USE_GNU_PTH)
551 typedef unsigned int socklen_t
;
554 // Shared library suffix
556 #if defined(_HPUX) && !defined(__64BIT__)
557 #define SHL_SUFFIX ".sl"
559 #define SHL_SUFFIX ".so"
563 typedef struct hostent HOSTENT
;
565 #if HAVE_DECL___VA_COPY && !HAVE_DECL_VA_COPY
566 #define HAVE_DECL_VA_COPY 1
567 #define va_copy(d,s) __va_copy(d,s)
574 // Value used to indicate invalid pointer where NULL is not appropriate
578 #define INVALID_POINTER_VALUE ((void *)_ULL(0xFFFFFFFFFFFFFFFF))
580 #define INVALID_POINTER_VALUE ((void *)0xFFFFFFFF)
585 // Casting between pointer and 32-bit integer
589 #define CAST_FROM_POINTER(p, t) ((t)((QWORD)(p)))
590 #define CAST_TO_POINTER(v, t) ((t)((QWORD)(v)))
592 #define CAST_FROM_POINTER(p, t) ((t)(p))
593 #define CAST_TO_POINTER(v, t) ((t)(v))
601 #ifdef _WITH_ENCRYPTION
603 #include <openssl/crypto.h>
604 #include <openssl/rsa.h>
605 #include <openssl/pem.h>
606 #include <openssl/evp.h>
607 #include <openssl/rand.h>
608 #include <openssl/opensslv.h>
609 #include <openssl/err.h>
612 #ifndef OPENSSL_NO_AES
613 #define OPENSSL_NO_AES
618 #ifndef OPENSSL_NO_BF
619 #define OPENSSL_NO_BF
623 #ifdef NETXMS_NO_IDEA
624 #ifndef OPENSSL_NO_IDEA
625 #define OPENSSL_NO_IDEA
630 #ifndef OPENSSL_NO_DES
631 #define OPENSSL_NO_DES
635 #if OPENSSL_VERSION_NUMBER >= 0x00907000
636 #define OPENSSL_CONST const
638 #define OPENSSL_CONST
643 // Prevent compilation errors on function prototypes
650 // open() flags compatibility
659 // Windows-specific structures for non-Windows platforms
664 typedef struct tagPOINT
674 // Event log severity codes (UNIX only)
678 #define EVENTLOG_SUCCESS 0x0000
679 #define EVENTLOG_ERROR_TYPE 0x0001
680 #define EVENTLOG_WARNING_TYPE 0x0002
681 #define EVENTLOG_INFORMATION_TYPE 0x0004
682 #define EVENTLOG_AUDIT_SUCCESS 0x0008
683 #define EVENTLOG_AUDIT_FAILURE 0x0010
691 #define IFTYPE_OTHER 1
692 #define IFTYPE_REGULAR1822 2
693 #define IFTYPE_HDH1822 3
694 #define IFTYPE_DDN_X25 4
695 #define IFTYPE_RFC877_X25 5
696 #define IFTYPE_ETHERNET_CSMACD 6
697 #define IFTYPE_ISO88023_CSMACD 7
698 #define IFTYPE_ISO88024_TOKENBUS 8
699 #define IFTYPE_ISO88025_TOKENRING 9
700 #define IFTYPE_ISO88026_MAN 10
701 #define IFTYPE_STARLAN 11
702 #define IFTYPE_PROTEON_10MBIT 12
703 #define IFTYPE_PROTEON_80MBIT 13
704 #define IFTYPE_HYPERCHANNEL 14
705 #define IFTYPE_FDDI 15
706 #define IFTYPE_LAPB 16
707 #define IFTYPE_SDLC 17
708 #define IFTYPE_DS1 18
710 #define IFTYPE_BASIC_ISDN 20
711 #define IFTYPE_PRIMARY_ISDN 21
712 #define IFTYPE_PROP_PTP_SERIAL 22
713 #define IFTYPE_PPP 23
714 #define IFTYPE_SOFTWARE_LOOPBACK 24
715 #define IFTYPE_EON 25
716 #define IFTYPE_ETHERNET_3MBIT 26
717 #define IFTYPE_NSIP 27
718 #define IFTYPE_SLIP 28
719 #define IFTYPE_ULTRA 29
720 #define IFTYPE_DS3 30
721 #define IFTYPE_SMDS 31
722 #define IFTYPE_FRAME_RELAY 32
723 #define IFTYPE_RS232 33
724 #define IFTYPE_PARA 34
725 #define IFTYPE_ARCNET 35
726 #define IFTYPE_ARCNET_PLUS 36
727 #define IFTYPE_ATM 37
728 #define IFTYPE_MIOX25 38
729 #define IFTYPE_SONET 39
730 #define IFTYPE_X25PLE 40
731 #define IFTYPE_ISO88022LLC 41
732 #define IFTYPE_LOCALTALK 42
733 #define IFTYPE_SMDS_DXI 43
734 #define IFTYPE_FRAME_RELAY_SERVICE 44
735 #define IFTYPE_V35 45
736 #define IFTYPE_HSSI 46
737 #define IFTYPE_HIPPI 47
738 #define IFTYPE_MODEM 48
739 #define IFTYPE_AAL5 49
740 #define IFTYPE_SONET_PATH 50
741 #define IFTYPE_SONET_VT 51
742 #define IFTYPE_SMDS_ICIP 52
743 #define IFTYPE_PROP_VIRTUAL 53
744 #define IFTYPE_PROP_MULTIPLEXOR 54
745 #define IFTYPE_IEEE80212 55
746 #define IFTYPE_FIBRECHANNEL 56
748 #define IFTYPE_NETXMS_NAT_ADAPTER 65535
752 // IP Header -- RFC 791
755 typedef struct tagIPHDR
757 BYTE m_cVIHL
; // Version and IHL
758 BYTE m_cTOS
; // Type Of Service
759 WORD m_wLen
; // Total Length
760 WORD m_wId
; // Identification
761 WORD m_wFlagOff
; // Flags and Fragment Offset
762 BYTE m_cTTL
; // Time To Live
763 BYTE m_cProtocol
; // Protocol
764 WORD m_wChecksum
; // Checksum
765 struct in_addr m_iaSrc
; // Internet Address - Source
766 struct in_addr m_iaDst
; // Internet Address - Destination
771 // ICMP Header - RFC 792
774 typedef struct tagICMPHDR
776 BYTE m_cType
; // Type
777 BYTE m_cCode
; // Code
778 WORD m_wChecksum
; // Checksum
779 WORD m_wId
; // Identification
780 WORD m_wSeq
; // Sequence
781 char m_cData
[4]; // Data
786 // INADDR_NONE can be undefined on some systems
790 #define INADDR_NONE (0xFFFFFFFF)
795 // Check if IP address is a broadcast
798 #define IsBroadcastAddress(addr, mask) (((addr) & (~(mask))) == (~(mask)))
802 // Check if given string is NULL and always return valid pointer
805 #define CHECK_NULL(x) ((x) == NULL ? ((TCHAR *)_T("(null)")) : (x))
806 #define CHECK_NULL_A(x) ((x) == NULL ? ((char *)"(null)") : (x))
807 #define CHECK_NULL_EX(x) ((x) == NULL ? ((TCHAR *)_T("")) : (x))
808 #define CHECK_NULL_EX_A(x) ((x) == NULL ? ((char *)"") : (x))
812 // Free memory block if it isn't NULL
815 #define safe_free(x) { if ((x) != NULL) free(x); }
816 #define safe_free_and_null(x) { if ((x) != NULL) { free(x); x = NULL; } }
820 // delete object and nullify pointer
823 #define delete_and_null(x) { delete x; x = NULL; }
824 #define safe_delete_and_null(x) { if ((x) != NULL) { delete x; x = NULL; } }
828 // Convert half-byte's value to hex digit and vice versa
831 #define bin2hex(x) ((x) < 10 ? ((x) + _T('0')) : ((x) + (_T('A') - 10)))
833 #define hex2bin(x) ((((x) >= _T('0')) && ((x) <= _T('9'))) ? ((x) - _T('0')) : \
834 (((towupper(x) >= _T('A')) && (towupper(x) <= _T('F'))) ? (towupper(x) - _T('A') + 10) : 0))
836 #define hex2bin(x) ((((x) >= '0') && ((x) <= '9')) ? ((x) - '0') : \
837 (((toupper(x) >= 'A') && (toupper(x) <= 'F')) ? (toupper(x) - 'A' + 10) : 0))
842 // Define min() and max() if needed
846 #define min(a, b) ((a) < (b) ? (a) : (b))
849 #define max(a, b) ((a) > (b) ? (a) : (b))
854 // Define stricmp() for non-windows
858 #define stricmp strcasecmp
859 #define strnicmp strncasecmp
860 #define wcsicmp wcscasecmp
861 #define wcsnicmp wcsncasecmp
866 // Compare two numbers and return -1, 0, or 1
869 #define COMPARE_NUMBERS(n1,n2) (((n1) < (n2)) ? -1 : (((n1) > (n2)) ? 1 : 0))
873 // Increment pointer for given number of bytes
876 #define inc_ptr(ptr, step, ptype) ptr = (ptype *)(((char *)ptr) + step)
880 // Validate numerical value
883 #define VALIDATE_VALUE(var,x,y,z) { if ((var < x) || (var > y)) var = z; }
887 // DCI (data collection item) data types
891 #define DCI_DT_UINT 1
892 #define DCI_DT_INT64 2
893 #define DCI_DT_UINT64 3
894 #define DCI_DT_STRING 4
895 #define DCI_DT_FLOAT 5
896 #define DCI_DT_NULL 6
897 #define DCI_DT_DEPRECATED 255 /* used internally by agent */
901 // Insert parameter as string
905 #define STRING(x) L#x
915 #ifdef NETXMS_MEMORY_DEBUG
921 void *nx_malloc(size_t, char *, int);
922 void *nx_realloc(void *, size_t, char *, int);
923 void nx_free(void *, char *, int);
925 void InitMemoryDebugger(void);
926 void PrintMemoryBlocks(void);
932 #define malloc(x) nx_malloc(x, __FILE__, __LINE__)
933 #define realloc(p, x) nx_realloc(p, x, __FILE__, __LINE__)
934 #define free(p) nx_free(p, __FILE__, __LINE__)
936 #endif /* NETXMS_MEMORY_DEBUG */
938 #endif /* _nms_common_h_ */