1 /*
2 ** Zabbix
3 ** Copyright (C) 2001-2021 Zabbix SIA
4 **
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.
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 **
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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
18 **/
19 
20 #ifndef ZABBIX_COMMON_H
21 #define ZABBIX_COMMON_H
22 
23 #include "sysinc.h"
24 #include "zbxtypes.h"
25 #include "module.h"
26 #include "version.h"
27 #include "md5.h"
28 
29 #if defined(__MINGW32__)
30 #	define __try
31 #	define __except(x) if (0)
32 #endif
33 
34 #ifndef va_copy
35 #	if defined(__va_copy)
36 #		define va_copy(d, s) __va_copy(d, s)
37 #	else
38 #		define va_copy(d, s) memcpy(&d, &s, sizeof(va_list))
39 #	endif
40 #endif
41 
42 #ifdef snprintf
43 #	undef snprintf
44 #endif
45 #define snprintf	ERROR_DO_NOT_USE_SNPRINTF_FUNCTION_TRY_TO_USE_ZBX_SNPRINTF
46 
47 #ifdef sprintf
48 #	undef sprintf
49 #endif
50 #define sprintf		ERROR_DO_NOT_USE_SPRINTF_FUNCTION_TRY_TO_USE_ZBX_SNPRINTF
51 
52 #ifdef strncpy
53 #	undef strncpy
54 #endif
55 #define strncpy		ERROR_DO_NOT_USE_STRNCPY_FUNCTION_TRY_TO_USE_ZBX_STRLCPY
56 
57 #ifdef strcpy
58 #	undef strcpy
59 #endif
60 #define strcpy		ERROR_DO_NOT_USE_STRCPY_FUNCTION_TRY_TO_USE_ZBX_STRLCPY
61 
62 #ifdef vsprintf
63 #	undef vsprintf
64 #endif
65 #define vsprintf	ERROR_DO_NOT_USE_VSPRINTF_FUNCTION_TRY_TO_USE_ZBX_VSNPRINTF
66 
67 #ifdef strncat
68 #	undef strncat
69 #endif
70 #define strncat		ERROR_DO_NOT_USE_STRNCAT_FUNCTION_TRY_TO_USE_ZBX_STRLCAT
71 
72 #ifdef strncasecmp
73 #	undef strncasecmp
74 #endif
75 #define strncasecmp	ERROR_DO_NOT_USE_STRNCASECMP_FUNCTION_TRY_TO_USE_ZBX_STRNCASECMP
76 
77 #define ON	1
78 #define OFF	0
79 
80 #if defined(_WINDOWS)
81 #	define	ZBX_SERVICE_NAME_LEN	64
82 extern char ZABBIX_SERVICE_NAME[ZBX_SERVICE_NAME_LEN];
83 extern char ZABBIX_EVENT_SOURCE[ZBX_SERVICE_NAME_LEN];
84 
85 #	pragma warning (disable: 4996)	/* warning C4996: <function> was declared deprecated */
86 #endif
87 
88 #if defined(__GNUC__) && __GNUC__ >= 7
89 #	define ZBX_FALLTHROUGH	__attribute__ ((fallthrough))
90 #else
91 #	define ZBX_FALLTHROUGH
92 #endif
93 
94 #define	SUCCEED		0
95 #define	FAIL		-1
96 #define	NOTSUPPORTED	-2
97 #define	NETWORK_ERROR	-3
98 #define	TIMEOUT_ERROR	-4
99 #define	AGENT_ERROR	-5
100 #define	GATEWAY_ERROR	-6
101 #define	CONFIG_ERROR	-7
102 
103 #define SUCCEED_OR_FAIL(result) (FAIL != (result) ? SUCCEED : FAIL)
104 const char	*zbx_sysinfo_ret_string(int ret);
105 const char	*zbx_result_string(int result);
106 
107 #define MAX_ID_LEN		21
108 #define MAX_STRING_LEN		2048
109 #define MAX_BUFFER_LEN		65536
110 #define MAX_ZBX_HOSTNAME_LEN	128
111 #define MAX_ZBX_DNSNAME_LEN	255	/* maximum host DNS name length from RFC 1035 (without terminating '\0') */
112 #define MAX_EXECUTE_OUTPUT_LEN	(512 * ZBX_KIBIBYTE)
113 
114 #define ZBX_MAX_UINT64		(~__UINT64_C(0))
115 #define ZBX_MAX_UINT64_LEN	21
116 #define ZBX_MAX_DOUBLE_LEN	24
117 
118 /******************************************************************************
119  *                                                                            *
120  * Macro: ZBX_UNUSED                                                          *
121  *                                                                            *
122  * Purpose: silences compiler warning about unused function parameter         *
123  *                                                                            *
124  * Parameters:                                                                *
125  *      var       - [IN] the unused parameter                                 *
126  *                                                                            *
127  * Comments: Use only on unused, non-volatile function parameters!            *
128  *                                                                            *
129  ******************************************************************************/
130 #define ZBX_UNUSED(var) (void)(var)
131 
132 typedef struct
133 {
134 	int	sec;	/* seconds */
135 	int	ns;	/* nanoseconds */
136 }
137 zbx_timespec_t;
138 
139 /* time zone offset */
140 typedef struct
141 {
142 	char	tz_sign;	/* '+' or '-' */
143 	int	tz_hour;
144 	int	tz_min;
145 }
146 zbx_timezone_t;
147 
148 #define zbx_timespec_compare(t1, t2)	\
149 	((t1)->sec == (t2)->sec ? (t1)->ns - (t2)->ns : (t1)->sec - (t2)->sec)
150 
151 extern double	ZBX_DOUBLE_EPSILON;
152 
153 int	zbx_double_compare(double a, double b);
154 
155 /* item types */
156 typedef enum
157 {
158 	ITEM_TYPE_ZABBIX = 0,
159 /*	ITEM_TYPE_SNMPv1,*/
160 	ITEM_TYPE_TRAPPER = 2,
161 	ITEM_TYPE_SIMPLE,
162 /*	ITEM_TYPE_SNMPv2c,*/
163 	ITEM_TYPE_INTERNAL = 5,
164 /*	ITEM_TYPE_SNMPv3,*/
165 	ITEM_TYPE_ZABBIX_ACTIVE = 7,
166 	ITEM_TYPE_AGGREGATE,
167 	ITEM_TYPE_HTTPTEST,
168 	ITEM_TYPE_EXTERNAL,
169 	ITEM_TYPE_DB_MONITOR,
170 	ITEM_TYPE_IPMI,
171 	ITEM_TYPE_SSH,
172 	ITEM_TYPE_TELNET,
173 	ITEM_TYPE_CALCULATED,
174 	ITEM_TYPE_JMX,
175 	ITEM_TYPE_SNMPTRAP,
176 	ITEM_TYPE_DEPENDENT,
177 	ITEM_TYPE_HTTPAGENT,
178 	ITEM_TYPE_SNMP		/* 20 */
179 }
180 zbx_item_type_t;
181 const char	*zbx_agent_type_string(zbx_item_type_t item_type);
182 
183 typedef enum
184 {
185 	INTERFACE_TYPE_UNKNOWN = 0,
186 	INTERFACE_TYPE_AGENT,
187 	INTERFACE_TYPE_SNMP,
188 	INTERFACE_TYPE_IPMI,
189 	INTERFACE_TYPE_JMX,
190 	INTERFACE_TYPE_ANY = 255
191 }
192 zbx_interface_type_t;
193 const char	*zbx_interface_type_string(zbx_interface_type_t type);
194 
195 #define INTERFACE_TYPE_COUNT	4	/* number of interface types */
196 extern const int	INTERFACE_TYPE_PRIORITY[INTERFACE_TYPE_COUNT];
197 
198 #define SNMP_BULK_DISABLED	0
199 #define SNMP_BULK_ENABLED	1
200 
201 #define ZBX_IF_SNMP_VERSION_1	1
202 #define ZBX_IF_SNMP_VERSION_2	2
203 #define ZBX_IF_SNMP_VERSION_3	3
204 
205 #define ZBX_FLAG_DISCOVERY_NORMAL	0x00
206 #define ZBX_FLAG_DISCOVERY_RULE		0x01
207 #define ZBX_FLAG_DISCOVERY_PROTOTYPE	0x02
208 #define ZBX_FLAG_DISCOVERY_CREATED	0x04
209 
210 typedef enum
211 {
212 	ITEM_AUTHTYPE_PASSWORD = 0,
213 	ITEM_AUTHTYPE_PUBLICKEY
214 }
215 zbx_item_authtype_t;
216 
217 /* event status */
218 #define EVENT_STATUS_RESOLVED		0
219 #define EVENT_STATUS_PROBLEM		1
220 
221 /* event sources */
222 #define EVENT_SOURCE_TRIGGERS		0
223 #define EVENT_SOURCE_DISCOVERY		1
224 #define EVENT_SOURCE_AUTOREGISTRATION	2
225 #define EVENT_SOURCE_INTERNAL		3
226 #define EVENT_SOURCE_COUNT		4
227 
228 /* event objects */
229 #define EVENT_OBJECT_TRIGGER		0
230 #define EVENT_OBJECT_DHOST		1
231 #define EVENT_OBJECT_DSERVICE		2
232 #define EVENT_OBJECT_ZABBIX_ACTIVE	3
233 #define EVENT_OBJECT_ITEM		4
234 #define EVENT_OBJECT_LLDRULE		5
235 
236 /* acknowledged flags */
237 #define EVENT_NOT_ACKNOWLEDGED		0
238 #define EVENT_ACKNOWLEDGED		1
239 
240 typedef enum
241 {
242 	DOBJECT_STATUS_UP = 0,
243 	DOBJECT_STATUS_DOWN,
244 	DOBJECT_STATUS_DISCOVER,
245 	DOBJECT_STATUS_LOST
246 }
247 zbx_dstatus_t;
248 
249 /* item value types */
250 typedef enum
251 {
252 	ITEM_VALUE_TYPE_FLOAT = 0,
253 	ITEM_VALUE_TYPE_STR,
254 	ITEM_VALUE_TYPE_LOG,
255 	ITEM_VALUE_TYPE_UINT64,
256 	ITEM_VALUE_TYPE_TEXT,
257 	/* the number of defined value types */
258 	ITEM_VALUE_TYPE_MAX,
259 	ITEM_VALUE_TYPE_NONE,
260 }
261 zbx_item_value_type_t;
262 const char	*zbx_item_value_type_string(zbx_item_value_type_t value_type);
263 
264 typedef struct
265 {
266 	int	timestamp;
267 	int	logeventid;
268 	int	severity;
269 	char	*source;
270 	char	*value;
271 }
272 zbx_log_value_t;
273 
274 typedef union
275 {
276 	double		dbl;
277 	zbx_uint64_t	ui64;
278 	char		*str;
279 	char		*err;
280 	zbx_log_value_t	*log;
281 }
282 history_value_t;
283 
284 /* item data types */
285 typedef enum
286 {
287 	ITEM_DATA_TYPE_DECIMAL = 0,
288 	ITEM_DATA_TYPE_OCTAL,
289 	ITEM_DATA_TYPE_HEXADECIMAL,
290 	ITEM_DATA_TYPE_BOOLEAN
291 }
292 zbx_item_data_type_t;
293 
294 /* service supported by discoverer */
295 typedef enum
296 {
297 	SVC_SSH = 0,
298 	SVC_LDAP,
299 	SVC_SMTP,
300 	SVC_FTP,
301 	SVC_HTTP,
302 	SVC_POP,
303 	SVC_NNTP,
304 	SVC_IMAP,
305 	SVC_TCP,
306 	SVC_AGENT,
307 	SVC_SNMPv1,
308 	SVC_SNMPv2c,
309 	SVC_ICMPPING,
310 	SVC_SNMPv3,
311 	SVC_HTTPS,
312 	SVC_TELNET
313 }
314 zbx_dservice_type_t;
315 const char	*zbx_dservice_type_string(zbx_dservice_type_t service);
316 
317 /* item snmpv3 security levels */
318 #define ITEM_SNMPV3_SECURITYLEVEL_NOAUTHNOPRIV	0
319 #define ITEM_SNMPV3_SECURITYLEVEL_AUTHNOPRIV	1
320 #define ITEM_SNMPV3_SECURITYLEVEL_AUTHPRIV	2
321 
322 /* item snmpv3 authentication protocol */
323 #define ITEM_SNMPV3_AUTHPROTOCOL_MD5		0
324 #define ITEM_SNMPV3_AUTHPROTOCOL_SHA		1
325 
326 /* item snmpv3 privacy protocol */
327 #define ITEM_SNMPV3_PRIVPROTOCOL_DES		0
328 #define ITEM_SNMPV3_PRIVPROTOCOL_AES		1
329 
330 /* condition evaluation types */
331 #define CONDITION_EVAL_TYPE_AND_OR		0
332 #define CONDITION_EVAL_TYPE_AND			1
333 #define CONDITION_EVAL_TYPE_OR			2
334 #define CONDITION_EVAL_TYPE_EXPRESSION		3
335 
336 /* condition types */
337 #define CONDITION_TYPE_HOST_GROUP		0
338 #define CONDITION_TYPE_HOST			1
339 #define CONDITION_TYPE_TRIGGER			2
340 #define CONDITION_TYPE_TRIGGER_NAME		3
341 #define CONDITION_TYPE_TRIGGER_SEVERITY		4
342 /* #define CONDITION_TYPE_TRIGGER_VALUE		5	deprecated */
343 #define CONDITION_TYPE_TIME_PERIOD		6
344 #define CONDITION_TYPE_DHOST_IP			7
345 #define CONDITION_TYPE_DSERVICE_TYPE		8
346 #define CONDITION_TYPE_DSERVICE_PORT		9
347 #define CONDITION_TYPE_DSTATUS			10
348 #define CONDITION_TYPE_DUPTIME			11
349 #define CONDITION_TYPE_DVALUE			12
350 #define CONDITION_TYPE_HOST_TEMPLATE		13
351 #define CONDITION_TYPE_EVENT_ACKNOWLEDGED	14
352 #define CONDITION_TYPE_APPLICATION		15
353 #define CONDITION_TYPE_SUPPRESSED		16
354 #define CONDITION_TYPE_DRULE			18
355 #define CONDITION_TYPE_DCHECK			19
356 #define CONDITION_TYPE_PROXY			20
357 #define CONDITION_TYPE_DOBJECT			21
358 #define CONDITION_TYPE_HOST_NAME		22
359 #define CONDITION_TYPE_EVENT_TYPE		23
360 #define CONDITION_TYPE_HOST_METADATA		24
361 #define CONDITION_TYPE_EVENT_TAG		25
362 #define CONDITION_TYPE_EVENT_TAG_VALUE		26
363 
364 /* condition operators */
365 #define CONDITION_OPERATOR_EQUAL		0
366 #define CONDITION_OPERATOR_NOT_EQUAL		1
367 #define CONDITION_OPERATOR_LIKE			2
368 #define CONDITION_OPERATOR_NOT_LIKE		3
369 #define CONDITION_OPERATOR_IN			4
370 #define CONDITION_OPERATOR_MORE_EQUAL		5
371 #define CONDITION_OPERATOR_LESS_EQUAL		6
372 #define CONDITION_OPERATOR_NOT_IN		7
373 #define CONDITION_OPERATOR_REGEXP		8
374 #define CONDITION_OPERATOR_NOT_REGEXP		9
375 #define CONDITION_OPERATOR_YES			10
376 #define CONDITION_OPERATOR_NO			11
377 
378 /* maintenance tag operators */
379 #define ZBX_MAINTENANCE_TAG_OPERATOR_EQUAL	0
380 #define ZBX_MAINTENANCE_TAG_OPERATOR_LIKE	2
381 
382 /* maintenance tag evaluation types */
383 #define MAINTENANCE_TAG_EVAL_TYPE_AND_OR	0
384 #define MAINTENANCE_TAG_EVAL_TYPE_OR	2
385 
386 /* event type action condition values */
387 #define EVENT_TYPE_ITEM_NOTSUPPORTED		0
388 /* #define EVENT_TYPE_ITEM_NORMAL		1	 deprecated */
389 #define EVENT_TYPE_LLDRULE_NOTSUPPORTED		2
390 /* #define EVENT_TYPE_LLDRULE_NORMAL		3	 deprecated */
391 #define EVENT_TYPE_TRIGGER_UNKNOWN		4
392 /* #define EVENT_TYPE_TRIGGER_NORMAL		5	 deprecated */
393 
394 #define SCREEN_RESOURCE_GRAPH			0
395 #define SCREEN_RESOURCE_SIMPLE_GRAPH		1
396 #define SCREEN_RESOURCE_MAP			2
397 #define SCREEN_RESOURCE_PLAIN_TEXT		3
398 #define SCREEN_RESOURCE_HOST_INFO		4
399 #define SCREEN_RESOURCE_TRIGGER_INFO		5
400 #define SCREEN_RESOURCE_SERVER_INFO		6
401 #define SCREEN_RESOURCE_CLOCK			7
402 #define SCREEN_RESOURCE_SCREEN			8
403 #define SCREEN_RESOURCE_TRIGGER_OVERVIEW	9
404 #define SCREEN_RESOURCE_DATA_OVERVIEW		10
405 #define SCREEN_RESOURCE_URL			11
406 #define SCREEN_RESOURCE_ACTIONS			12
407 #define SCREEN_RESOURCE_EVENTS			13
408 #define SCREEN_RESOURCE_HOSTGROUP_TRIGGERS	14
409 #define SCREEN_RESOURCE_SYSTEM_STATUS		15
410 #define SCREEN_RESOURCE_HOST_TRIGGERS		16
411 
412 typedef enum
413 {
414 	SYSMAP_ELEMENT_TYPE_HOST = 0,
415 	SYSMAP_ELEMENT_TYPE_MAP,
416 	SYSMAP_ELEMENT_TYPE_TRIGGER,
417 	SYSMAP_ELEMENT_TYPE_HOST_GROUP,
418 	SYSMAP_ELEMENT_TYPE_IMAGE
419 }
420 zbx_sysmap_element_types_t;
421 
422 typedef enum
423 {
424 	GRAPH_YAXIS_TYPE_CALCULATED = 0,
425 	GRAPH_YAXIS_TYPE_FIXED,
426 	GRAPH_YAXIS_TYPE_ITEM_VALUE
427 }
428 zbx_graph_yaxis_types_t;
429 
430 /* special item key used for ICMP pings */
431 #define SERVER_ICMPPING_KEY	"icmpping"
432 /* special item key used for ICMP ping latency */
433 #define SERVER_ICMPPINGSEC_KEY	"icmppingsec"
434 /* special item key used for ICMP ping loss packages */
435 #define SERVER_ICMPPINGLOSS_KEY	"icmppingloss"
436 
437 /* runtime control options */
438 #define ZBX_CONFIG_CACHE_RELOAD	"config_cache_reload"
439 #define ZBX_HOUSEKEEPER_EXECUTE	"housekeeper_execute"
440 #define ZBX_LOG_LEVEL_INCREASE	"log_level_increase"
441 #define ZBX_LOG_LEVEL_DECREASE	"log_level_decrease"
442 #define ZBX_SNMP_CACHE_RELOAD	"snmp_cache_reload"
443 #define ZBX_DIAGINFO		"diaginfo"
444 
445 /* value for not supported items */
446 #define ZBX_NOTSUPPORTED	"ZBX_NOTSUPPORTED"
447 /* the error message for not supported items when reason is unknown */
448 #define ZBX_NOTSUPPORTED_MSG	"Unknown error."
449 
450 /* Zabbix Agent non-critical error (agents older than 2.0) */
451 #define ZBX_ERROR		"ZBX_ERROR"
452 
453 /* media types */
454 typedef enum
455 {
456 	MEDIA_TYPE_EMAIL = 0,
457 	MEDIA_TYPE_EXEC,
458 	MEDIA_TYPE_SMS,
459 	MEDIA_TYPE_WEBHOOK = 4
460 }
461 zbx_media_type_t;
462 
463 /* alert statuses */
464 typedef enum
465 {
466 	ALERT_STATUS_NOT_SENT = 0,
467 	ALERT_STATUS_SENT,
468 	ALERT_STATUS_FAILED,
469 	ALERT_STATUS_NEW
470 }
471 zbx_alert_status_t;
472 const char	*zbx_alert_status_string(unsigned char type, unsigned char status);
473 
474 /* escalation statuses */
475 typedef enum
476 {
477 	ESCALATION_STATUS_ACTIVE = 0,
478 	ESCALATION_STATUS_RECOVERY,	/* only in server code, never in DB, deprecated */
479 	ESCALATION_STATUS_SLEEP,
480 	ESCALATION_STATUS_COMPLETED	/* only in server code, never in DB */
481 }
482 zbx_escalation_status_t;
483 const char	*zbx_escalation_status_string(unsigned char status);
484 
485 /* alert types */
486 typedef enum
487 {
488 	ALERT_TYPE_MESSAGE = 0,
489 	ALERT_TYPE_COMMAND
490 }
491 zbx_alert_type_t;
492 const char	*zbx_alert_type_string(unsigned char type);
493 
494 /* item statuses */
495 #define ITEM_STATUS_ACTIVE		0
496 #define ITEM_STATUS_DISABLED		1
497 
498 /* item states */
499 #define ITEM_STATE_NORMAL		0
500 #define ITEM_STATE_NOTSUPPORTED		1
501 const char	*zbx_item_state_string(unsigned char state);
502 
503 /* group statuses */
504 typedef enum
505 {
506 	GROUP_STATUS_ACTIVE = 0,
507 	GROUP_STATUS_DISABLED
508 }
509 zbx_group_status_type_t;
510 
511 /* group internal flag */
512 #define ZBX_INTERNAL_GROUP		1
513 
514 /* program type */
515 #define ZBX_PROGRAM_TYPE_SERVER		0x01
516 #define ZBX_PROGRAM_TYPE_PROXY_ACTIVE	0x02
517 #define ZBX_PROGRAM_TYPE_PROXY_PASSIVE	0x04
518 #define ZBX_PROGRAM_TYPE_PROXY		0x06	/* ZBX_PROGRAM_TYPE_PROXY_ACTIVE | ZBX_PROGRAM_TYPE_PROXY_PASSIVE */
519 #define ZBX_PROGRAM_TYPE_AGENTD		0x08
520 #define ZBX_PROGRAM_TYPE_SENDER		0x10
521 #define ZBX_PROGRAM_TYPE_GET		0x20
522 const char	*get_program_type_string(unsigned char program_type);
523 
524 /* process type */
525 #define ZBX_PROCESS_TYPE_POLLER		0
526 #define ZBX_PROCESS_TYPE_UNREACHABLE	1
527 #define ZBX_PROCESS_TYPE_IPMIPOLLER	2
528 #define ZBX_PROCESS_TYPE_PINGER		3
529 #define ZBX_PROCESS_TYPE_JAVAPOLLER	4
530 #define ZBX_PROCESS_TYPE_HTTPPOLLER	5
531 #define ZBX_PROCESS_TYPE_TRAPPER	6
532 #define ZBX_PROCESS_TYPE_SNMPTRAPPER	7
533 #define ZBX_PROCESS_TYPE_PROXYPOLLER	8
534 #define ZBX_PROCESS_TYPE_ESCALATOR	9
535 #define ZBX_PROCESS_TYPE_HISTSYNCER	10
536 #define ZBX_PROCESS_TYPE_DISCOVERER	11
537 #define ZBX_PROCESS_TYPE_ALERTER	12
538 #define ZBX_PROCESS_TYPE_TIMER		13
539 #define ZBX_PROCESS_TYPE_HOUSEKEEPER	14
540 #define ZBX_PROCESS_TYPE_DATASENDER	15
541 #define ZBX_PROCESS_TYPE_CONFSYNCER	16
542 #define ZBX_PROCESS_TYPE_HEARTBEAT	17
543 #define ZBX_PROCESS_TYPE_SELFMON	18
544 #define ZBX_PROCESS_TYPE_VMWARE		19
545 #define ZBX_PROCESS_TYPE_COLLECTOR	20
546 #define ZBX_PROCESS_TYPE_LISTENER	21
547 #define ZBX_PROCESS_TYPE_ACTIVE_CHECKS	22
548 #define ZBX_PROCESS_TYPE_TASKMANAGER	23
549 #define ZBX_PROCESS_TYPE_IPMIMANAGER	24
550 #define ZBX_PROCESS_TYPE_ALERTMANAGER	25
551 #define ZBX_PROCESS_TYPE_PREPROCMAN	26
552 #define ZBX_PROCESS_TYPE_PREPROCESSOR	27
553 #define ZBX_PROCESS_TYPE_LLDMANAGER	28
554 #define ZBX_PROCESS_TYPE_LLDWORKER	29
555 #define ZBX_PROCESS_TYPE_ALERTSYNCER	30
556 #define ZBX_PROCESS_TYPE_COUNT		31	/* number of process types */
557 #define ZBX_PROCESS_TYPE_UNKNOWN	255
558 const char	*get_process_type_string(unsigned char proc_type);
559 int		get_process_type_by_name(const char *proc_type_str);
560 
561 /* maintenance */
562 typedef enum
563 {
564 	TIMEPERIOD_TYPE_ONETIME = 0,
565 /*	TIMEPERIOD_TYPE_HOURLY,*/
566 	TIMEPERIOD_TYPE_DAILY = 2,
567 	TIMEPERIOD_TYPE_WEEKLY,
568 	TIMEPERIOD_TYPE_MONTHLY
569 }
570 zbx_timeperiod_type_t;
571 
572 typedef enum
573 {
574 	MAINTENANCE_TYPE_NORMAL = 0,
575 	MAINTENANCE_TYPE_NODATA
576 }
577 zbx_maintenance_type_t;
578 
579 typedef enum
580 {
581 	ZBX_PROTOTYPE_STATUS_ENABLED,
582 	ZBX_PROTOTYPE_STATUS_DISABLED,
583 	ZBX_PROTOTYPE_STATUS_COUNT
584 }
585 zbx_prototype_status_t;
586 
587 typedef enum
588 {
589 	ZBX_PROTOTYPE_DISCOVER,
590 	ZBX_PROTOTYPE_NO_DISCOVER,
591 	ZBX_PROTOTYPE_DISCOVER_COUNT
592 }
593 zbx_prototype_discover_t;
594 
595 /* regular expressions */
596 #define EXPRESSION_TYPE_INCLUDED	0
597 #define EXPRESSION_TYPE_ANY_INCLUDED	1
598 #define EXPRESSION_TYPE_NOT_INCLUDED	2
599 #define EXPRESSION_TYPE_TRUE		3
600 #define EXPRESSION_TYPE_FALSE		4
601 
602 #define ZBX_IGNORE_CASE			0
603 #define ZBX_CASE_SENSITIVE		1
604 
605 /* HTTP tests statuses */
606 #define HTTPTEST_STATUS_MONITORED	0
607 #define HTTPTEST_STATUS_NOT_MONITORED	1
608 
609 /* discovery rule */
610 #define DRULE_STATUS_MONITORED		0
611 #define DRULE_STATUS_NOT_MONITORED	1
612 
613 /* host statuses */
614 #define HOST_STATUS_MONITORED		0
615 #define HOST_STATUS_NOT_MONITORED	1
616 /*#define HOST_STATUS_UNREACHABLE	2*/
617 #define HOST_STATUS_TEMPLATE		3
618 /*#define HOST_STATUS_DELETED		4*/
619 #define HOST_STATUS_PROXY_ACTIVE	5
620 #define HOST_STATUS_PROXY_PASSIVE	6
621 
622 /* host maintenance status */
623 #define HOST_MAINTENANCE_STATUS_OFF	0
624 #define HOST_MAINTENANCE_STATUS_ON	1
625 
626 /* host inventory mode */
627 #define HOST_INVENTORY_DISABLED		-1	/* the host has no record in host_inventory */
628 						/* only in server code, never in DB */
629 #define HOST_INVENTORY_MANUAL		0
630 #define HOST_INVENTORY_AUTOMATIC	1
631 #define HOST_INVENTORY_COUNT		2
632 
633 #define HOST_INVENTORY_FIELD_COUNT	70
634 
635 /* host availability */
636 #define HOST_AVAILABLE_UNKNOWN		0
637 #define HOST_AVAILABLE_TRUE		1
638 #define HOST_AVAILABLE_FALSE		2
639 
640 /* trigger statuses */
641 #define TRIGGER_STATUS_ENABLED		0
642 #define TRIGGER_STATUS_DISABLED		1
643 
644 /* trigger types */
645 #define TRIGGER_TYPE_NORMAL		0
646 #define TRIGGER_TYPE_MULTIPLE_TRUE	1
647 
648 /* trigger values */
649 #define TRIGGER_VALUE_OK		0
650 #define TRIGGER_VALUE_PROBLEM		1
651 #define TRIGGER_VALUE_UNKNOWN		2	/* only in server code, never in DB */
652 #define TRIGGER_VALUE_NONE		3	/* only in server code, never in DB */
653 const char	*zbx_trigger_value_string(unsigned char value);
654 
655 /* trigger states */
656 #define TRIGGER_STATE_NORMAL		0
657 #define TRIGGER_STATE_UNKNOWN		1
658 const char	*zbx_trigger_state_string(unsigned char state);
659 
660 /* trigger severity */
661 #define TRIGGER_SEVERITY_NOT_CLASSIFIED	0
662 #define TRIGGER_SEVERITY_INFORMATION	1
663 #define TRIGGER_SEVERITY_WARNING	2
664 #define TRIGGER_SEVERITY_AVERAGE	3
665 #define TRIGGER_SEVERITY_HIGH		4
666 #define TRIGGER_SEVERITY_DISASTER	5
667 #define TRIGGER_SEVERITY_COUNT		6	/* number of trigger severities */
668 
669 /* trigger recovery mode */
670 #define TRIGGER_RECOVERY_MODE_EXPRESSION		0
671 #define TRIGGER_RECOVERY_MODE_RECOVERY_EXPRESSION	1
672 #define TRIGGER_RECOVERY_MODE_NONE			2
673 
674 #define ITEM_LOGTYPE_INFORMATION	1
675 #define ITEM_LOGTYPE_WARNING		2
676 #define ITEM_LOGTYPE_ERROR		4
677 #define ITEM_LOGTYPE_FAILURE_AUDIT	7
678 #define ITEM_LOGTYPE_SUCCESS_AUDIT	8
679 #define ITEM_LOGTYPE_CRITICAL		9
680 #define ITEM_LOGTYPE_VERBOSE		10
681 const char	*zbx_item_logtype_string(unsigned char logtype);
682 
683 /* media statuses */
684 #define MEDIA_STATUS_ACTIVE	0
685 #define MEDIA_STATUS_DISABLED	1
686 
687 /* action statuses */
688 #define ACTION_STATUS_ACTIVE	0
689 #define ACTION_STATUS_DISABLED	1
690 
691 /* action escalation processing mode */
692 #define ACTION_PAUSE_SUPPRESSED_FALSE	0	/* process escalation for suppressed events */
693 #define ACTION_PAUSE_SUPPRESSED_TRUE	1	/* pause escalation for suppressed events */
694 
695 /* max number of retries for alerts */
696 #define ALERT_MAX_RETRIES	3
697 
698 /* media type statuses */
699 #define MEDIA_TYPE_STATUS_ACTIVE	0
700 #define MEDIA_TYPE_STATUS_DISABLED	1
701 
702 /* SMTP security options */
703 #define SMTP_SECURITY_NONE	0
704 #define SMTP_SECURITY_STARTTLS	1
705 #define SMTP_SECURITY_SSL	2
706 
707 /* SMTP authentication options */
708 #define SMTP_AUTHENTICATION_NONE		0
709 #define SMTP_AUTHENTICATION_NORMAL_PASSWORD	1
710 
711 /* operation types */
712 #define OPERATION_TYPE_MESSAGE		0
713 #define OPERATION_TYPE_COMMAND		1
714 #define OPERATION_TYPE_HOST_ADD		2
715 #define OPERATION_TYPE_HOST_REMOVE	3
716 #define OPERATION_TYPE_GROUP_ADD	4
717 #define OPERATION_TYPE_GROUP_REMOVE	5
718 #define OPERATION_TYPE_TEMPLATE_ADD	6
719 #define OPERATION_TYPE_TEMPLATE_REMOVE	7
720 #define OPERATION_TYPE_HOST_ENABLE	8
721 #define OPERATION_TYPE_HOST_DISABLE	9
722 #define OPERATION_TYPE_HOST_INVENTORY	10
723 #define OPERATION_TYPE_RECOVERY_MESSAGE	11
724 #define OPERATION_TYPE_ACK_MESSAGE	12
725 
726 /* normal and recovery operations */
727 #define ZBX_OPERATION_MODE_NORMAL	0
728 #define ZBX_OPERATION_MODE_RECOVERY	1
729 #define ZBX_OPERATION_MODE_ACK		2
730 
731 /* algorithms for service status calculation */
732 #define SERVICE_ALGORITHM_NONE	0
733 #define SERVICE_ALGORITHM_MAX	1
734 #define SERVICE_ALGORITHM_MIN	2
735 
736 /* HTTP item types */
737 #define ZBX_HTTPITEM_TYPE_RSPCODE	0
738 #define ZBX_HTTPITEM_TYPE_TIME		1
739 #define ZBX_HTTPITEM_TYPE_SPEED		2
740 #define ZBX_HTTPITEM_TYPE_LASTSTEP	3
741 #define ZBX_HTTPITEM_TYPE_LASTERROR	4
742 
743 /* proxy_history flags */
744 #define PROXY_HISTORY_FLAG_META		0x01
745 #define PROXY_HISTORY_FLAG_NOVALUE	0x02
746 
747 #define PROXY_HISTORY_MASK_NOVALUE	(PROXY_HISTORY_FLAG_META | PROXY_HISTORY_FLAG_NOVALUE)
748 
749 /* global correlation constants */
750 #define ZBX_CORRELATION_ENABLED				0
751 #define ZBX_CORRELATION_DISABLED			1
752 
753 #define ZBX_CORR_CONDITION_OLD_EVENT_TAG		0
754 #define ZBX_CORR_CONDITION_NEW_EVENT_TAG		1
755 #define ZBX_CORR_CONDITION_NEW_EVENT_HOSTGROUP		2
756 #define ZBX_CORR_CONDITION_EVENT_TAG_PAIR		3
757 #define ZBX_CORR_CONDITION_OLD_EVENT_TAG_VALUE		4
758 #define ZBX_CORR_CONDITION_NEW_EVENT_TAG_VALUE		5
759 
760 #define ZBX_CORR_OPERATION_CLOSE_OLD			0
761 #define ZBX_CORR_OPERATION_CLOSE_NEW			1
762 
763 /* trigger correlation modes */
764 #define ZBX_TRIGGER_CORRELATION_NONE	0
765 #define ZBX_TRIGGER_CORRELATION_TAG	1
766 
767 /* acknowledgement actions (flags) */
768 #define ZBX_PROBLEM_UPDATE_CLOSE		0x0001
769 #define ZBX_PROBLEM_UPDATE_ACKNOWLEDGE		0x0002
770 #define ZBX_PROBLEM_UPDATE_MESSAGE		0x0004
771 #define ZBX_PROBLEM_UPDATE_SEVERITY		0x0008
772 #define ZBX_PROBLEM_UPDATE_UNACKNOWLEDGE	0x0010
773 
774 #define ZBX_PROBLEM_UPDATE_ACTION_COUNT	5
775 
776 /* database double precision upgrade states */
777 #define ZBX_DB_DBL_PRECISION_DISABLED	0
778 #define ZBX_DB_DBL_PRECISION_ENABLED	1
779 
780 #define ZBX_USER_ONLINE_TIME	600
781 
782 /* user permissions */
783 typedef enum
784 {
785 	USER_TYPE_ZABBIX_USER = 1,
786 	USER_TYPE_ZABBIX_ADMIN,
787 	USER_TYPE_SUPER_ADMIN
788 }
789 zbx_user_type_t;
790 
791 typedef struct
792 {
793 	zbx_uint64_t	userid;
794 	zbx_user_type_t	type;
795 }
796 zbx_user_t;
797 
798 typedef enum
799 {
800 	PERM_DENY = 0,
801 	PERM_READ = 2,
802 	PERM_READ_WRITE
803 }
804 zbx_user_permission_t;
805 
806 const char	*zbx_permission_string(int perm);
807 
808 typedef struct
809 {
810 	unsigned char	type;
811 	unsigned char	execute_on;
812 	char		*port;
813 	unsigned char	authtype;
814 	char		*username;
815 	char		*password;
816 	char		*publickey;
817 	char		*privatekey;
818 	char		*command;
819 	char		*command_orig;
820 	zbx_uint64_t	scriptid;
821 	unsigned char	host_access;
822 }
823 zbx_script_t;
824 
825 #define ZBX_SCRIPT_TYPE_CUSTOM_SCRIPT	0
826 #define ZBX_SCRIPT_TYPE_IPMI		1
827 #define ZBX_SCRIPT_TYPE_SSH		2
828 #define ZBX_SCRIPT_TYPE_TELNET		3
829 #define ZBX_SCRIPT_TYPE_GLOBAL_SCRIPT	4
830 
831 #define ZBX_SCRIPT_EXECUTE_ON_AGENT	0
832 #define ZBX_SCRIPT_EXECUTE_ON_SERVER	1
833 #define ZBX_SCRIPT_EXECUTE_ON_PROXY	2	/* fall back to execution on server if target not monitored by proxy */
834 
835 #define POLLER_DELAY		5
836 #define DISCOVERER_DELAY	60
837 
838 #define HOUSEKEEPER_STARTUP_DELAY	30	/* in minutes */
839 
840 #define	GET_SENDER_TIMEOUT	60
841 
842 #ifndef MAX
843 #	define MAX(a, b) ((a) > (b) ? (a) : (b))
844 #endif
845 
846 #ifndef MIN
847 #	define MIN(a, b) ((a) < (b) ? (a) : (b))
848 #endif
849 
850 #define zbx_calloc(old, nmemb, size)	zbx_calloc2(__FILE__, __LINE__, old, nmemb, size)
851 #define zbx_malloc(old, size)		zbx_malloc2(__FILE__, __LINE__, old, size)
852 #define zbx_realloc(src, size)		zbx_realloc2(__FILE__, __LINE__, src, size)
853 #define zbx_strdup(old, str)		zbx_strdup2(__FILE__, __LINE__, old, str)
854 
855 #define ZBX_STRDUP(var, str)	(var = zbx_strdup(var, str))
856 
857 void	*zbx_calloc2(const char *filename, int line, void *old, size_t nmemb, size_t size);
858 void	*zbx_malloc2(const char *filename, int line, void *old, size_t size);
859 void	*zbx_realloc2(const char *filename, int line, void *old, size_t size);
860 char	*zbx_strdup2(const char *filename, int line, char *old, const char *str);
861 
862 void	*zbx_guaranteed_memset(void *v, int c, size_t n);
863 
864 #define zbx_free(ptr)		\
865 				\
866 do				\
867 {				\
868 	if (ptr)		\
869 	{			\
870 		free(ptr);	\
871 		ptr = NULL;	\
872 	}			\
873 }				\
874 while (0)
875 
876 #define zbx_fclose(file)	\
877 				\
878 do				\
879 {				\
880 	if (file)		\
881 	{			\
882 		fclose(file);	\
883 		file = NULL;	\
884 	}			\
885 }				\
886 while (0)
887 
888 #define THIS_SHOULD_NEVER_HAPPEN										\
889 														\
890 do														\
891 {														\
892 	zbx_error("ERROR [file and function: <%s,%s>, revision:%s, line:%d] Something impossible has just"	\
893 			" happened.", __FILE__, __func__, ZABBIX_REVISION, __LINE__);				\
894 	zbx_backtrace();											\
895 }														\
896 while (0)
897 
898 extern const char	*progname;
899 extern const char	title_message[];
900 extern const char	syslog_app_name[];
901 extern const char	*usage_message[];
902 extern const char	*help_message[];
903 
904 #define ARRSIZE(a)	(sizeof(a) / sizeof(*a))
905 
906 void	help(void);
907 void	usage(void);
908 void	version(void);
909 
910 const char	*get_program_name(const char *path);
911 
912 typedef enum
913 {
914 	ZBX_TASK_START = 0,
915 	ZBX_TASK_PRINT_SUPPORTED,
916 	ZBX_TASK_TEST_METRIC,
917 	ZBX_TASK_SHOW_USAGE,
918 	ZBX_TASK_SHOW_VERSION,
919 	ZBX_TASK_SHOW_HELP,
920 #ifdef _WINDOWS
921 	ZBX_TASK_INSTALL_SERVICE,
922 	ZBX_TASK_UNINSTALL_SERVICE,
923 	ZBX_TASK_START_SERVICE,
924 	ZBX_TASK_STOP_SERVICE
925 #else
926 	ZBX_TASK_RUNTIME_CONTROL
927 #endif
928 }
929 zbx_task_t;
930 
931 #define ZBX_RTC_LOG_LEVEL_INCREASE	1
932 #define ZBX_RTC_LOG_LEVEL_DECREASE	2
933 #define ZBX_RTC_HOUSEKEEPER_EXECUTE	3
934 #define ZBX_RTC_CONFIG_CACHE_RELOAD	8
935 #define ZBX_RTC_SNMP_CACHE_RELOAD	9
936 #define ZBX_RTC_DIAGINFO		10
937 
938 typedef enum
939 {
940 	HTTPTEST_AUTH_NONE = 0,
941 	HTTPTEST_AUTH_BASIC,
942 	HTTPTEST_AUTH_NTLM,
943 	HTTPTEST_AUTH_NEGOTIATE
944 }
945 zbx_httptest_auth_t;
946 
947 #define ZBX_TASK_FLAG_MULTIPLE_AGENTS	0x01
948 #define ZBX_TASK_FLAG_FOREGROUND	0x02
949 
950 typedef struct
951 {
952 	zbx_task_t	task;
953 	int		flags;
954 	int		data;
955 }
956 ZBX_TASK_EX;
957 
958 #define NET_DELAY_MAX	(SEC_PER_MIN / 4)
959 
960 typedef struct
961 {
962 	int	values_num;
963 	int	period_end;
964 #define ZBX_PROXY_SUPPRESS_DISABLE	0x00
965 #define ZBX_PROXY_SUPPRESS_ACTIVE	0x01
966 #define ZBX_PROXY_SUPPRESS_MORE		0x02
967 #define ZBX_PROXY_SUPPRESS_EMPTY	0x04
968 #define ZBX_PROXY_SUPPRESS_ENABLE	(	\
969 		ZBX_PROXY_SUPPRESS_ACTIVE |	\
970 		ZBX_PROXY_SUPPRESS_MORE |	\
971 		ZBX_PROXY_SUPPRESS_EMPTY)
972 	int	flags;
973 }
974 zbx_proxy_suppress_t;
975 
976 #define ZBX_RTC_MSG_SHIFT	0
977 #define ZBX_RTC_SCOPE_SHIFT	8
978 #define ZBX_RTC_DATA_SHIFT	16
979 
980 #define ZBX_RTC_MSG_MASK	0x000000ff
981 #define ZBX_RTC_SCOPE_MASK	0x0000ff00
982 #define ZBX_RTC_DATA_MASK	0xffff0000
983 
984 #define ZBX_RTC_GET_MSG(task)	(int)((task & ZBX_RTC_MSG_MASK) >> ZBX_RTC_MSG_SHIFT)
985 #define ZBX_RTC_GET_SCOPE(task)	(int)((task & ZBX_RTC_SCOPE_MASK) >> ZBX_RTC_SCOPE_SHIFT)
986 #define ZBX_RTC_GET_DATA(task)	(int)((task & ZBX_RTC_DATA_MASK) >> ZBX_RTC_DATA_SHIFT)
987 
988 #define ZBX_RTC_MAKE_MESSAGE(msg, scope, data)	((msg << ZBX_RTC_MSG_SHIFT) | (scope << ZBX_RTC_SCOPE_SHIFT) | \
989 	(data << ZBX_RTC_DATA_SHIFT))
990 
991 char	*string_replace(const char *str, const char *sub_str1, const char *sub_str2);
992 
993 #define ZBX_FLAG_DOUBLE_PLAIN	0x00
994 #define ZBX_FLAG_DOUBLE_SUFFIX	0x01
995 int	is_double_suffix(const char *str, unsigned char flags);
996 int	is_double(const char *str, double *value);
997 #define ZBX_LENGTH_UNLIMITED	0x7fffffff
998 int	is_time_suffix(const char *str, int *value, int length);
999 int	is_uint_n_range(const char *str, size_t n, void *value, size_t size, zbx_uint64_t min, zbx_uint64_t max);
1000 int	is_hex_n_range(const char *str, size_t n, void *value, size_t size, zbx_uint64_t min, zbx_uint64_t max);
1001 
1002 #define ZBX_SIZE_T_MAX	(~(size_t)0)
1003 
1004 #define is_ushort(str, value) \
1005 	is_uint_n_range(str, ZBX_SIZE_T_MAX, value, sizeof(unsigned short), 0x0, 0xFFFF)
1006 
1007 #define is_uint32(str, value) \
1008 	is_uint_n_range(str, ZBX_SIZE_T_MAX, value, 4, 0x0, 0xFFFFFFFF)
1009 
1010 #define is_uint64(str, value) \
1011 	is_uint_n_range(str, ZBX_SIZE_T_MAX, value, 8, 0x0, __UINT64_C(0xFFFFFFFFFFFFFFFF))
1012 
1013 #define is_uint64_n(str, n, value) \
1014 	is_uint_n_range(str, n, value, 8, 0x0, __UINT64_C(0xFFFFFFFFFFFFFFFF))
1015 
1016 #define is_uint31(str, value) \
1017 	is_uint_n_range(str, ZBX_SIZE_T_MAX, value, 4, 0x0, 0x7FFFFFFF)
1018 
1019 #define ZBX_MAX_UINT31_1	0x7FFFFFFE
1020 #define is_uint31_1(str, value) \
1021 	is_uint_n_range(str, ZBX_SIZE_T_MAX, value, 4, 0x0, ZBX_MAX_UINT31_1)
1022 
1023 #define is_uint_range(str, value, min, max) \
1024 	is_uint_n_range(str, ZBX_SIZE_T_MAX, value, sizeof(unsigned int), min, max)
1025 
1026 int	is_boolean(const char *str, zbx_uint64_t *value);
1027 int	is_uoct(const char *str);
1028 int	is_uhex(const char *str);
1029 int	is_hex_string(const char *str);
1030 int	is_ascii_string(const char *str);
1031 int	zbx_rtrim(char *str, const char *charlist);
1032 void	zbx_ltrim(char *str, const char *charlist);
1033 void	zbx_lrtrim(char *str, const char *charlist);
1034 void	zbx_trim_integer(char *str);
1035 void	zbx_trim_float(char *str);
1036 void	zbx_remove_chars(char *str, const char *charlist);
1037 char	*zbx_str_printable_dyn(const char *text);
1038 #define ZBX_WHITESPACE			" \t\r\n"
1039 #define zbx_remove_whitespace(str)	zbx_remove_chars(str, ZBX_WHITESPACE)
1040 void	del_zeros(char *s);
1041 int	get_param(const char *p, int num, char *buf, size_t max_len, zbx_request_parameter_type_t *type);
1042 int	num_param(const char *p);
1043 char	*get_param_dyn(const char *p, int num, zbx_request_parameter_type_t *type);
1044 
1045 /******************************************************************************
1046  *                                                                            *
1047  * Purpose: replaces an item key, SNMP OID or their parameters                *
1048  *                                                                            *
1049  * Parameters:                                                                *
1050  *      data      - [IN] an item key, SNMP OID or their parameter             *
1051  *      key_type  - [IN] ZBX_KEY_TYPE_*                                       *
1052  *      level     - [IN] for item keys and OIDs the level will be 0;          *
1053  *                       for their parameters - 1 or higher (for arrays)      *
1054  *      num       - [IN] parameter number; for item keys and OIDs the level   *
1055  *                       will be 0; for their parameters - 1 or higher        *
1056  *      quoted    - [IN] 1 if parameter is quoted; 0 - otherwise              *
1057  *      cb_data   - [IN] callback function custom data                        *
1058  *      param     - [OUT] replaced item key string                            *
1059  *                                                                            *
1060  * Return value: SUCCEED - if parameter doesn't change or has been changed    *
1061  *                         successfully                                       *
1062  *               FAIL    - otherwise                                          *
1063  *                                                                            *
1064  * Comments: The new string should be quoted if it contains special           *
1065  *           characters                                                       *
1066  *                                                                            *
1067  ******************************************************************************/
1068 typedef int	(*replace_key_param_f)(const char *data, int key_type, int level, int num, int quoted, void *cb_data,
1069 		char **param);
1070 #define ZBX_KEY_TYPE_ITEM	0
1071 #define ZBX_KEY_TYPE_OID	1
1072 int	replace_key_params_dyn(char **data, int key_type, replace_key_param_f cb, void *cb_data, char *error,
1073 		size_t maxerrlen);
1074 
1075 void	remove_param(char *param, int num);
1076 int	get_key_param(char *param, int num, char *buf, size_t max_len);
1077 int	num_key_param(char *param);
1078 size_t	zbx_get_escape_string_len(const char *src, const char *charlist);
1079 char	*zbx_dyn_escape_string(const char *src, const char *charlist);
1080 int	zbx_escape_string(char *dst, size_t len, const char *src, const char *charlist);
1081 
1082 typedef struct zbx_custom_interval	zbx_custom_interval_t;
1083 int	zbx_interval_preproc(const char *interval_str, int *simple_interval, zbx_custom_interval_t **custom_intervals,
1084 		char **error);
1085 int	zbx_validate_interval(const char *str, char **error);
1086 void	zbx_custom_interval_free(zbx_custom_interval_t *custom_intervals);
1087 int	calculate_item_nextcheck(zbx_uint64_t seed, int item_type, int simple_interval,
1088 		const zbx_custom_interval_t *custom_intervals, time_t now);
1089 int	calculate_item_nextcheck_unreachable(int simple_interval, const zbx_custom_interval_t *custom_intervals,
1090 		time_t disable_until);
1091 time_t	calculate_proxy_nextcheck(zbx_uint64_t hostid, unsigned int delay, time_t now);
1092 int	zbx_check_time_period(const char *period, time_t time, int *res);
1093 void	zbx_hex2octal(const char *input, char **output, int *olen);
1094 int	str_in_list(const char *list, const char *value, char delimiter);
1095 char	*str_linefeed(const char *src, size_t maxline, const char *delim);
1096 void	zbx_strarr_init(char ***arr);
1097 void	zbx_strarr_add(char ***arr, const char *entry);
1098 void	zbx_strarr_free(char **arr);
1099 
1100 #if defined(__GNUC__) || defined(__clang__)
1101 #	define __zbx_attr_format_printf(idx1, idx2) __attribute__((__format__(__printf__, (idx1), (idx2))))
1102 #else
1103 #	define __zbx_attr_format_printf(idx1, idx2)
1104 #endif
1105 
1106 void	zbx_setproctitle(const char *fmt, ...) __zbx_attr_format_printf(1, 2);
1107 
1108 #define ZBX_KIBIBYTE		1024
1109 #define ZBX_MEBIBYTE		1048576
1110 #define ZBX_GIBIBYTE		1073741824
1111 #define ZBX_TEBIBYTE		__UINT64_C(1099511627776)
1112 
1113 #define SEC_PER_MIN		60
1114 #define SEC_PER_HOUR		3600
1115 #define SEC_PER_DAY		86400
1116 #define SEC_PER_WEEK		(7 * SEC_PER_DAY)
1117 #define SEC_PER_MONTH		(30 * SEC_PER_DAY)
1118 #define SEC_PER_YEAR		(365 * SEC_PER_DAY)
1119 #define ZBX_JAN_2038		2145916800
1120 #define ZBX_JAN_1970_IN_SEC	2208988800.0	/* 1970 - 1900 in seconds */
1121 
1122 #define ZBX_MAX_RECV_DATA_SIZE		(1 * ZBX_GIBIBYTE)
1123 #if defined(_WINDOWS)
1124 #define ZBX_MAX_RECV_LARGE_DATA_SIZE	(1 * ZBX_GIBIBYTE)
1125 #else
1126 #define ZBX_MAX_RECV_LARGE_DATA_SIZE	(__UINT64_C(16) * ZBX_GIBIBYTE)
1127 #endif
1128 
1129 /* max length of base64 data */
1130 #define ZBX_MAX_B64_LEN		(16 * ZBX_KIBIBYTE)
1131 
1132 double		zbx_time(void);
1133 void		zbx_timespec(zbx_timespec_t *ts);
1134 double		zbx_current_time(void);
1135 void		zbx_get_time(struct tm *tm, long *milliseconds, zbx_timezone_t *tz);
1136 long		zbx_get_timezone_offset(time_t t, struct tm *tm);
1137 int		zbx_utc_time(int year, int mon, int mday, int hour, int min, int sec, int *t);
1138 int		zbx_day_in_month(int year, int mon);
1139 zbx_uint64_t	zbx_get_duration_ms(const zbx_timespec_t *ts);
1140 
1141 void	zbx_error(const char *fmt, ...) __zbx_attr_format_printf(1, 2);
1142 
1143 size_t	zbx_snprintf(char *str, size_t count, const char *fmt, ...) __zbx_attr_format_printf(3, 4);
1144 
1145 void	zbx_snprintf_alloc(char **str, size_t *alloc_len, size_t *offset, const char *fmt, ...)
1146 		__zbx_attr_format_printf(4, 5);
1147 
1148 size_t	zbx_vsnprintf(char *str, size_t count, const char *fmt, va_list args);
1149 
1150 void	zbx_strncpy_alloc(char **str, size_t *alloc_len, size_t *offset, const char *src, size_t n);
1151 void	zbx_strcpy_alloc(char **str, size_t *alloc_len, size_t *offset, const char *src);
1152 void	zbx_chrcpy_alloc(char **str, size_t *alloc_len, size_t *offset, char c);
1153 void	zbx_str_memcpy_alloc(char **str, size_t *alloc_len, size_t *offset, const char *src, size_t n);
1154 
1155 void	zbx_strsplit(const char *src, char delimiter, char **left, char **right);
1156 
1157 /* secure string copy */
1158 #define strscpy(x, y)	zbx_strlcpy(x, y, sizeof(x))
1159 #define strscat(x, y)	zbx_strlcat(x, y, sizeof(x))
1160 size_t	zbx_strlcpy(char *dst, const char *src, size_t siz);
1161 void	zbx_strlcat(char *dst, const char *src, size_t siz);
1162 size_t	zbx_strlcpy_utf8(char *dst, const char *src, size_t size);
1163 
1164 char	*zbx_dvsprintf(char *dest, const char *f, va_list args);
1165 
1166 char	*zbx_dsprintf(char *dest, const char *f, ...) __zbx_attr_format_printf(2, 3);
1167 char	*zbx_strdcat(char *dest, const char *src);
1168 char	*zbx_strdcatf(char *dest, const char *f, ...) __zbx_attr_format_printf(2, 3);
1169 
1170 int	xml_get_data_dyn(const char *xml, const char *tag, char **data);
1171 void	xml_free_data_dyn(char **data);
1172 char	*xml_escape_dyn(const char *data);
1173 void	xml_escape_xpath(char **data);
1174 
1175 int	comms_parse_response(char *xml, char *host, size_t host_len, char *key, size_t key_len,
1176 		char *data, size_t data_len, char *lastlogsize, size_t lastlogsize_len,
1177 		char *timestamp, size_t timestamp_len, char *source, size_t source_len,
1178 		char *severity, size_t severity_len);
1179 
1180 /* misc functions */
1181 int	is_ip6(const char *ip);
1182 int	is_ip4(const char *ip);
1183 int	is_supported_ip(const char *ip);
1184 int	is_ip(const char *ip);
1185 
1186 int	zbx_validate_hostname(const char *hostname);
1187 
1188 void	zbx_on_exit(int ret); /* calls exit() at the end! */
1189 void	zbx_backtrace(void);
1190 
1191 int	int_in_list(char *list, int value);
1192 int	ip_in_list(const char *list, const char *ip);
1193 
1194 #define VALUE_ERRMSG_MAX	128
1195 const char	*zbx_truncate_itemkey(const char *key, const size_t char_max, char *buf, const size_t buf_len);
1196 const char	*zbx_truncate_value(const char *val, const size_t char_max, char *buf, const size_t buf_len);
1197 
1198 const char	*zbx_print_double(char *buffer, size_t size, double val);
1199 
1200 /* IP range support */
1201 #define ZBX_IPRANGE_V4	0
1202 #define ZBX_IPRANGE_V6	1
1203 
1204 #define ZBX_IPRANGE_GROUPS_V4	4
1205 #define ZBX_IPRANGE_GROUPS_V6	8
1206 
1207 typedef struct
1208 {
1209 	int	from;
1210 	int	to;
1211 }
1212 zbx_range_t;
1213 
1214 typedef struct
1215 {
1216 	/* contains groups of ranges for either ZBX_IPRANGE_V4 or ZBX_IPRANGE_V6 */
1217 	/* ex. 127-127.0-0.0-0.2-254 (from-to.from-to.from-to.from-to)           */
1218 	/*                                  0       1       2       3            */
1219 	zbx_range_t	range[ZBX_IPRANGE_GROUPS_V6];
1220 
1221 	/* range type - ZBX_IPRANGE_V4 or ZBX_IPRANGE_V6 */
1222 	unsigned char	type;
1223 
1224 	/* 1 if the range was defined with network mask, 0 otherwise */
1225 	unsigned char   mask;
1226 }
1227 zbx_iprange_t;
1228 
1229 int	iprange_parse(zbx_iprange_t *iprange, const char *address);
1230 void	iprange_first(const zbx_iprange_t *iprange, int *address);
1231 int	iprange_next(const zbx_iprange_t *iprange, int *address);
1232 int	iprange_validate(const zbx_iprange_t *iprange, const int *address);
1233 zbx_uint64_t	iprange_volume(const zbx_iprange_t *iprange);
1234 
1235 /* time related functions */
1236 char	*zbx_age2str(int age);
1237 char	*zbx_date2str(time_t date);
1238 char	*zbx_time2str(time_t time);
1239 
1240 #define ZBX_NULL2STR(str)	(NULL != str ? str : "(null)")
1241 #define ZBX_NULL2EMPTY_STR(str)	(NULL != (str) ? (str) : "")
1242 
1243 char	*zbx_strcasestr(const char *haystack, const char *needle);
1244 int	cmp_key_id(const char *key_1, const char *key_2);
1245 int	zbx_strncasecmp(const char *s1, const char *s2, size_t n);
1246 
1247 int	get_nearestindex(const void *p, size_t sz, int num, zbx_uint64_t id);
1248 int	uint64_array_add(zbx_uint64_t **values, int *alloc, int *num, zbx_uint64_t value, int alloc_step);
1249 int	uint64_array_exists(const zbx_uint64_t *values, int num, zbx_uint64_t value);
1250 void	uint64_array_remove(zbx_uint64_t *values, int *num, const zbx_uint64_t *rm_values, int rm_num);
1251 
1252 const char	*zbx_event_value_string(unsigned char source, unsigned char object, unsigned char value);
1253 
1254 #if defined(_WINDOWS) || defined(__MINGW32__)
1255 const OSVERSIONINFOEX	*zbx_win_getversion(void);
1256 void	zbx_wmi_get(const char *wmi_namespace, const char *wmi_query, double timeout, char **utf8_value);
1257 wchar_t	*zbx_acp_to_unicode(const char *acp_string);
1258 wchar_t	*zbx_oemcp_to_unicode(const char *oemcp_string);
1259 int	zbx_acp_to_unicode_static(const char *acp_string, wchar_t *wide_string, int wide_size);
1260 wchar_t	*zbx_utf8_to_unicode(const char *utf8_string);
1261 char	*zbx_unicode_to_utf8(const wchar_t *wide_string);
1262 char	*zbx_unicode_to_utf8_static(const wchar_t *wide_string, char *utf8_string, int utf8_size);
1263 int	_wis_uint(const wchar_t *wide_string);
1264 #endif
1265 void	zbx_strlower(char *str);
1266 void	zbx_strupper(char *str);
1267 #if defined(_WINDOWS) || defined(__MINGW32__) || defined(HAVE_ICONV)
1268 char	*convert_to_utf8(char *in, size_t in_size, const char *encoding);
1269 #endif	/* HAVE_ICONV */
1270 #define ZBX_MAX_BYTES_IN_UTF8_CHAR	4
1271 size_t	zbx_utf8_char_len(const char *text);
1272 size_t	zbx_strlen_utf8(const char *text);
1273 size_t	zbx_strlen_utf8_nchars(const char *text, size_t utf8_maxlen);
1274 size_t	zbx_strlen_utf8_nbytes(const char *text, size_t maxlen);
1275 size_t	zbx_charcount_utf8_nbytes(const char *text, size_t maxlen);
1276 
1277 int	zbx_is_utf8(const char *text);
1278 #define ZBX_UTF8_REPLACE_CHAR	'?'
1279 void	zbx_replace_invalid_utf8(char *text);
1280 
1281 int	zbx_cesu8_to_utf8(const char *cesu8, char **utf8);
1282 
1283 void	dos2unix(char *str);
1284 int	str2uint64(const char *str, const char *suffixes, zbx_uint64_t *value);
1285 double	str2double(const char *str);
1286 
1287 /* time and memory size suffixes */
1288 #define ZBX_UNIT_SYMBOLS	"KMGTsmhdw"
1289 zbx_uint64_t	suffix2factor(char c);
1290 
1291 #if defined(_WINDOWS)
1292 typedef struct __stat64	zbx_stat_t;
1293 int	__zbx_stat(const char *path, zbx_stat_t *buf);
1294 int	__zbx_open(const char *pathname, int flags);
1295 #else
1296 typedef struct stat	zbx_stat_t;
1297 #endif	/* _WINDOWS */
1298 
1299 typedef struct
1300 {
1301 	zbx_fs_time_t	modification_time;	/* time of last modification */
1302 	zbx_fs_time_t	access_time;		/* time of last access */
1303 	zbx_fs_time_t	change_time;		/* time of last status change */
1304 }
1305 zbx_file_time_t;
1306 
1307 int	zbx_get_file_time(const char *path, zbx_file_time_t *time);
1308 void	find_cr_lf_szbyte(const char *encoding, const char **cr, const char **lf, size_t *szbyte);
1309 int	zbx_read(int fd, char *buf, size_t count, const char *encoding);
1310 int	zbx_is_regular_file(const char *path);
1311 char	*zbx_fgets(char *buffer, int size, FILE *fp);
1312 
1313 int	MAIN_ZABBIX_ENTRY(int flags);
1314 
1315 zbx_uint64_t	zbx_letoh_uint64(zbx_uint64_t data);
1316 zbx_uint64_t	zbx_htole_uint64(zbx_uint64_t data);
1317 
1318 zbx_uint32_t	zbx_letoh_uint32(zbx_uint32_t data);
1319 zbx_uint32_t	zbx_htole_uint32(zbx_uint32_t data);
1320 
1321 int	zbx_check_hostname(const char *hostname, char **error);
1322 
1323 int	is_hostname_char(unsigned char c);
1324 int	is_key_char(unsigned char c);
1325 int	is_function_char(unsigned char c);
1326 int	is_macro_char(unsigned char c);
1327 
1328 int	is_discovery_macro(const char *name);
1329 
1330 int	is_time_function(const char *func);
1331 int	is_snmp_type(unsigned char type);
1332 
1333 int	parse_key(const char **exp);
1334 
1335 int	parse_host_key(char *exp, char **host, char **key);
1336 
1337 void	make_hostname(char *host);
1338 
1339 int	zbx_number_parse(const char *number, int *len);
1340 int	zbx_suffixed_number_parse(const char *number, int *len);
1341 
1342 unsigned char	get_interface_type_by_item_type(unsigned char type);
1343 
1344 int	calculate_sleeptime(int nextcheck, int max_sleeptime);
1345 
1346 void	zbx_replace_string(char **data, size_t l, size_t *r, const char *value);
1347 int	zbx_replace_mem_dyn(char **data, size_t *data_alloc, size_t *data_len, size_t offset, size_t sz_to,
1348 		const char *from, size_t sz_from);
1349 
1350 void	zbx_trim_str_list(char *list, char delimiter);
1351 
1352 int	parse_serveractive_element(char *str, char **host, unsigned short *port, unsigned short port_default);
1353 
1354 int	zbx_strcmp_null(const char *s1, const char *s2);
1355 
1356 #define ZBX_MACRO_REGEX_PREFIX		"regex:"
1357 
1358 int	zbx_user_macro_parse(const char *macro, int *macro_r, int *context_l, int *context_r,
1359 		unsigned char *context_op);
1360 int	zbx_user_macro_parse_dyn(const char *macro, char **name, char **context, int *length,
1361 		unsigned char *context_op);
1362 char	*zbx_user_macro_unquote_context_dyn(const char *context, int len);
1363 char	*zbx_user_macro_quote_context_dyn(const char *context, int force_quote);
1364 
1365 #define ZBX_SESSION_ACTIVE	0
1366 #define ZBX_SESSION_PASSIVE	1
1367 
1368 char	*zbx_dyn_escape_shell_single_quote(const char *arg);
1369 
1370 #define ZBX_DO_NOT_SEND_RESPONSE	0
1371 #define ZBX_SEND_RESPONSE		1
1372 
1373 /* Do not forget to synchronize HOST_TLS_* definitions with DB schema ! */
1374 #define HOST_TLS_ISSUER_LEN		4096				/* for up to 1024 UTF-8 characters */
1375 #define HOST_TLS_ISSUER_LEN_MAX		(HOST_TLS_ISSUER_LEN + 1)
1376 #define HOST_TLS_SUBJECT_LEN		4096				/* for up to 1024 UTF-8 characters */
1377 #define HOST_TLS_SUBJECT_LEN_MAX	(HOST_TLS_SUBJECT_LEN + 1)
1378 #define HOST_TLS_PSK_IDENTITY_LEN	512				/* for up to 128 UTF-8 characters */
1379 #define HOST_TLS_PSK_IDENTITY_LEN_MAX	(HOST_TLS_PSK_IDENTITY_LEN + 1)
1380 #define HOST_TLS_PSK_LEN		512				/* for up to 256 hex-encoded bytes (ASCII) */
1381 #define HOST_TLS_PSK_LEN_MAX		(HOST_TLS_PSK_LEN + 1)
1382 #define HOST_TLS_PSK_LEN_MIN		32				/* for 16 hex-encoded bytes (128-bit PSK) */
1383 
1384 #define ZBX_PSK_FOR_HOST		0x01				/* PSK can be used for a known host */
1385 #define ZBX_PSK_FOR_AUTOREG		0x02				/* PSK can be used for host autoregistration */
1386 #define ZBX_PSK_FOR_PROXY		0x04				/* PSK is configured on proxy */
1387 
1388 void	zbx_function_param_parse(const char *expr, size_t *param_pos, size_t *length, size_t *sep_pos);
1389 char	*zbx_function_param_unquote_dyn(const char *param, size_t len, int *quoted);
1390 int	zbx_function_param_quote(char **param, int forced);
1391 int	zbx_function_validate_parameters(const char *expr, size_t *length);
1392 int	zbx_function_find(const char *expr, size_t *func_pos, size_t *par_l, size_t *par_r,
1393 		char *error, int max_error_len);
1394 char	*zbx_function_get_param_dyn(const char *params, int Nparam);
1395 
1396 void	zbx_alarm_flag_set(void);
1397 void	zbx_alarm_flag_clear(void);
1398 
1399 #ifndef _WINDOWS
1400 unsigned int	zbx_alarm_on(unsigned int seconds);
1401 unsigned int	zbx_alarm_off(void);
1402 #endif
1403 
1404 int	zbx_alarm_timed_out(void);
1405 
1406 #define zbx_bsearch(key, base, nmemb, size, compar)	(0 == (nmemb) ? NULL : bsearch(key, base, nmemb, size, compar))
1407 
1408 int	zbx_strcmp_natural(const char *s1, const char *s2);
1409 
1410 /* tokens used in expressions */
1411 #define ZBX_TOKEN_OBJECTID		0x00001
1412 #define ZBX_TOKEN_MACRO			0x00002
1413 #define ZBX_TOKEN_LLD_MACRO		0x00004
1414 #define ZBX_TOKEN_USER_MACRO		0x00008
1415 #define ZBX_TOKEN_FUNC_MACRO		0x00010
1416 #define ZBX_TOKEN_SIMPLE_MACRO		0x00020
1417 #define ZBX_TOKEN_REFERENCE		0x00040
1418 #define ZBX_TOKEN_LLD_FUNC_MACRO	0x00080
1419 
1420 /* additional token flags */
1421 #define ZBX_TOKEN_TRIGGER	0x004000
1422 #define ZBX_TOKEN_NUMERIC	0x008000
1423 #define ZBX_TOKEN_JSON		0x010000
1424 #define ZBX_TOKEN_REGEXP	0x040000
1425 #define ZBX_TOKEN_XPATH		0x080000
1426 #define ZBX_TOKEN_REGEXP_OUTPUT	0x100000
1427 #define ZBX_TOKEN_PROMETHEUS	0x200000
1428 #define ZBX_TOKEN_JSONPATH	0x400000
1429 #define ZBX_TOKEN_STR_REPLACE	0x800000
1430 
1431 /* location of a substring */
1432 typedef struct
1433 {
1434 	/* left position */
1435 	size_t	l;
1436 	/* right position */
1437 	size_t	r;
1438 }
1439 zbx_strloc_t;
1440 
1441 /* data used by macros, ldd macros and objectid tokens */
1442 typedef struct
1443 {
1444 	zbx_strloc_t	name;
1445 }
1446 zbx_token_macro_t;
1447 
1448 /* data used by user macros */
1449 typedef struct
1450 {
1451 	/* macro name */
1452 	zbx_strloc_t	name;
1453 	/* macro context, for macros without context the context.l and context.r fields are set to 0 */
1454 	zbx_strloc_t	context;
1455 }
1456 zbx_token_user_macro_t;
1457 
1458 /* data used by macro functions */
1459 typedef struct
1460 {
1461 	/* the macro including the opening and closing brackets {}, for example: {ITEM.VALUE} */
1462 	zbx_strloc_t	macro;
1463 	/* function + parameters, for example: regsub("([0-9]+)", \1) */
1464 	zbx_strloc_t	func;
1465 	/* parameters, for example: ("([0-9]+)", \1) */
1466 	zbx_strloc_t	func_param;
1467 }
1468 zbx_token_func_macro_t;
1469 
1470 /* data used by simple (host:key) macros */
1471 typedef struct
1472 {
1473 	/* host name, supporting simple macros as a host name, for example Zabbix server or {HOST.HOST} */
1474 	zbx_strloc_t	host;
1475 	/* key + parameters, supporting {ITEM.KEYn} macro, for example system.uname or {ITEM.KEY1}  */
1476 	zbx_strloc_t	key;
1477 	/* function + parameters, for example avg(5m) */
1478 	zbx_strloc_t	func;
1479 	/* parameters, for example (5m) */
1480 	zbx_strloc_t	func_param;
1481 }
1482 zbx_token_simple_macro_t;
1483 
1484 /* data used by references */
1485 typedef struct
1486 {
1487 	/* index of constant being referenced (1 for $1, 2 for $2, ..., 9 for $9) */
1488 	int	index;
1489 }
1490 zbx_token_reference_t;
1491 
1492 /* the token type specific data */
1493 typedef union
1494 {
1495 	zbx_token_macro_t		objectid;
1496 	zbx_token_macro_t		macro;
1497 	zbx_token_macro_t		lld_macro;
1498 	zbx_token_user_macro_t		user_macro;
1499 	zbx_token_func_macro_t		func_macro;
1500 	zbx_token_func_macro_t		lld_func_macro;
1501 	zbx_token_simple_macro_t	simple_macro;
1502 	zbx_token_reference_t		reference;
1503 }
1504 zbx_token_data_t;
1505 
1506 /* {} token data */
1507 typedef struct
1508 {
1509 	/* token type, see ZBX_TOKEN_ defines */
1510 	int			type;
1511 	/* the token location in expression including opening and closing brackets {} */
1512 	zbx_strloc_t		loc;
1513 	/* the token type specific data */
1514 	zbx_token_data_t	data;
1515 }
1516 zbx_token_t;
1517 
1518 typedef enum
1519 {
1520 	ZBX_TOKEN_SEARCH_BASIC,
1521 	ZBX_TOKEN_SEARCH_REFERENCES
1522 }
1523 zbx_token_search_t;
1524 
1525 int	zbx_token_find(const char *expression, int pos, zbx_token_t *token, zbx_token_search_t token_search);
1526 int	zbx_strmatch_condition(const char *value, const char *pattern, unsigned char op);
1527 
1528 int	zbx_expression_next_constant(const char *str, size_t pos, zbx_strloc_t *loc);
1529 char	*zbx_expression_extract_constant(const char *src, const zbx_strloc_t *loc);
1530 
1531 #define ZBX_COMPONENT_VERSION(major, minor)	((major << 16) | minor)
1532 #define ZBX_COMPONENT_VERSION_MAJOR(version)	(version >> 16)
1533 #define ZBX_COMPONENT_VERSION_MINOR(version)	(version & 0xFFFF)
1534 
1535 #define ZBX_PREPROC_MULTIPLIER			1
1536 #define ZBX_PREPROC_RTRIM			2
1537 #define ZBX_PREPROC_LTRIM			3
1538 #define ZBX_PREPROC_TRIM			4
1539 #define ZBX_PREPROC_REGSUB			5
1540 #define ZBX_PREPROC_BOOL2DEC			6
1541 #define ZBX_PREPROC_OCT2DEC			7
1542 #define ZBX_PREPROC_HEX2DEC			8
1543 #define ZBX_PREPROC_DELTA_VALUE			9
1544 #define ZBX_PREPROC_DELTA_SPEED			10
1545 #define ZBX_PREPROC_XPATH			11
1546 #define ZBX_PREPROC_JSONPATH			12
1547 #define ZBX_PREPROC_VALIDATE_RANGE		13
1548 #define ZBX_PREPROC_VALIDATE_REGEX		14
1549 #define ZBX_PREPROC_VALIDATE_NOT_REGEX		15
1550 #define ZBX_PREPROC_ERROR_FIELD_JSON		16
1551 #define ZBX_PREPROC_ERROR_FIELD_XML		17
1552 #define ZBX_PREPROC_ERROR_FIELD_REGEX		18
1553 #define ZBX_PREPROC_THROTTLE_VALUE		19
1554 #define ZBX_PREPROC_THROTTLE_TIMED_VALUE	20
1555 #define ZBX_PREPROC_SCRIPT			21
1556 #define ZBX_PREPROC_PROMETHEUS_PATTERN		22
1557 #define ZBX_PREPROC_PROMETHEUS_TO_JSON		23
1558 #define ZBX_PREPROC_CSV_TO_JSON			24
1559 #define ZBX_PREPROC_STR_REPLACE			25
1560 
1561 /* custom on fail actions */
1562 #define ZBX_PREPROC_FAIL_DEFAULT	0
1563 #define ZBX_PREPROC_FAIL_DISCARD_VALUE	1
1564 #define ZBX_PREPROC_FAIL_SET_VALUE	2
1565 #define ZBX_PREPROC_FAIL_SET_ERROR	3
1566 
1567 /* internal on fail actions */
1568 #define ZBX_PREPROC_FAIL_FORCE_ERROR	4
1569 
1570 #define ZBX_HTTPFIELD_HEADER		0
1571 #define ZBX_HTTPFIELD_VARIABLE		1
1572 #define ZBX_HTTPFIELD_POST_FIELD	2
1573 #define ZBX_HTTPFIELD_QUERY_FIELD	3
1574 
1575 #define ZBX_POSTTYPE_RAW		0
1576 #define ZBX_POSTTYPE_FORM		1
1577 #define ZBX_POSTTYPE_JSON		2
1578 #define ZBX_POSTTYPE_XML		3
1579 
1580 #define ZBX_RETRIEVE_MODE_CONTENT	0
1581 #define ZBX_RETRIEVE_MODE_HEADERS	1
1582 #define ZBX_RETRIEVE_MODE_BOTH		2
1583 
1584 zbx_log_value_t	*zbx_log_value_dup(const zbx_log_value_t *src);
1585 
1586 typedef union
1587 {
1588 	zbx_uint64_t	ui64;
1589 	double		dbl;
1590 
1591 	/* null terminated string */
1592 	char		*str;
1593 
1594 	/* length prefixed (4 bytes) binary data */
1595 	void		*bin;
1596 }
1597 zbx_variant_data_t;
1598 
1599 typedef struct
1600 {
1601 	unsigned char		type;
1602 	zbx_variant_data_t	data;
1603 }
1604 zbx_variant_t;
1605 
1606 #define ZBX_VARIANT_NONE	0
1607 #define ZBX_VARIANT_STR		1
1608 #define ZBX_VARIANT_DBL		2
1609 #define ZBX_VARIANT_UI64	3
1610 #define ZBX_VARIANT_BIN		4
1611 
1612 void	zbx_variant_clear(zbx_variant_t *value);
1613 void	zbx_variant_set_none(zbx_variant_t *value);
1614 void	zbx_variant_set_str(zbx_variant_t *value, char *text);
1615 void	zbx_variant_set_dbl(zbx_variant_t *value, double value_dbl);
1616 void	zbx_variant_set_ui64(zbx_variant_t *value, zbx_uint64_t value_ui64);
1617 void	zbx_variant_set_bin(zbx_variant_t *value, void *value_bin);
1618 void	zbx_variant_copy(zbx_variant_t *value, const zbx_variant_t *source);
1619 int	zbx_variant_set_numeric(zbx_variant_t *value, const char *text);
1620 
1621 int	zbx_variant_convert(zbx_variant_t *value, int type);
1622 const char	*zbx_get_variant_type_desc(unsigned char type);
1623 const char	*zbx_variant_value_desc(const zbx_variant_t *value);
1624 const char	*zbx_variant_type_desc(const zbx_variant_t *value);
1625 
1626 int	zbx_variant_compare(const zbx_variant_t *value1, const zbx_variant_t *value2);
1627 
1628 void	*zbx_variant_data_bin_copy(const void *bin);
1629 void	*zbx_variant_data_bin_create(const void *data, zbx_uint32_t size);
1630 zbx_uint32_t	zbx_variant_data_bin_get(const void *bin, void **data);
1631 
1632 int	zbx_validate_value_dbl(double value, int dbl_precision);
1633 
1634 void	zbx_update_env(double time_now);
1635 int	zbx_get_agent_item_nextcheck(zbx_uint64_t itemid, const char *delay, unsigned char state, int now,
1636 		int refresh_unsupported, int *nextcheck, char **error);
1637 
1638 #define ZBX_DATA_SESSION_TOKEN_SIZE	(MD5_DIGEST_SIZE * 2)
1639 char	*zbx_create_token(zbx_uint64_t seed);
1640 
1641 #define ZBX_MAINTENANCE_IDLE		0
1642 #define ZBX_MAINTENANCE_RUNNING		1
1643 
1644 #define ZBX_PROBLEM_SUPPRESSED_FALSE	0
1645 #define ZBX_PROBLEM_SUPPRESSED_TRUE	1
1646 
1647 int	zbx_variant_to_value_type(zbx_variant_t *value, unsigned char value_type, int dbl_precision, char **errmsg);
1648 
1649 #if defined(_WINDOWS) || defined(__MINGW32__)
1650 #define ZBX_PCRE_RECURSION_LIMIT	2000	/* assume ~1 MB stack and ~500 bytes per recursion */
1651 #endif
1652 
1653 int	zbx_str_extract(const char *text, size_t len, char **value);
1654 
1655 #define AUDIT_ACTION_EXECUTE	7
1656 #define AUDIT_RESOURCE_SCRIPT	25
1657 
1658 void	zbx_md5buf2str(const md5_byte_t *md5, char *str);
1659 int	zbx_hex2bin(const unsigned char *p_hex, unsigned char *buf, int buf_len);
1660 
1661 int	zbx_xmlnode_to_json(void *xml_node, char **jstr);
1662 int	zbx_xml_to_json(char *xml_data, char **jstr, char **errmsg);
1663 #ifdef HAVE_LIBXML2
1664 int	zbx_open_xml(char *data, int options, int maxerrlen, void **xml_doc, void **root_node, char **errmsg);
1665 int	zbx_check_xml_memory(char *mem, int maxerrlen, char **errmsg);
1666 #endif
1667 
1668 #endif
1669