Implemented rear view for racks. Fixes #NX-1142
[public/netxms.git] / include / nms_common.h
CommitLineData
08f16c05 1/*
7ac71e60 2** NetXMS - Network Management System
120bfcdf 3** Copyright (C) 2003-2014 Victor Kirhenshtein
cbcaf8c8
VK
4**
5** This program is free software; you can redistribute it and/or modify
68f384ea
VK
6** it under the terms of the GNU Lesser General Public License as published by
7** the Free Software Foundation; either version 3 of the License, or
cbcaf8c8
VK
8** (at your option) any later version.
9**
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.
14**
68f384ea 15** You should have received a copy of the GNU Lesser General Public License
cbcaf8c8
VK
16** along with this program; if not, write to the Free Software
17** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18**
28c329e2 19** File: nms_common.h
cbcaf8c8
VK
20**
21**/
22
23#ifndef _nms_common_h_
24#define _nms_common_h_
25
a1cb335b
VK
26#ifdef WIN32
27#ifndef _WIN32
28#define _WIN32
29#endif
30#endif
31
b40371d4 32#if !defined(_WIN32) && !defined(UNDER_CE)
e647245b 33
f62b7eab 34#include <config.h>
9c3bf7f4 35#if defined(WITH_OPENSSL) || defined(WITH_COMMONCRYPTO)
779c2678
VK
36#define _WITH_ENCRYPTION 1
37#endif
e647245b 38
15cf5acc 39#else /* _WIN32 */
e647245b 40
2c12edfc 41#ifndef UNDER_CE
15cf5acc 42#define _WITH_ENCRYPTION 1
3c15eedb 43#define WITH_OPENSSL 1
6c352bb5 44#define WITH_LDAP 1
f00612ba 45#if !defined(WINDOWS_ONLY) && !defined(_CRT_SECURE_NO_DEPRECATE)
be460d82 46#define _CRT_SECURE_NO_DEPRECATE
2c12edfc 47#endif
f00612ba 48#endif
e647245b 49
879855b3
VK
50// prevent defining min and max macros in Windows headers
51#ifndef NOMINMAX
52#define NOMINMAX
53#endif
54
f5fb7a0f 55// prevent defining ETIMEDOUT, ECONNRESET, etc. to wrong values
c13733bd 56#ifndef ALLOW_CRT_POSIX_ERROR_CODES
f5fb7a0f 57#define _CRT_NO_POSIX_ERROR_CODES
c13733bd 58#endif
f5fb7a0f 59
82b4c558 60#endif /* _WIN32 */
e647245b 61
f92a016a
VK
62#if HAVE_JEMALLOC_JEMALLOC_H
63#include <jemalloc/jemalloc.h>
64#endif
65
6b42b6f1 66#ifdef HAVE_STDARG_H
e647245b 67#include <stdarg.h>
6b42b6f1
AK
68#endif
69
f2fdf1b5 70#include <unicode.h>
e647245b 71
f2fdf1b5
VK
72#include <stdio.h>
73#include <string.h>
b50f1100 74#include <limits.h>
93b18807 75
b900a78b 76#include <netxms-version.h>
8606bcf9 77
5a82ecc7 78#if HAVE_WIDEC_H
5c0258d5 79#include <widec.h>
82b4c558 80#endif /* HAVE_WIDEC */
9068a8c6 81
bde67a1f
VK
82/**
83 * Define __64BIT__ if compiling for 64bit platform with Visual C++
84 */
c3561262 85#if defined(_M_X64) || defined(_M_IA64) || defined(__LP64__) || defined(__PPC64__) || defined(__x86_64__)
a731ec52
VK
86#ifndef __64BIT__
87#define __64BIT__
88#endif
89#endif
90
0cdf79a3
VK
91/**
92 * Wrappers for 64-bit integer constants
93 */
3a5657b9 94#if defined(__GNUC__) || defined(__HP_aCC) || defined(__IBMC__) || defined(__IBMCPP__) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
c61f5190
VK
95#define _LL(x) (x ## LL)
96#define _ULL(x) (x ## ULL)
7946bd7c
VK
97#elif defined(_MSC_VER)
98#define _LL(x) (x ## i64)
99#define _ULL(x) (x ## ui64)
c61f5190
VK
100#else
101#define _LL(x) (x)
102#define _ULL(x) (x)
103#endif
104
480e036b
VK
105/**
106 * Common constants
107 */
fb52d37d 108#define MAX_SECRET_LENGTH 64
a7d07192 109#define MAX_DB_STRING 256
999812c7 110#define MAX_PARAM_NAME 256
2589cc10 111#define MAX_CONFIG_VALUE 2000
cc8ce218 112#define MAX_COLUMN_NAME 64
5ad2167d 113#define MAX_DNS_NAME 256
d41268ba 114#define MAX_HELPDESK_REF_LEN 64
f33d5471 115#define MAX_PASSWORD 256
241541f4
VK
116#define MAX_SSH_LOGIN_LEN 64
117#define MAX_SSH_PASSWORD_LEN 64
967893bb 118#define GROUP_FLAG ((UINT32)0x80000000)
e44ac467 119
d772d0dd 120#define NETXMS_MAX_CIPHERS 6
15cf5acc 121#define NETXMS_RSA_KEYLEN 2048
fb52d37d 122
b50f1100 123#ifndef LLONG_MAX
c61f5190 124#define LLONG_MAX _LL(9223372036854775807)
b50f1100
VK
125#endif
126
127#ifndef LLONG_MIN
128#define LLONG_MIN (-LLONG_MAX - 1)
129#endif
130
131#ifndef ULLONG_MAX
c61f5190 132#define ULLONG_MAX _ULL(18446744073709551615)
b50f1100
VK
133#endif
134
05f256fe 135#ifndef EVENTLOG_DEBUG_TYPE
ccc34207
VK
136#define EVENTLOG_DEBUG_TYPE 0x0080
137#endif
138
e647245b
VK
139#define INVALID_INDEX 0xFFFFFFFF
140#define MD5_DIGEST_SIZE 16
141#define SHA1_DIGEST_SIZE 20
1718cc2a 142#define SHA256_DIGEST_SIZE 32
e647245b 143
9fa031cd 144#define FILE_BUFFER_SIZE 32768
145
664b42a4
VK
146/**
147 * Compatibility defines for C sources
148 */
07a7e06b 149#if !defined(__cplusplus) && !defined(CORTEX) && !HAVE_BOOL
ccc34207 150typedef int bool;
05f256fe
VK
151#endif
152
bde67a1f
VK
153/**
154 * Oracle Pro*C compatibility
155 */
909c0624 156#ifdef ORA_PROC
bde67a1f 157#undef BYTE
50456b1f 158#undef DWORD
bde67a1f
VK
159#endif
160
1de39d9e
VK
161/**
162 * Java class path separator character
163 */
164#ifdef _WIN32
165#define JAVA_CLASSPATH_SEPARATOR _T(';')
166#else
167#define JAVA_CLASSPATH_SEPARATOR _T(':')
168#endif
169
fb52d37d 170
bde67a1f 171/***** Platform dependent includes and defines *****/
fb52d37d 172
018fda4d 173#if defined(_WIN32) || defined(UNDER_CE)
076a55c4
VK
174
175/********** WINDOWS ********************/
e9246d26 176
96772780
VK
177#ifdef _MSC_FULL_VER
178#define __BUILD_VERSION_STRING(s,v) s v
179#define __STR_NX(x) #x
180#define __STR(x) __STR_NX(x)
181#define CPP_COMPILER_VERSION __STR(__BUILD_VERSION_STRING(Microsoft C/C++ Optimizing Compiler Version,_MSC_FULL_VER))
182#endif
183
6cfdadf2
VK
184#define _Noreturn __declspec(noreturn)
185
f5fb7a0f
VK
186// Disable some warnings:
187// 4577 - 'noexcept' used with no exception handling mode specified
188#pragma warning(disable: 4577)
189
e17fe9ab 190#ifndef _WIN32_WINNT
e4590ef2 191#define _WIN32_WINNT 0x0501
e17fe9ab 192#endif
f33479c8 193
36e44abe
VK
194#define WITH_IPV6 1
195
807c0ccc 196#define USE_BUNDLED_LIBTRE 1
df9812a9 197#define USE_BUNDLED_GETOPT 1
807c0ccc 198
3bf0df9f
VK
199#define SAFE_FGETWS_WITH_POPEN 1
200
c35aa503
VK
201#define FREE_IS_NULL_SAFE 1
202
c6491611 203#define FS_PATH_SEPARATOR _T("\\")
b07c50cc
VK
204#define FS_PATH_SEPARATOR_A "\\"
205#define FS_PATH_SEPARATOR_W L"\\"
c6491611
VK
206#define FS_PATH_SEPARATOR_CHAR _T('\\')
207
b79e8fed
VK
208#define WEXITSTATUS(x) (x)
209
a9bad162 210#if _MSC_VER >= 1310
c6491611
VK
211#define HAVE_SCPRINTF 1
212#define HAVE_VSCPRINTF 1
213#define HAVE_SCWPRINTF 1
214#define HAVE_VSCWPRINTF 1
2385d5d0 215#endif
f70fc197 216
a9bad162
VK
217#if _MSC_VER >= 1800
218#define HAVE_STRTOLL 1
219#define HAVE_STRTOULL 1
220#define HAVE_WCSTOLL 1
221#define HAVE_WCSTOULL 1
222#endif
223
342a701d
VK
224#define HAVE_SNPRINTF 1
225#define HAVE_VSNPRINTF 1
226
ecdf8898
VK
227#define HAVE_GETADDRINFO 1
228
d63aad11
VK
229#define HAVE_STDARG_H 1
230
8d4bb054
VK
231#define HAVE_ALLOCA 1
232
7768852d
VK
233#define HAVE_WCSLEN 1
234#define HAVE_WCSNCPY 1
669fcb92 235#define HAVE_WCSDUP 1
7b45b90d 236#define HAVE_WUTIME 1
7768852d 237
74540dab
VK
238#define HAVE_LIBCURL 1
239
c7850580
VK
240#define HAVE_DIRENT_D_TYPE 1
241
9caddb3c 242#include <winsock2.h>
510dd9c4 243#include <windows.h>
36e44abe 244#include <ws2tcpip.h>
d454fb4c 245#include <stdlib.h>
1ddf3f0c 246#include <malloc.h>
1dd2715c 247
a9bad162
VK
248#include <stdarg.h>
249#ifndef va_copy
250#define va_copy(x,y) (x = y)
251#endif
252#define HAVE_DECL_VA_COPY 1
253
018fda4d 254#ifndef UNDER_CE
a8d4cdee 255#include <sys/stat.h>
7b45b90d 256#include <sys/utime.h>
a8d4cdee 257#include <process.h>
1dd2715c 258#include <io.h>
3d1cb7d6 259#include <fcntl.h>
a23d8e0d 260#include <direct.h>
018fda4d 261#endif
91ab8f0a 262
37d62364
AK
263#ifndef S_IRUSR
264# define S_IRUSR 0400
265#endif
266#ifndef S_IWUSR
267# define S_IWUSR 0200
268#endif
1dd2715c 269
34576b56
VK
270#define snprintf _snprintf
271#define vsnprintf _vsnprintf
f83a0c3a
VK
272#define snwprintf _snwprintf
273#define vsnwprintf _vsnwprintf
c6491611
VK
274#define scprintf _scprintf
275#define vscprintf _vscprintf
276#define scwprintf _scwprintf
277#define vscwprintf _vscwprintf
34576b56
VK
278#define popen _popen
279#define pclose _pclose
34576b56
VK
280#define stricmp _stricmp
281#define strnicmp _strnicmp
c90ea787
VK
282#define wcsicmp _wcsicmp
283#define wcsnicmp _wcsnicmp
3da622d4 284#define strlwr(s) _strlwr(s)
34576b56 285#define strupr(s) _strupr(s)
70af47c2 286#define putenv(s) _putenv(s)
34576b56
VK
287#define fileno(f) _fileno(f)
288#define chdir(p) _chdir(p)
289#define mkdir(p,m) _mkdir(p,m)
ccc34207 290#define lseek(f,o,w) _lseek(f,o,w)
34576b56 291#define unlink(x) _unlink(x)
d4c266b6 292
967893bb 293typedef UINT64 QWORD; // for compatibility
670c7f3d 294typedef int socklen_t;
1edb2dab 295typedef long pid_t;
734e79a8
VK
296typedef LONG ssize_t;
297
298typedef signed __int8 int8_t;
299typedef signed __int16 int16_t;
300typedef signed __int32 int32_t;
301typedef signed __int64 int64_t;
302typedef unsigned __int8 uint8_t;
303typedef unsigned __int16 uint16_t;
304typedef unsigned __int32 uint32_t;
08f16c05 305typedef unsigned __int64 uint64_t;
e9246d26 306
8b1fedb2 307#define INT64_FMT _T("%I64d")
dda7c270 308#define INT64_FMTA "%I64d"
511bea22 309#define INT64_FMTW L"%I64d"
8b1fedb2 310#define UINT64_FMT _T("%I64u")
dda7c270 311#define UINT64_FMTA "%I64u"
511bea22 312#define UINT64_FMTW L"%I64u"
8b1fedb2 313#define UINT64X_FMT(m) _T("%") m _T("I64X")
0b514e86 314#if defined(__64BIT__) || (_MSC_VER > 1300)
34576b56 315#define TIME_T_FMT _T("%I64u")
967893bb 316#define TIME_T_FCAST(x) ((UINT64)(x))
1094818a 317#else
34576b56 318#define TIME_T_FMT _T("%u")
967893bb 319#define TIME_T_FCAST(x) ((UINT32)(x))
1094818a 320#endif
cb53cb15 321
64a055a2
VK
322#ifndef __clang__
323
3c15eedb
VK
324#define HAVE_DECL_BSWAP_16 1
325#define HAVE_DECL_BSWAP_32 1
326#define HAVE_DECL_BSWAP_64 1
327
98a314d9
VK
328#define bswap_16(n) _byteswap_ushort(n)
329#define bswap_32(n) _byteswap_ulong(n)
330#define bswap_64(n) _byteswap_uint64(n)
3c15eedb 331
64a055a2
VK
332#endif
333
8f7e2482
VK
334// Socket compatibility
335#define SHUT_RD 0
336#define SHUT_WR 1
337#define SHUT_RDWR 2
338
1ddf3f0c
VK
339#define SetSocketReuseFlag(s) { \
340 BOOL val = TRUE; \
341 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&val, sizeof(BOOL)); \
342}
343#define SetSocketExclusiveAddrUse(s) { \
344 BOOL val = TRUE; \
345 setsockopt(s, SOL_SOCKET, SO_EXCLUSIVEADDRUSE, (char *)&val, sizeof(BOOL)); \
346}
a3c76aba 347#define SELECT_NFDS(x) ((int)(x))
19121a38
VK
348#define SetSocketNonBlocking(s) { \
349 u_long one = 1; \
350 ioctlsocket(s, FIONBIO, &one); \
351}
734e79a8
VK
352#define SetSocketBlocking(s) { \
353 u_long zero = 0; \
354 ioctlsocket(s, FIONBIO, &zero); \
355}
4a36d30c
VK
356#define SetSocketNoDelay(s) { \
357 BOOL val = TRUE; \
358 setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char *)&val, sizeof(BOOL)); \
359}
08f16c05 360#define SetSocketBroadcast(s) { \
361 BOOL val = TRUE; \
362 setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char *)&val, sizeof(BOOL)); \
363}
be45f318 364
55b33d4c
VK
365#ifdef UNDER_CE
366#define O_RDONLY 0x0004
367#define O_WRONLY 0x0001
368#define O_RDWR 0x0002
369#define O_CREAT 0x0100
370#define O_EXCL 0x0200
371#define O_TRUNC 0x0800
372#endif
373
3973f74b 374#if !defined(UNDER_CE)
c1099678 375#define HAVE_LIBEXPAT 1
1bb6b449
VK
376#endif
377
058bf6fc
VK
378#define XMPP_SUPPORTED 1
379
c1099678
VK
380#define HAVE_LOCALE_H 1
381#define HAVE_SETLOCALE 1
382
8ff13508
VK
383// Use Win32 API instead of msvcrt for memory allocation
384#ifdef USE_WIN32_HEAP
385
386#define malloc(n) HeapAlloc(GetProcessHeap(), 0, n)
387#define realloc(p, n) (((p) == NULL) ? HeapAlloc(GetProcessHeap(), 0, n) : HeapReAlloc(GetProcessHeap(), 0, p, n))
388#define free(p) HeapFree(GetProcessHeap(), 0, p)
a65409fe 389#define _tcsdup(s) nx__tcsdup(s)
8ff13508
VK
390#define wcsdup(s) nx_wcsdup(s)
391
392#undef _tcsdup
393#ifdef UNICODE
394#define _tcsdup nx_wcsdup
395#else
396#define _tcsdup nx_strdup
397#endif
398
399#else
400
401#define strdup _strdup
402#define wcsdup _wcsdup
403
404#endif
405
82b4c558 406#else /* not _WIN32 */
076a55c4
VK
407
408/*********** UNIX *********************/
cbcaf8c8 409
28c329e2 410#ifndef PREFIX
124528cc
VK
411#ifdef UNICODE
412#define PREFIX L"/usr/local"
413#else
28c329e2 414#define PREFIX "/usr/local"
124528cc 415#endif
28c329e2
VK
416#warning Installation prefix not defined, defaulting to /usr/local
417#endif
418
5456cd6d
VK
419#if HAVE_STDBOOL_H
420#include <stdbool.h>
421#endif
422
ccfe2ba0
VK
423#if HAVE_ALLOCA_H
424#include <alloca.h>
425#endif
426
3e39fcde
VK
427#if HAVE_WCHAR_H
428#include <wchar.h>
429#endif
3e39fcde 430
8b86c5dc
VK
431#if HAVE_WCTYPE_H
432#include <wctype.h>
433#endif
434
e2e3ce85
VK
435// Fix for wcs* functions visibility in Solaris 11
436#if defined(__sun) && (__cplusplus >= 199711L)
437#if HAVE_WCSDUP
438using std::wcsdup;
439#endif
440#if HAVE_WCSCASECMP
441using std::wcscasecmp;
442#endif
443#if HAVE_WCSNCASECMP
444using std::wcsncasecmp;
445#endif
446#endif
447
5bdbe3df
VK
448#include <errno.h>
449
636da5f3 450#define FS_PATH_SEPARATOR _T("/")
b07c50cc
VK
451#define FS_PATH_SEPARATOR_A "/"
452#define FS_PATH_SEPARATOR_W L"/"
636da5f3 453#define FS_PATH_SEPARATOR_CHAR _T('/')
f70fc197 454
e31784c0 455#if HAVE_UNISTD_H
62d8cc27 456#include <unistd.h>
e31784c0
VK
457#endif
458
459#if HAVE_STDLIB_H
62d8cc27 460#include <stdlib.h>
e31784c0
VK
461#endif
462
463#if HAVE_SYS_TYPES_H
7e679c4b 464#include <sys/types.h>
e31784c0
VK
465#endif
466
7b45b90d 467#if HAVE_UTIME_H
468#include <utime.h>
469#endif
470
521d90e7
VK
471#if HAVE_SYS_INT_TYPES_H
472#include <sys/int_types.h>
473#endif
474
cc4c6659
VK
475#if HAVE_SYS_STAT_H
476#include <sys/stat.h>
477#endif
478
e31784c0 479#if HAVE_SYS_SOCKET_H
62d8cc27 480#include <sys/socket.h>
e31784c0
VK
481#endif
482
483#if HAVE_SYS_SELECT_H
62d8cc27 484#include <sys/select.h>
e31784c0
VK
485#endif
486
487#if HAVE_NETINET_IN_H
7e679c4b 488#include <netinet/in.h>
e31784c0
VK
489#endif
490
e9c8eb1d
VK
491#if HAVE_NETINET_TCP_H
492#include <netinet/tcp.h>
493#endif
494
ca6ad6bb
VK
495#if HAVE_NET_NH_H
496#include <net/nh.h>
497#endif
498
e31784c0 499#if HAVE_ARPA_INET_H
62d8cc27 500#include <arpa/inet.h>
e31784c0
VK
501#endif
502
503#if HAVE_NETDB_H
93e601e5 504#include <netdb.h>
e31784c0 505#endif
7e679c4b 506
cc4c6659 507#if HAVE_FCNTL_H
4507063f 508#include <fcntl.h>
cc4c6659
VK
509#endif
510
511#include <dirent.h>
d6a35a77 512
cd4c8ca3
VK
513#if _USE_GNU_PTH
514#include <pth.h>
0c78603d
VK
515#else
516#include <pthread.h>
cd4c8ca3
VK
517#endif
518
efdaffe4
VK
519#ifdef __IBMCPP__
520#include <builtins.h>
521#endif
522
ef8a3c32
VK
523#ifdef __minix
524#undef HAVE_ITOA /* Minix has non-compatible itoa() */
525#undef HAVE_GETHOSTBYNAME2_R
526#endif
527
0f8cd7ae
VK
528#include <sys/socket.h>
529#include <sys/un.h>
530
eefe7d68 531typedef int BOOL;
678de2bc 532#if (SIZEOF_LONG == 4)
efdaffe4
VK
533#if (SIZEOF_INT == 4)
534typedef int INT32;
535typedef unsigned int UINT32;
536#else
967893bb
VK
537typedef long INT32;
538typedef unsigned long UINT32;
efdaffe4 539#endif
3c3d2729 540#undef __64BIT__
678de2bc 541#else
967893bb
VK
542typedef int INT32;
543typedef unsigned int UINT32;
3c3d2729
VK
544#ifndef __64BIT__
545#define __64BIT__
546#endif
678de2bc 547#endif
967893bb
VK
548typedef unsigned short UINT16;
549typedef short INT16;
cbcaf8c8 550typedef unsigned char BYTE;
967893bb 551typedef INT32 LONG; // for compatibility
50456b1f 552typedef UINT32 DWORD; // for compatibility
967893bb 553typedef UINT16 WORD; // for compatibility
cbcaf8c8 554typedef void * HANDLE;
3cf35ea6 555typedef void * HMODULE;
521d90e7 556
8b86c5dc
VK
557#if !HAVE_MODE_T
558typedef int mode_t;
559#endif
560
628013e1
VK
561// We have to use long as INT64 on HP-UX - otherwise
562// there will be compilation errors because of type redefinition in
563// system includes
564#ifdef _HPUX
565
566#ifdef __LP64__
567typedef long INT64;
568typedef unsigned long UINT64;
569#else
570typedef long long INT64;
571typedef unsigned long long UINT64;
572#endif
573
574#else /* _HPUX */
575
6e383343 576#if HAVE_LONG_LONG && (SIZEOF_LONG_LONG == 8)
51128b42
VK
577typedef long long INT64;
578#elif HAVE_INT64_T
7e679c4b 579typedef int64_t INT64;
6e383343
VK
580#elif SIZEOF_LONG == 8
581typedef long INT64;
521d90e7
VK
582#else
583#error Target system does not have signed 64bit integer type
584#endif
585
6e383343 586#if HAVE_UNSIGNED_LONG_LONG && (SIZEOF_LONG_LONG == 8)
967893bb 587typedef unsigned long long UINT64;
51128b42 588#elif HAVE_UINT64_T
967893bb 589typedef uint64_t UINT64;
521d90e7 590#elif HAVE_U_INT64_T
967893bb 591typedef u_int64_t UINT64;
6e383343
VK
592#elif SIZEOF_LONG == 8
593typedef unsigned long UINT64;
521d90e7
VK
594#else
595#error Target system does not have unsigned 64bit integer type
596#endif
628013e1
VK
597
598#endif /* _HPUX */
599
967893bb 600typedef UINT64 QWORD; // for compatibility
7e679c4b 601
8b1fedb2 602#define INT64_FMT _T("%lld")
dda7c270
VK
603#define INT64_FMTW L"%lld"
604#define INT64_FMTA "%lld"
8b1fedb2 605#define UINT64_FMT _T("%llu")
dda7c270
VK
606#define UINT64_FMTW L"%llu"
607#define UINT64_FMTA "%llu"
8b1fedb2 608#define UINT64X_FMT(m) _T("%") m _T("llX")
1094818a 609#ifdef __64BIT__
8b1fedb2 610#define TIME_T_FMT _T("%llu")
967893bb 611#define TIME_T_FCAST(x) ((UINT64)(x))
1094818a 612#else
8b1fedb2 613#define TIME_T_FMT _T("%u")
967893bb 614#define TIME_T_FCAST(x) ((UINT32)(x))
1094818a 615#endif
cbcaf8c8 616
cd4c8ca3 617#ifndef TRUE
cbcaf8c8 618#define TRUE 1
cd4c8ca3
VK
619#endif
620#ifndef FALSE
cbcaf8c8 621#define FALSE 0
cd4c8ca3 622#endif
cbcaf8c8 623
efc49272
VK
624// Some systems may define true and false which may break overloaded functions
625#ifdef __cplusplus
626#undef true
627#undef false
628#endif
629
a5de3def 630#ifndef MAX_PATH
120bfcdf
VK
631#ifdef PATH_MAX
632#define MAX_PATH PATH_MAX
633#else
634#define MAX_PATH 1024
635#endif
a5de3def
VK
636#endif
637
c90ea787
VK
638// Windows compatibility layer for standard C I/O functions
639#ifdef __cplusplus
640
641inline int _access(const char *pathname, int mode) { return ::access(pathname, mode); }
642inline int _open(const char *pathname, int flags) { return ::open(pathname, flags); }
643inline int _open(const char *pathname, int flags, mode_t mode) { return ::open(pathname, flags, mode); }
644inline ssize_t _read(int fd, void *buf, size_t count) { return ::read(fd, buf, count); }
645inline ssize_t _write(int fd, const void *buf, size_t count) { return ::write(fd, buf, count); }
646inline int _close(int fd) { return ::close(fd); }
647
648#else
649
650#define _access(p, m) access((p), (m))
ee088bd0
VK
651#define _open open
652#define _close(f) close(f)
653#define _read(f, b, l) read((f), (b), (l))
c90ea787
VK
654#define _write(f, b, l) write((f), (b), (l))
655#define _close(f) close(f)
656
657#endif
ee088bd0 658
77312b6f 659// Socket compatibility
7e679c4b
AK
660typedef int SOCKET;
661
eae56922 662#define closesocket(x) _close(x)
77312b6f
VK
663#define WSAGetLastError() (errno)
664
f0ce9811 665#define WSAEINTR EINTR
a7a0c5cc 666#define WSAEWOULDBLOCK EWOULDBLOCK
1743a67a 667#define WSAEINPROGRESS EINPROGRESS
a2069340 668#define WSAESHUTDOWN ESHUTDOWN
f0ce9811 669#define INVALID_SOCKET (-1)
62d8cc27 670
be45f318
VK
671#define SetSocketReuseFlag(sd) { \
672 int nVal = 1; \
673 setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, (const void *)&nVal, \
674 (socklen_t)sizeof(nVal)); \
675}
676
1ddf3f0c
VK
677#define SetSocketExclusiveAddrUse(s)
678
19121a38
VK
679#define SetSocketNonBlocking(s) { \
680 int f = fcntl(s, F_GETFL); \
681 if (f != -1) fcntl(s, F_SETFL, f | O_NONBLOCK); \
682}
683
4a36d30c
VK
684#define SetSocketNoDelay(s) { \
685 int val = 1; \
686 setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (const void *)&val, sizeof(int)); \
687}
688
08f16c05 689#define SetSocketBroadcast(s) { \
690 int val = 1; \
691 setsockopt(s, SOL_SOCKET, SO_BROADCAST, (const void *)&val, sizeof(int)); \
692}
693
a3c76aba
VK
694#define SELECT_NFDS(x) (x)
695
cd4c8ca3 696#if !(HAVE_SOCKLEN_T) && !defined(_USE_GNU_PTH)
8ecf30ab 697typedef unsigned int socklen_t;
3c2bbe5f
VK
698#endif
699
0f8cd7ae
VK
700#ifndef SUN_LEN
701#define SUN_LEN(su) (sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path))
702#endif
703
17d715ba 704// Shared library suffix
2b479c92 705#ifndef SHLIB_SUFFIX
17d715ba 706#if defined(_HPUX) && !defined(__64BIT__)
2b479c92 707#define SHLIB_SUFFIX _T(".sl")
17d715ba 708#else
2b479c92 709#define SHLIB_SUFFIX _T(".so")
17d715ba
VK
710#endif
711#endif
712
4383fcad
AK
713typedef struct hostent HOSTENT;
714
ce7565e7
VK
715#if HAVE_DECL___VA_COPY && !HAVE_DECL_VA_COPY
716#define HAVE_DECL_VA_COPY 1
717#define va_copy(d,s) __va_copy(d,s)
718#endif
719
8d9f0998
VK
720#endif /* _WIN32 */
721
90d8fac8
VK
722/**
723 * Value used to indicate invalid pointer where NULL is not appropriate
724 */
a731ec52
VK
725#ifdef __64BIT__
726#define INVALID_POINTER_VALUE ((void *)_ULL(0xFFFFFFFFFFFFFFFF))
727#else
728#define INVALID_POINTER_VALUE ((void *)0xFFFFFFFF)
729#endif
730
90d8fac8
VK
731/**
732 * Casting between pointer and 32-bit integer
733 */
c88a8bc1 734#ifdef __64BIT__
967893bb
VK
735#define CAST_FROM_POINTER(p, t) ((t)((UINT64)(p)))
736#define CAST_TO_POINTER(v, t) ((t)((UINT64)(v)))
c88a8bc1 737#else
a23d8e0d
VK
738#define CAST_FROM_POINTER(p, t) ((t)(p))
739#define CAST_TO_POINTER(v, t) ((t)(v))
c88a8bc1
VK
740#endif
741
bde67a1f 742/**
bde67a1f
VK
743 * open() flags compatibility
744 */
8d9f0998
VK
745#ifndef O_BINARY
746#define O_BINARY 0
cbcaf8c8
VK
747#endif
748
bde67a1f
VK
749/**
750 * Windows-specific structures for non-Windows platforms
08f16c05 751 */
1d410d50
VK
752#ifndef _WIN32
753
754typedef struct tagPOINT
755{
756 int x;
757 int y;
758} POINT;
759
760#endif
761
bde67a1f
VK
762/**
763 * Event log severity codes
764 */
9c02b362 765#ifndef _WIN32
ccc34207
VK
766#define EVENTLOG_SUCCESS 0x0000
767#define EVENTLOG_ERROR_TYPE 0x0001
768#define EVENTLOG_WARNING_TYPE 0x0002
769#define EVENTLOG_INFORMATION_TYPE 0x0004
770#define EVENTLOG_AUDIT_SUCCESS 0x0008
771#define EVENTLOG_AUDIT_FAILURE 0x0010
9c02b362
VK
772#endif /* _WIN32 */
773
203e9d8a
VK
774#define NXLOG_DEBUG EVENTLOG_DEBUG_TYPE
775#define NXLOG_INFO EVENTLOG_INFORMATION_TYPE
776#define NXLOG_WARNING EVENTLOG_WARNING_TYPE
777#define NXLOG_ERROR EVENTLOG_ERROR_TYPE
778
bde67a1f
VK
779/**
780 * Interface types
781 */
020559de
VK
782#define IFTYPE_OTHER 1
783#define IFTYPE_REGULAR1822 2
784#define IFTYPE_HDH1822 3
785#define IFTYPE_DDN_X25 4
786#define IFTYPE_RFC877_X25 5
787#define IFTYPE_ETHERNET_CSMACD 6
788#define IFTYPE_ISO88023_CSMACD 7
789#define IFTYPE_ISO88024_TOKENBUS 8
790#define IFTYPE_ISO88025_TOKENRING 9
791#define IFTYPE_ISO88026_MAN 10
792#define IFTYPE_STARLAN 11
793#define IFTYPE_PROTEON_10MBIT 12
794#define IFTYPE_PROTEON_80MBIT 13
795#define IFTYPE_HYPERCHANNEL 14
796#define IFTYPE_FDDI 15
797#define IFTYPE_LAPB 16
798#define IFTYPE_SDLC 17
799#define IFTYPE_DS1 18
800#define IFTYPE_E1 19
801#define IFTYPE_BASIC_ISDN 20
802#define IFTYPE_PRIMARY_ISDN 21
803#define IFTYPE_PROP_PTP_SERIAL 22
804#define IFTYPE_PPP 23
805#define IFTYPE_SOFTWARE_LOOPBACK 24
806#define IFTYPE_EON 25
807#define IFTYPE_ETHERNET_3MBIT 26
808#define IFTYPE_NSIP 27
809#define IFTYPE_SLIP 28
810#define IFTYPE_ULTRA 29
811#define IFTYPE_DS3 30
812#define IFTYPE_SMDS 31
813#define IFTYPE_FRAME_RELAY 32
814#define IFTYPE_RS232 33
815#define IFTYPE_PARA 34
816#define IFTYPE_ARCNET 35
817#define IFTYPE_ARCNET_PLUS 36
818#define IFTYPE_ATM 37
819#define IFTYPE_MIOX25 38
820#define IFTYPE_SONET 39
821#define IFTYPE_X25PLE 40
822#define IFTYPE_ISO88022LLC 41
823#define IFTYPE_LOCALTALK 42
824#define IFTYPE_SMDS_DXI 43
825#define IFTYPE_FRAME_RELAY_SERVICE 44
826#define IFTYPE_V35 45
827#define IFTYPE_HSSI 46
828#define IFTYPE_HIPPI 47
829#define IFTYPE_MODEM 48
830#define IFTYPE_AAL5 49
831#define IFTYPE_SONET_PATH 50
832#define IFTYPE_SONET_VT 51
833#define IFTYPE_SMDS_ICIP 52
834#define IFTYPE_PROP_VIRTUAL 53
835#define IFTYPE_PROP_MULTIPLEXOR 54
836#define IFTYPE_IEEE80212 55
837#define IFTYPE_FIBRECHANNEL 56
838#define IFTYPE_HIPPIINTERFACE 57
839#define IFTYPE_FRAME_RELAY_INTERCONNECT 58
840#define IFTYPE_AFLANE8023 59
841#define IFTYPE_AFLANE8025 60
842#define IFTYPE_CCTEMUL 61
843#define IFTYPE_FAST_ETHERNET 62
844#define IFTYPE_ISDN 63
845#define IFTYPE_V11 64
846#define IFTYPE_V36 65
847#define IFTYPE_G703_AT64K 66
848#define IFTYPE_G703_AT2MB 67
849#define IFTYPE_QLLC 68
850#define IFTYPE_FASTETHERFX 69
851#define IFTYPE_CHANNEL 70
852#define IFTYPE_IEEE80211 71
853#define IFTYPE_IBM370_PARCHAN 72
854#define IFTYPE_ESCON 73
855#define IFTYPE_DLSW 74
856#define IFTYPE_ISDNS 75
857#define IFTYPE_ISDNU 76
858#define IFTYPE_LAPD 77
859#define IFTYPE_IPSWITCH 78
860#define IFTYPE_RSRB 79
861#define IFTYPE_ATMLOGICAL 80
862#define IFTYPE_DS0 81
863#define IFTYPE_DS0_BUNDLE 82
864#define IFTYPE_BSC 83
865#define IFTYPE_ASYNC 84
866#define IFTYPE_CNR 85
867#define IFTYPE_ISO88025DTR 86
868#define IFTYPE_EPLRS 87
869#define IFTYPE_ARAP 88
870#define IFTYPE_PROPCNLS 89
871#define IFTYPE_HOSTPAD 90
872#define IFTYPE_TERMPAD 91
873#define IFTYPE_FRAME_RELAY_MPI 92
874#define IFTYPE_X213 93
875#define IFTYPE_ADSL 94
876#define IFTYPE_RADSL 95
877#define IFTYPE_SDSL 96
878#define IFTYPE_VDSL 97
879#define IFTYPE_ISO88025CRFPINT 98
880#define IFTYPE_MYRINET 99
881#define IFTYPE_VOICEEM 100
882#define IFTYPE_VOICEFXO 101
883#define IFTYPE_VOICEFXS 102
884#define IFTYPE_VOICEENCAP 103
885#define IFTYPE_VOICEOVERIP 104
886#define IFTYPE_ATMDXI 105
887#define IFTYPE_ATMFUNI 106
888#define IFTYPE_ATMIMA 107
889#define IFTYPE_PPPMULTILINKBUNDLE 108
890#define IFTYPE_IPOVERCDLC 109
891#define IFTYPE_IPOVERCLAW 110
892#define IFTYPE_STACKTOSTACK 111
893#define IFTYPE_VIRTUAL_IP_ADDRESS 112
894#define IFTYPE_MPC 113
895#define IFTYPE_IPOVERATM 114
896#define IFTYPE_ISO88025FIBER 115
897#define IFTYPE_TDLC 116
898#define IFTYPE_GIGABIT_ETHERNET 117
899#define IFTYPE_HDLC 118
900#define IFTYPE_LAPF 119
901#define IFTYPE_V37 120
902#define IFTYPE_X25MLP 121
903#define IFTYPE_X25_HUNT_GROUP 122
904#define IFTYPE_TRANSPHDLC 123
905#define IFTYPE_INTERLEAVE 124
906#define IFTYPE_FAST 125
907#define IFTYPE_IP 126
908#define IFTYPE_DOCSCABLE_MACLAYER 127
909#define IFTYPE_DOCSCABLE_DOWNSTREAM 128
910#define IFTYPE_DOCSCABLE_UPSTREAM 129
911#define IFTYPE_A12MPPSWITCH 130
912#define IFTYPE_TUNNEL 131
913#define IFTYPE_COFFEE 132
914#define IFTYPE_CES 133
915#define IFTYPE_ATM_SUBINTERFACE 134
916#define IFTYPE_L2VLAN 135
917#define IFTYPE_L3IPVLAN 136
918#define IFTYPE_L3IPXVLAN 137
919#define IFTYPE_DIGITAL_POWERLINE 138
920#define IFTYPE_MEDIAMAIL_OVER_IP 139
921#define IFTYPE_DTM 140
922#define IFTYPE_DCN 141
923#define IFTYPE_IPFORWARD 142
924#define IFTYPE_MSDSL 143
925#define IFTYPE_IEEE1394 144
926#define IFTYPE_GSN 145
927#define IFTYPE_DVBRCC_MACLAYER 146
928#define IFTYPE_DVBRCC_DOWNSTREAM 147
929#define IFTYPE_DVBRCC_UPSTREAM 148
930#define IFTYPE_ATM_VIRTUAL 149
931#define IFTYPE_MPLS_TUNNEL 150
932#define IFTYPE_SRP 151
933#define IFTYPE_VOICE_OVER_ATM 152
934#define IFTYPE_VOICE_OVER_FRAME_RELAY 153
935#define IFTYPE_IDSL 154
936#define IFTYPE_COMPOSITE_LINK 155
937#define IFTYPE_SS7_SIGLINK 156
938#define IFTYPE_PROPWIRELESSP2P 157
939#define IFTYPE_FRFORWARD 158
940#define IFTYPE_RFC1483 159
941#define IFTYPE_USB 160
942#define IFTYPE_IEEE8023ADLAG 161
943#define IFTYPE_BGP_POLICY_ACCOUNTING 162
944#define IFTYPE_FRF16MFR_BUNDLE 163
945#define IFTYPE_H323_GATEKEEPER 164
946#define IFTYPE_H323_PROXY 165
947#define IFTYPE_MPLS 166
948#define IFTYPE_MFSIGLINK 167
949#define IFTYPE_HDSL2 168
950#define IFTYPE_SHDSL 169
951#define IFTYPE_DS1FDL 170
952#define IFTYPE_POS 171
953#define IFTYPE_DVBASI_IN 172
954#define IFTYPE_DVBASI_OUT 173
955#define IFTYPE_PLC 174
956#define IFTYPE_NFAS 175
957#define IFTYPE_TR008 176
958#define IFTYPE_GR303RDT 177
959#define IFTYPE_GR303IDT 178
960#define IFTYPE_ISUP 179
961#define IFTYPE_PROPDOCSWIRELESSMACLAYER 180
962#define IFTYPE_PROPDOCSWIRELESSDOWNSTREAM 181
963#define IFTYPE_PROPDOCSWIRELESSUPSTREAM 182
964#define IFTYPE_HIPERLAN2 183
965#define IFTYPE_PROPBWAP2MP 184
966#define IFTYPE_SONET_OVERHEAD_CHANNEL 185
967#define IFTYPE_DW_OVERHEAD_CHANNEL 186
968#define IFTYPE_AAL2 187
969#define IFTYPE_RADIOMAC 188
970#define IFTYPE_ATMRADIO 189
971#define IFTYPE_IMT 190
972#define IFTYPE_MVL 191
973#define IFTYPE_REACHDSL 192
974#define IFTYPE_FRDLCIENDPT 193
975#define IFTYPE_ATMVCIENDPT 194
976#define IFTYPE_OPTICAL_CHANNEL 195
977#define IFTYPE_OPTICAL_TRANSPORT 196
978#define IFTYPE_PROPATM 197
979#define IFTYPE_VOICE_OVER_CABLE 198
980#define IFTYPE_INFINIBAND 199
981#define IFTYPE_TELINK 200
982#define IFTYPE_Q2931 201
983#define IFTYPE_VIRTUALTG 202
984#define IFTYPE_SIPTG 203
985#define IFTYPE_SIPSIG 204
986#define IFTYPE_DOCSCABLEUPSTREAMCHANNEL 205
987#define IFTYPE_ECONET 206
988#define IFTYPE_PON155 207
989#define IFTYPE_PON622 208
990#define IFTYPE_BRIDGE 209
991#define IFTYPE_LINEGROUP 210
992#define IFTYPE_VOICEEMFGD 211
993#define IFTYPE_VOICEFGDEANA 212
994#define IFTYPE_VOICEDID 213
995#define IFTYPE_MPEG_TRANSPORT 214
996#define IFTYPE_SIXTOFOUR 215
997#define IFTYPE_GTP 216
998#define IFTYPE_PDNETHERLOOP1 217
999#define IFTYPE_PDNETHERLOOP2 218
1000#define IFTYPE_OPTICAL_CHANNEL_GROUP 219
1001#define IFTYPE_HOMEPNA 220
1002#define IFTYPE_GFP 221
1003#define IFTYPE_CISCO_ISL_VLAN 222
1004#define IFTYPE_ACTELIS_METALOOP 223
1005#define IFTYPE_FCIPLINK 224
1006#define IFTYPE_RPR 225
1007#define IFTYPE_QAM 226
1008#define IFTYPE_LMP 227
1009#define IFTYPE_CBLVECTASTAR 228
1010#define IFTYPE_DOCSCABLEMCMTSDOWNSTREAM 229
1011#define IFTYPE_ADSL2 230
1012#define IFTYPE_MACSECCONTROLLEDIF 231
1013#define IFTYPE_MACSECUNCONTROLLEDIF 232
1014#define IFTYPE_AVICIOPTICALETHER 233
1015#define IFTYPE_ATM_BOND 234
1016#define IFTYPE_VOICEFGDOS 235
1017#define IFTYPE_MOCA_VERSION1 236
1018#define IFTYPE_IEEE80216WMAN 237
1019#define IFTYPE_ADSL2PLUS 238
1020#define IFTYPE_DVBRCSMACLAYER 239
1021#define IFTYPE_DVBTDM 240
1022#define IFTYPE_DVBRCSTDMA 241
1023#define IFTYPE_X86LAPS 242
1024#define IFTYPE_WWANPP 243
1025#define IFTYPE_WWANPP2 244
1026#define IFTYPE_VOICEEBS 245
1027#define IFTYPE_IFPWTYPE 246
1028#define IFTYPE_ILAN 247
1029#define IFTYPE_PIP 248
1030#define IFTYPE_ALUELP 249
1031#define IFTYPE_GPON 250
1032#define IFTYPE_VDSL2 251
1033#define IFTYPE_CAPWAP_DOT11_PROFILE 252
1034#define IFTYPE_CAPWAP_DOT11_BSS 253
1035#define IFTYPE_CAPWAP_WTP_VIRTUAL_RADIO 254
1036#define IFTYPE_BITS 255
1037#define IFTYPE_DOCSCABLEUPSTREAMRFPORT 256
1038#define IFTYPE_CABLEDOWNSTREAMRFPORT 257
1039#define IFTYPE_VMWARE_VIRTUAL_NIC 258
1040#define IFTYPE_IEEE802154 259
1041#define IFTYPE_OTNODU 260
1042#define IFTYPE_OTNOTU 261
1043#define IFTYPE_IFVFITYPE 262
1044#define IFTYPE_G9981 263
1045#define IFTYPE_G9982 264
1046#define IFTYPE_G9983 265
1047#define IFTYPE_ALUEPON 266
1048#define IFTYPE_ALUEPONONU 267
1049#define IFTYPE_ALUEPONPHYSICALUNI 268
1050#define IFTYPE_ALUEPONLOGICALLINK 269
1051#define IFTYPE_ALUGPONONU 270
1052#define IFTYPE_ALUGPONPHYSICALUNI 271
1053#define IFTYPE_VMWARE_NIC_TEAM 272
840a1a6a 1054
674164eb
VK
1055/**
1056 * IP Header -- RFC 791
1057 */
798f373a
VK
1058typedef struct tagIPHDR
1059{
1060 BYTE m_cVIHL; // Version and IHL
1061 BYTE m_cTOS; // Type Of Service
1062 WORD m_wLen; // Total Length
1063 WORD m_wId; // Identification
1064 WORD m_wFlagOff; // Flags and Fragment Offset
1065 BYTE m_cTTL; // Time To Live
1066 BYTE m_cProtocol; // Protocol
1067 WORD m_wChecksum; // Checksum
1068 struct in_addr m_iaSrc; // Internet Address - Source
1069 struct in_addr m_iaDst; // Internet Address - Destination
1070} IPHDR;
1071
674164eb
VK
1072/**
1073 * ICMP Header - RFC 792
1074 */
798f373a
VK
1075typedef struct tagICMPHDR
1076{
1077 BYTE m_cType; // Type
1078 BYTE m_cCode; // Code
1079 WORD m_wChecksum; // Checksum
1080 WORD m_wId; // Identification
1081 WORD m_wSeq; // Sequence
798f373a
VK
1082} ICMPHDR;
1083
674164eb
VK
1084/**
1085 * INADDR_NONE can be undefined on some systems
1086 */
696fc54f
VK
1087#ifndef INADDR_NONE
1088#define INADDR_NONE (0xFFFFFFFF)
1089#endif
1090
674164eb 1091/**
674164eb
VK
1092 * Check if given string is NULL and always return valid pointer
1093 */
7da71731
VK
1094#define CHECK_NULL(x) ((x) == NULL ? _T("(null)") : (x))
1095#define CHECK_NULL_A(x) ((x) == NULL ? "(null)" : (x))
1096#define CHECK_NULL_EX(x) ((x) == NULL ? _T("") : (x))
1097#define CHECK_NULL_EX_A(x) ((x) == NULL ? "" : (x))
ef44d5ea 1098
674164eb
VK
1099/**
1100 * Free memory block if it isn't NULL
1101 */
2f64a076
VK
1102#if FREE_IS_NULL_SAFE
1103#define safe_free(x) free(x);
1104#define safe_free_and_null(x) { free(x); x = NULL; }
1105#else
b6a77d6d 1106#define safe_free(x) { if ((x) != NULL) free(x); }
de2c1214 1107#define safe_free_and_null(x) { if ((x) != NULL) { free(x); x = NULL; } }
2f64a076
VK
1108#endif
1109
1110/**
1111 * free() wrapper if it isn't NULL safe
1112 */
1113#if defined(__cplusplus) && !FREE_IS_NULL_SAFE
1114inline void nx_free(void *p)
1115{
1116 if (p != NULL)
1117 free(p);
1118}
1119#define free nx_free
1120#endif
b6a77d6d 1121
674164eb
VK
1122/**
1123 * delete object and nullify pointer
1124 */
cd890184
VK
1125#define delete_and_null(x) { delete x; x = NULL; }
1126
674164eb
VK
1127/**
1128 * Convert half-byte's value to hex digit and vice versa
1129 */
4075c782
VK
1130#define bin2hex(x) ((x) < 10 ? ((x) + _T('0')) : ((x) + (_T('A') - 10)))
1131#ifdef UNICODE
1132#define hex2bin(x) ((((x) >= _T('0')) && ((x) <= _T('9'))) ? ((x) - _T('0')) : \
1133 (((towupper(x) >= _T('A')) && (towupper(x) <= _T('F'))) ? (towupper(x) - _T('A') + 10) : 0))
1134#else
93b18807
VK
1135#define hex2bin(x) ((((x) >= '0') && ((x) <= '9')) ? ((x) - '0') : \
1136 (((toupper(x) >= 'A') && (toupper(x) <= 'F')) ? (toupper(x) - 'A' + 10) : 0))
4075c782 1137#endif
fe49ce0b 1138
674164eb 1139/**
78032263 1140 * Define MIN() and MAX()
674164eb 1141 */
78032263 1142#undef MIN
b9792835 1143#define MIN(a, b) ((a) < (b) ? (a) : (b))
78032263 1144#undef MAX
b9792835 1145#define MAX(a, b) ((a) > (b) ? (a) : (b))
7e679c4b 1146
674164eb
VK
1147/**
1148 * Define _tcsicmp() for non-windows
1149 */
daf35c51 1150#ifndef _WIN32
90ce1516
VK
1151#define stricmp strcasecmp
1152#define strnicmp strncasecmp
8b86c5dc
VK
1153#define wcsicmp wcscasecmp
1154#define wcsnicmp wcsncasecmp
daf35c51
VK
1155#endif
1156
674164eb
VK
1157/**
1158 * Compare two numbers and return -1, 0, or 1
1159 */
4c7a83e5
VK
1160#define COMPARE_NUMBERS(n1,n2) (((n1) < (n2)) ? -1 : (((n1) > (n2)) ? 1 : 0))
1161
674164eb
VK
1162/**
1163 * Increment pointer for given number of bytes
1164 */
9f20696e
VK
1165#define inc_ptr(ptr, step, ptype) ptr = (ptype *)(((char *)ptr) + step)
1166
674164eb
VK
1167/**
1168 * Validate numerical value
1169 */
52996299
VK
1170#define VALIDATE_VALUE(var,x,y,z) { if ((var < x) || (var > y)) var = z; }
1171
674164eb
VK
1172/**
1173 * DCI (data collection item) data types
1174 */
a72a1fb1
VK
1175#define DCI_DT_INT 0
1176#define DCI_DT_UINT 1
1177#define DCI_DT_INT64 2
1178#define DCI_DT_UINT64 3
1179#define DCI_DT_STRING 4
1180#define DCI_DT_FLOAT 5
20aaa307 1181#define DCI_DT_NULL 6
8f9299d1 1182#define DCI_DT_DEPRECATED 255 /* used internally by agent */
a72a1fb1 1183
674164eb
VK
1184/**
1185 * Insert parameter as string
1186 */
9493e563
VK
1187#ifdef UNICODE
1188#define STRING(x) L#x
1189#else
1190#define STRING(x) #x
1191#endif
1192
674164eb 1193/**
6be0a20b
VK
1194 * Pipe handle
1195 */
1196#ifdef _WIN32
1197#define HPIPE HANDLE
1198#define INVALID_PIPE_HANDLE INVALID_HANDLE_VALUE
1199#else
1200#define HPIPE int
1201#define INVALID_PIPE_HANDLE (-1)
1202#endif
1203
34b9a3e7
VK
1204#ifdef __cplusplus
1205
b9792835
VK
1206#include <algorithm>
1207
34b9a3e7
VK
1208/**
1209 * Session enumeration callback return codes
1210 */
1211enum EnumerationCallbackResult
1212{
1213 _STOP = 0,
1214 _CONTINUE = 1
1215};
1216
ab7a30e6
VK
1217/**
1218 * Disable copy constructor if compiler supports it
1219 */
1220#if CAN_DELETE_COPY_CTOR
1221#define DISABLE_COPY_CTOR(c) c (const c &s) = delete;
1222#else
1223#define DISABLE_COPY_CTOR(c)
1224#endif
1225
34b9a3e7
VK
1226#endif
1227
cbcaf8c8 1228#endif /* _nms_common_h_ */