You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

829 lines
24 KiB

/*
** Zabbix
** Copyright (C) 2001-2023 Zabbix SIA
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 2 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
**/
#ifndef ZABBIX_COMMON_H
#define ZABBIX_COMMON_H
#include "zbxsysinc.h"
#include "module.h"
#include "version.h"
#if defined(__MINGW32__)
# define __try
# define __except(x) if (0)
#endif
#ifndef va_copy
# if defined(__va_copy)
# define va_copy(d, s) __va_copy(d, s)
# else
# define va_copy(d, s) memcpy(&d, &s, sizeof(va_list))
# endif
#endif
#ifdef snprintf
# undef snprintf
#endif
#define snprintf ERROR_DO_NOT_USE_SNPRINTF_FUNCTION_TRY_TO_USE_ZBX_SNPRINTF
#ifdef sprintf
# undef sprintf
#endif
#define sprintf ERROR_DO_NOT_USE_SPRINTF_FUNCTION_TRY_TO_USE_ZBX_SNPRINTF
#ifdef strncpy
# undef strncpy
#endif
#define strncpy ERROR_DO_NOT_USE_STRNCPY_FUNCTION_TRY_TO_USE_ZBX_STRLCPY
#ifdef strcpy
# undef strcpy
#endif
#define strcpy ERROR_DO_NOT_USE_STRCPY_FUNCTION_TRY_TO_USE_ZBX_STRLCPY
#ifdef vsprintf
# undef vsprintf
#endif
#define vsprintf ERROR_DO_NOT_USE_VSPRINTF_FUNCTION_TRY_TO_USE_ZBX_VSNPRINTF
#ifdef strncat
# undef strncat
#endif
#define strncat ERROR_DO_NOT_USE_STRNCAT_FUNCTION_TRY_TO_USE_ZBX_STRLCAT
#ifdef strncasecmp
# undef strncasecmp
#endif
#define strncasecmp ERROR_DO_NOT_USE_STRNCASECMP_FUNCTION_TRY_TO_USE_ZBX_STRNCASECMP
#define ON 1
#define OFF 0
#if defined(_WINDOWS)
# define ZBX_SERVICE_NAME_LEN 64
extern char ZABBIX_SERVICE_NAME[ZBX_SERVICE_NAME_LEN];
extern char ZABBIX_EVENT_SOURCE[ZBX_SERVICE_NAME_LEN];
# pragma warning (disable: 4996) /* warning C4996: <function> was declared deprecated */
#endif
#if defined(__GNUC__) && __GNUC__ >= 7
# define ZBX_FALLTHROUGH __attribute__ ((fallthrough))
#else
# define ZBX_FALLTHROUGH
#endif
#define SUCCEED_OR_FAIL(result) (FAIL != (result) ? SUCCEED : FAIL)
const char *zbx_sysinfo_ret_string(int ret);
const char *zbx_result_string(int result);
#define MAX_ID_LEN 21
#define MAX_STRING_LEN 2048
#define MAX_BUFFER_LEN 65536
#define ZBX_MAX_HOSTNAME_LEN 128
#define ZBX_HOSTNAME_BUF_LEN (ZBX_MAX_HOSTNAME_LEN + 1)
#define ZBX_MAX_DNSNAME_LEN 255 /* maximum host DNS name length from RFC 1035 */
/*(without terminating '\0') */
#define MAX_EXECUTE_OUTPUT_LEN (512 * ZBX_KIBIBYTE)
#define ZBX_MAX_UINT64 (~__UINT64_C(0))
#define ZBX_MAX_UINT64_LEN 21
#define ZBX_MAX_DOUBLE_LEN 24
#define ZBX_SIZE_T_MAX (~(size_t)0)
/******************************************************************************
* *
* Macro: ZBX_UNUSED *
* *
* Purpose: silences compiler warning about unused function parameter *
* *
* Parameters: *
* var - [IN] the unused parameter *
* *
* Comments: Use only on unused, non-volatile function parameters! *
* *
******************************************************************************/
#define ZBX_UNUSED(var) (void)(var)
/* item types */
typedef enum
{
ITEM_TYPE_ZABBIX = 0,
/* ITEM_TYPE_SNMPv1,*/
ITEM_TYPE_TRAPPER = 2,
ITEM_TYPE_SIMPLE,
/* ITEM_TYPE_SNMPv2c,*/
ITEM_TYPE_INTERNAL = 5,
/* ITEM_TYPE_SNMPv3,*/
ITEM_TYPE_ZABBIX_ACTIVE = 7,
/* ITEM_TYPE_AGGREGATE, */
ITEM_TYPE_HTTPTEST = 9,
ITEM_TYPE_EXTERNAL,
ITEM_TYPE_DB_MONITOR,
ITEM_TYPE_IPMI,
ITEM_TYPE_SSH,
ITEM_TYPE_TELNET,
ITEM_TYPE_CALCULATED,
ITEM_TYPE_JMX,
ITEM_TYPE_SNMPTRAP,
ITEM_TYPE_DEPENDENT,
ITEM_TYPE_HTTPAGENT,
ITEM_TYPE_SNMP,
ITEM_TYPE_SCRIPT /* 21 */
}
zbx_item_type_t;
typedef enum
{
INTERFACE_TYPE_UNKNOWN = 0,
INTERFACE_TYPE_AGENT,
INTERFACE_TYPE_SNMP,
INTERFACE_TYPE_IPMI,
INTERFACE_TYPE_JMX,
INTERFACE_TYPE_OPT = 254,
INTERFACE_TYPE_ANY = 255
}
zbx_interface_type_t;
const char *zbx_interface_type_string(zbx_interface_type_t type);
#define INTERFACE_TYPE_COUNT 4 /* number of interface types */
extern const int INTERFACE_TYPE_PRIORITY[INTERFACE_TYPE_COUNT];
#define SNMP_BULK_DISABLED 0
#define SNMP_BULK_ENABLED 1
#define ZBX_IF_SNMP_VERSION_1 1
#define ZBX_IF_SNMP_VERSION_2 2
#define ZBX_IF_SNMP_VERSION_3 3
#define ZBX_FLAG_DISCOVERY_NORMAL 0x00
#define ZBX_FLAG_DISCOVERY_RULE 0x01
#define ZBX_FLAG_DISCOVERY_PROTOTYPE 0x02
#define ZBX_FLAG_DISCOVERY_CREATED 0x04
#define ZBX_HOST_PROT_INTERFACES_INHERIT 0
#define ZBX_HOST_PROT_INTERFACES_CUSTOM 1
typedef enum
{
ITEM_AUTHTYPE_PASSWORD = 0,
ITEM_AUTHTYPE_PUBLICKEY
}
zbx_item_authtype_t;
/* event status */
#define EVENT_STATUS_RESOLVED 0
#define EVENT_STATUS_PROBLEM 1
/* event sources */
#define EVENT_SOURCE_TRIGGERS 0
#define EVENT_SOURCE_DISCOVERY 1
#define EVENT_SOURCE_AUTOREGISTRATION 2
#define EVENT_SOURCE_INTERNAL 3
#define EVENT_SOURCE_SERVICE 4
#define EVENT_SOURCE_COUNT 5
/* event objects */
#define EVENT_OBJECT_TRIGGER 0
#define EVENT_OBJECT_DHOST 1
#define EVENT_OBJECT_DSERVICE 2
#define EVENT_OBJECT_ZABBIX_ACTIVE 3
#define EVENT_OBJECT_ITEM 4
#define EVENT_OBJECT_LLDRULE 5
#define EVENT_OBJECT_SERVICE 6
/* acknowledged flags */
#define EVENT_NOT_ACKNOWLEDGED 0
#define EVENT_ACKNOWLEDGED 1
typedef enum
{
DOBJECT_STATUS_UP = 0,
DOBJECT_STATUS_DOWN,
DOBJECT_STATUS_DISCOVER,
DOBJECT_STATUS_LOST
}
zbx_dstatus_t;
/* item value types */
typedef enum
{
ITEM_VALUE_TYPE_FLOAT = 0,
ITEM_VALUE_TYPE_STR,
ITEM_VALUE_TYPE_LOG,
ITEM_VALUE_TYPE_UINT64,
ITEM_VALUE_TYPE_TEXT,
ITEM_VALUE_TYPE_BIN, /* Last real value. In some places it is also used in size of array or */
/* upper bound for iteration. Do not forget to update when adding new types. */
ITEM_VALUE_TYPE_NONE /* Artificial value, not written into DB, used internally in server. */
}
zbx_item_value_type_t;
const char *zbx_item_value_type_string(zbx_item_value_type_t value_type);
typedef struct
{
int timestamp;
int logeventid;
int severity;
char *source;
char *value;
}
zbx_log_value_t;
/* value for not supported items */
#define ZBX_NOTSUPPORTED "ZBX_NOTSUPPORTED"
/* the error message for not supported items when reason is unknown */
#define ZBX_NOTSUPPORTED_MSG "Unknown error."
/* Zabbix Agent non-critical error (agents older than 2.0) */
#define ZBX_ERROR "ZBX_ERROR"
/* program type */
#define ZBX_PROGRAM_TYPE_SERVER 0x01
#define ZBX_PROGRAM_TYPE_PROXY_ACTIVE 0x02
#define ZBX_PROGRAM_TYPE_PROXY_PASSIVE 0x04
#define ZBX_PROGRAM_TYPE_PROXY 0x06 /* ZBX_PROGRAM_TYPE_PROXY_ACTIVE | ZBX_PROGRAM_TYPE_PROXY_PASSIVE */
#define ZBX_PROGRAM_TYPE_AGENTD 0x08
#define ZBX_PROGRAM_TYPE_SENDER 0x10
#define ZBX_PROGRAM_TYPE_GET 0x20
const char *get_program_type_string(unsigned char program_type);
/* process type */
#define ZBX_PROCESS_TYPE_POLLER 0
#define ZBX_PROCESS_TYPE_UNREACHABLE 1
#define ZBX_PROCESS_TYPE_IPMIPOLLER 2
#define ZBX_PROCESS_TYPE_PINGER 3
#define ZBX_PROCESS_TYPE_JAVAPOLLER 4
#define ZBX_PROCESS_TYPE_HTTPPOLLER 5
#define ZBX_PROCESS_TYPE_TRAPPER 6
#define ZBX_PROCESS_TYPE_SNMPTRAPPER 7
#define ZBX_PROCESS_TYPE_PROXYPOLLER 8
#define ZBX_PROCESS_TYPE_ESCALATOR 9
#define ZBX_PROCESS_TYPE_HISTSYNCER 10
#define ZBX_PROCESS_TYPE_DISCOVERER 11
#define ZBX_PROCESS_TYPE_ALERTER 12
#define ZBX_PROCESS_TYPE_TIMER 13
#define ZBX_PROCESS_TYPE_HOUSEKEEPER 14
#define ZBX_PROCESS_TYPE_DATASENDER 15
#define ZBX_PROCESS_TYPE_CONFSYNCER 16
#define ZBX_PROCESS_TYPE_SELFMON 17
#define ZBX_PROCESS_TYPE_VMWARE 18
#define ZBX_PROCESS_TYPE_COLLECTOR 19
#define ZBX_PROCESS_TYPE_LISTENER 20
#define ZBX_PROCESS_TYPE_ACTIVE_CHECKS 21
#define ZBX_PROCESS_TYPE_TASKMANAGER 22
#define ZBX_PROCESS_TYPE_IPMIMANAGER 23
#define ZBX_PROCESS_TYPE_ALERTMANAGER 24
#define ZBX_PROCESS_TYPE_PREPROCMAN 25
#define ZBX_PROCESS_TYPE_PREPROCESSOR 26
#define ZBX_PROCESS_TYPE_LLDMANAGER 27
#define ZBX_PROCESS_TYPE_LLDWORKER 28
#define ZBX_PROCESS_TYPE_ALERTSYNCER 29
#define ZBX_PROCESS_TYPE_HISTORYPOLLER 30
#define ZBX_PROCESS_TYPE_AVAILMAN 31
#define ZBX_PROCESS_TYPE_REPORTMANAGER 32
#define ZBX_PROCESS_TYPE_REPORTWRITER 33
#define ZBX_PROCESS_TYPE_SERVICEMAN 34
#define ZBX_PROCESS_TYPE_TRIGGERHOUSEKEEPER 35
#define ZBX_PROCESS_TYPE_ODBCPOLLER 36
#define ZBX_PROCESS_TYPE_CONNECTORMANAGER 37
#define ZBX_PROCESS_TYPE_CONNECTORWORKER 38
#define ZBX_PROCESS_TYPE_DISCOVERYMANAGER 39
#define ZBX_PROCESS_TYPE_HTTPAGENT_POLLER 40
#define ZBX_PROCESS_TYPE_AGENT_POLLER 41
#define ZBX_PROCESS_TYPE_SNMP_POLLER 42
#define ZBX_PROCESS_TYPE_COUNT 43 /* number of process types */
/* special processes that are not present worker list */
#define ZBX_PROCESS_TYPE_EXT_FIRST 126
#define ZBX_PROCESS_TYPE_HA_MANAGER 126
#define ZBX_PROCESS_TYPE_MAIN 127
#define ZBX_PROCESS_TYPE_EXT_LAST 127
#define ZBX_PROCESS_TYPE_UNKNOWN 255
const char *get_process_type_string(unsigned char proc_type);
int get_process_type_by_name(const char *proc_type_str);
/* user permissions */
typedef enum
{
USER_TYPE_ZABBIX_USER = 1,
USER_TYPE_ZABBIX_ADMIN,
USER_TYPE_SUPER_ADMIN
}
zbx_user_type_t;
typedef struct
{
zbx_uint64_t userid;
zbx_user_type_t type;
zbx_uint64_t roleid;
char *username;
}
zbx_user_t;
typedef enum
{
PERM_DENY = 0,
PERM_READ = 2,
PERM_READ_WRITE
}
zbx_user_permission_t;
typedef struct
{
unsigned char type;
unsigned char execute_on;
char *port;
unsigned char authtype;
char *username;
char *password;
char *publickey;
char *privatekey;
char *command;
char *command_orig;
zbx_uint64_t scriptid;
unsigned char host_access;
int timeout;
}
zbx_script_t;
#define ZBX_SCRIPT_TYPE_CUSTOM_SCRIPT 0
#define ZBX_SCRIPT_TYPE_IPMI 1
#define ZBX_SCRIPT_TYPE_SSH 2
#define ZBX_SCRIPT_TYPE_TELNET 3
#define ZBX_SCRIPT_TYPE_WEBHOOK 5
#define ZBX_SCRIPT_SCOPE_ACTION 1
#define ZBX_SCRIPT_SCOPE_HOST 2
#define ZBX_SCRIPT_SCOPE_EVENT 4
#define ZBX_SCRIPT_EXECUTE_ON_AGENT 0
#define ZBX_SCRIPT_EXECUTE_ON_SERVER 1
#define ZBX_SCRIPT_EXECUTE_ON_PROXY 2 /* fall back to execution on server if target not monitored by proxy */
#define POLLER_DELAY 5
#define DISCOVERER_DELAY 5
#define HOUSEKEEPER_STARTUP_DELAY 30 /* in minutes */
#define ZBX_DEFAULT_INTERVAL SEC_PER_MIN
#define GET_SENDER_TIMEOUT 60
#ifndef MAX
# define MAX(a, b) ((a) > (b) ? (a) : (b))
#endif
#ifndef MIN
# define MIN(a, b) ((a) < (b) ? (a) : (b))
#endif
#define zbx_calloc(old, nmemb, size) zbx_calloc2(__FILE__, __LINE__, old, nmemb, size)
#define zbx_malloc(old, size) zbx_malloc2(__FILE__, __LINE__, old, size)
#define zbx_realloc(src, size) zbx_realloc2(__FILE__, __LINE__, src, size)
#define zbx_strdup(old, str) zbx_strdup2(__FILE__, __LINE__, old, str)
#define ZBX_STRDUP(var, str) (var = zbx_strdup(var, str))
void *zbx_calloc2(const char *filename, int line, void *old, size_t nmemb, size_t size);
void *zbx_malloc2(const char *filename, int line, void *old, size_t size);
void *zbx_realloc2(const char *filename, int line, void *old, size_t size);
char *zbx_strdup2(const char *filename, int line, char *old, const char *str);
void *zbx_guaranteed_memset(void *v, int c, size_t n);
#if defined(_WINDOWS) || defined(__MINGW32__)
# define zbx_get_thread_id() (long int)GetCurrentThreadId()
#else
# define zbx_get_thread_id() (long int)getpid()
#endif
#define zbx_free(ptr) \
\
do \
{ \
if (ptr) \
{ \
free(ptr); \
ptr = NULL; \
} \
} \
while (0)
#define zbx_fclose(file) \
\
do \
{ \
if (file) \
{ \
fclose(file); \
file = NULL; \
} \
} \
while (0)
#define THIS_SHOULD_NEVER_HAPPEN \
\
do \
{ \
zbx_error("ERROR [file and function: <%s,%s>, revision:%s, line:%d] Something impossible has just" \
" happened.", __FILE__, __func__, ZABBIX_REVISION, __LINE__); \
zbx_backtrace(); \
} \
while (0)
/* to avoid dependency on libzbxnix.a */
#define THIS_SHOULD_NEVER_HAPPEN_NO_BACKTRACE \
zbx_error("ERROR [file and function: <%s,%s>, revision:%s, line:%d] Something impossible has just" \
" happened.", __FILE__, __func__, ZABBIX_REVISION, __LINE__)
extern const char *progname;
extern const char title_message[];
extern const char syslog_app_name[];
extern const char *usage_message[];
extern const char *help_message[];
#define ARRSIZE(a) (sizeof(a) / sizeof(*a))
void zbx_help(void);
void zbx_usage(void);
void zbx_version(void);
const char *get_program_name(const char *path);
typedef unsigned char (*zbx_get_program_type_f)(void);
typedef const char *(*zbx_get_progname_f)(void);
typedef int (*zbx_get_config_forks_f)(unsigned char process_type);
typedef const char *(*zbx_get_config_str_f)(void);
typedef int (*zbx_get_config_int_f)(void);
typedef enum
{
ZBX_TASK_START = 0,
ZBX_TASK_PRINT_SUPPORTED,
ZBX_TASK_TEST_METRIC,
ZBX_TASK_SHOW_USAGE,
ZBX_TASK_SHOW_VERSION,
ZBX_TASK_SHOW_HELP,
#ifdef _WINDOWS
ZBX_TASK_INSTALL_SERVICE,
ZBX_TASK_UNINSTALL_SERVICE,
ZBX_TASK_START_SERVICE,
ZBX_TASK_STOP_SERVICE
#else
ZBX_TASK_RUNTIME_CONTROL
#endif
}
zbx_task_t;
typedef enum
{
HTTPTEST_AUTH_NONE = 0,
HTTPTEST_AUTH_BASIC,
HTTPTEST_AUTH_NTLM,
HTTPTEST_AUTH_NEGOTIATE,
HTTPTEST_AUTH_DIGEST,
HTTPTEST_AUTH_BEARER
}
zbx_httptest_auth_t;
#define ZBX_TASK_FLAG_MULTIPLE_AGENTS 0x01
#define ZBX_TASK_FLAG_FOREGROUND 0x02
typedef struct
{
zbx_task_t task;
unsigned int flags;
int data;
char *opts;
}
ZBX_TASK_EX;
#define NET_DELAY_MAX (SEC_PER_MIN / 4)
typedef struct
{
int values_num;
int period_end;
#define ZBX_PROXY_SUPPRESS_DISABLE 0x00
#define ZBX_PROXY_SUPPRESS_ACTIVE 0x01
#define ZBX_PROXY_SUPPRESS_MORE 0x02
#define ZBX_PROXY_SUPPRESS_EMPTY 0x04
#define ZBX_PROXY_SUPPRESS_ENABLE ( \
ZBX_PROXY_SUPPRESS_ACTIVE | \
ZBX_PROXY_SUPPRESS_MORE | \
ZBX_PROXY_SUPPRESS_EMPTY)
int flags;
}
zbx_proxy_suppress_t;
#define ZBX_RTC_MSG_SHIFT 0
#define ZBX_RTC_SCOPE_SHIFT 8
#define ZBX_RTC_DATA_SHIFT 16
#define ZBX_RTC_MSG_MASK 0x000000ff
#define ZBX_RTC_SCOPE_MASK 0x0000ff00
#define ZBX_RTC_DATA_MASK 0xffff0000
#define ZBX_RTC_GET_MSG(task) (int)(((unsigned int)task & ZBX_RTC_MSG_MASK) >> ZBX_RTC_MSG_SHIFT)
#define ZBX_RTC_GET_SCOPE(task) (int)(((unsigned int)task & ZBX_RTC_SCOPE_MASK) >> ZBX_RTC_SCOPE_SHIFT)
#define ZBX_RTC_GET_DATA(task) (int)(((unsigned int)task & ZBX_RTC_DATA_MASK) >> ZBX_RTC_DATA_SHIFT)
#define ZBX_RTC_MAKE_MESSAGE(msg, scope, data) (((zbx_uint32_t)msg << ZBX_RTC_MSG_SHIFT) | \
((zbx_uint32_t)scope << ZBX_RTC_SCOPE_SHIFT) | \
((zbx_uint32_t)data << ZBX_RTC_DATA_SHIFT))
#define ZBX_KIBIBYTE 1024
#define ZBX_MEBIBYTE 1048576
#define ZBX_GIBIBYTE 1073741824
#define ZBX_TEBIBYTE __UINT64_C(1099511627776)
#define SEC_PER_MIN 60
#define SEC_PER_HOUR 3600
#define SEC_PER_DAY 86400
#define SEC_PER_WEEK (7 * SEC_PER_DAY)
#define SEC_PER_MONTH (30 * SEC_PER_DAY)
#define SEC_PER_YEAR (365 * SEC_PER_DAY)
#define ZBX_JAN_2038 2145916800
#define ZBX_JAN_1970_IN_SEC 2208988800.0 /* 1970 - 1900 in seconds */
#define ZBX_MAX_RECV_DATA_SIZE (1 * ZBX_GIBIBYTE)
#if defined(_WINDOWS)
#define ZBX_MAX_RECV_LARGE_DATA_SIZE (1 * ZBX_GIBIBYTE)
#else
#define ZBX_MAX_RECV_LARGE_DATA_SIZE (__UINT64_C(16) * ZBX_GIBIBYTE)
#endif
/* max length of base64 data */
#define ZBX_MAX_B64_LEN (16 * ZBX_KIBIBYTE)
/* string functions that could not be moved into libzbxstr.a because they */
/* are used by libzbxcommon.a */
/* used by log which will be part of common*/
#if defined(__GNUC__) || defined(__clang__)
# define __zbx_attr_format_printf(idx1, idx2) __attribute__((__format__(__printf__, (idx1), (idx2))))
#else
# define __zbx_attr_format_printf(idx1, idx2)
#endif
/* used by cuid and also by log */
size_t zbx_snprintf(char *str, size_t count, const char *fmt, ...) __zbx_attr_format_printf(3, 4);
/* could be moved into libzbxstr.a but it seems to be logically grouped with surrounding functions */
void zbx_snprintf_alloc(char **str, size_t *alloc_len, size_t *offset, const char *fmt, ...)
__zbx_attr_format_printf(4, 5);
/* used by log */
size_t zbx_vsnprintf(char *str, size_t count, const char *fmt, va_list args);
/* used by log */
char *zbx_dsprintf(char *dest, const char *f, ...) __zbx_attr_format_printf(2, 3);
/* used by zbxcommon, setproctitle */
size_t zbx_strlcpy(char *dst, const char *src, size_t siz);
/* used by dsprintf, which is used by log */
char *zbx_dvsprintf(char *dest, const char *f, va_list args);
#define VALUE_ERRMSG_MAX 128
#define ZBX_LENGTH_UNLIMITED 0x7fffffff
#if defined(_WINDOWS) || defined(__MINGW32__)
wchar_t *zbx_acp_to_unicode(const char *acp_string);
wchar_t *zbx_utf8_to_unicode(const char *utf8_string);
wchar_t *zbx_oemcp_to_unicode(const char *oemcp_string);
#endif
/* string functions that could not be moved into libzbxstr.a because they */
/* are used by libzbxcommon.a END */
char **zbx_setproctitle_init(int argc, char **argv);
void zbx_setproctitle(const char *fmt, ...) __zbx_attr_format_printf(1, 2);
void zbx_setproctitle_deinit(void);
void zbx_error(const char *fmt, ...) __zbx_attr_format_printf(1, 2);
/* misc functions */
int zbx_validate_hostname(const char *hostname);
void zbx_backtrace(void);
int get_nearestindex(const void *p, size_t sz, int num, zbx_uint64_t id);
int uint64_array_add(zbx_uint64_t **values, int *alloc, int *num, zbx_uint64_t value, int alloc_step);
void uint64_array_remove(zbx_uint64_t *values, int *num, const zbx_uint64_t *rm_values, int rm_num);
#if defined(_WINDOWS) || defined(__MINGW32__)
const OSVERSIONINFOEX *zbx_win_getversion(void);
void zbx_wmi_get(const char *wmi_namespace, const char *wmi_query, double timeout, char **utf8_value);
#endif
#if defined(_WINDOWS) || defined(__MINGW32__)
typedef struct __stat64 zbx_stat_t;
int __zbx_stat(const char *path, zbx_stat_t *buf);
#else
typedef struct stat zbx_stat_t;
#endif /* _WINDOWS */
int MAIN_ZABBIX_ENTRY(int flags);
unsigned char get_interface_type_by_item_type(unsigned char type);
#define ZBX_SESSION_ACTIVE 0
#define ZBX_SESSION_PASSIVE 1
#define ZBX_AUTH_TOKEN_ENABLED 0
#define ZBX_AUTH_TOKEN_DISABLED 1
#define ZBX_AUTH_TOKEN_NEVER_EXPIRES 0
#define ZBX_DO_NOT_SEND_RESPONSE 0
#define ZBX_SEND_RESPONSE 1
/* Do not forget to synchronize HOST_TLS_* definitions with DB schema ! */
#define HOST_TLS_ISSUER_LEN 4096 /* for up to 1024 UTF-8 characters */
#define HOST_TLS_ISSUER_LEN_MAX (HOST_TLS_ISSUER_LEN + 1)
#define HOST_TLS_SUBJECT_LEN 4096 /* for up to 1024 UTF-8 characters */
#define HOST_TLS_SUBJECT_LEN_MAX (HOST_TLS_SUBJECT_LEN + 1)
#define HOST_TLS_PSK_IDENTITY_LEN 512 /* for up to 128 UTF-8 characters */
#define HOST_TLS_PSK_IDENTITY_LEN_MAX (HOST_TLS_PSK_IDENTITY_LEN + 1)
#define HOST_TLS_PSK_LEN 512 /* for up to 256 hex-encoded bytes (ASCII) */
#define HOST_TLS_PSK_LEN_MAX (HOST_TLS_PSK_LEN + 1)
#define HOST_TLS_PSK_LEN_MIN 32 /* for 16 hex-encoded bytes (128-bit PSK) */
#define ZBX_PSK_FOR_HOST 0x01 /* PSK can be used for a known host */
#define ZBX_PSK_FOR_AUTOREG 0x02 /* PSK can be used for host autoregistration */
#define ZBX_PSK_FOR_PROXY 0x04 /* PSK is configured on proxy */
void zbx_alarm_flag_set(void);
void zbx_alarm_flag_clear(void);
#ifndef _WINDOWS
unsigned int zbx_alarm_on(unsigned int seconds);
unsigned int zbx_alarm_off(void);
#endif
int zbx_alarm_timed_out(void);
#define zbx_bsearch(key, base, nmemb, size, compar) (0 == (nmemb) ? NULL : bsearch(key, base, nmemb, size, compar))
#define ZBX_PREPROC_NONE 0
#define ZBX_PREPROC_MULTIPLIER 1
#define ZBX_PREPROC_RTRIM 2
#define ZBX_PREPROC_LTRIM 3
#define ZBX_PREPROC_TRIM 4
#define ZBX_PREPROC_REGSUB 5
#define ZBX_PREPROC_BOOL2DEC 6
#define ZBX_PREPROC_OCT2DEC 7
#define ZBX_PREPROC_HEX2DEC 8
#define ZBX_PREPROC_DELTA_VALUE 9
#define ZBX_PREPROC_DELTA_SPEED 10
#define ZBX_PREPROC_XPATH 11
#define ZBX_PREPROC_JSONPATH 12
#define ZBX_PREPROC_VALIDATE_RANGE 13
#define ZBX_PREPROC_VALIDATE_REGEX 14
#define ZBX_PREPROC_VALIDATE_NOT_REGEX 15
#define ZBX_PREPROC_ERROR_FIELD_JSON 16
#define ZBX_PREPROC_ERROR_FIELD_XML 17
#define ZBX_PREPROC_ERROR_FIELD_REGEX 18
#define ZBX_PREPROC_THROTTLE_VALUE 19
#define ZBX_PREPROC_THROTTLE_TIMED_VALUE 20
#define ZBX_PREPROC_SCRIPT 21
#define ZBX_PREPROC_PROMETHEUS_PATTERN 22
#define ZBX_PREPROC_PROMETHEUS_TO_JSON 23
#define ZBX_PREPROC_CSV_TO_JSON 24
#define ZBX_PREPROC_STR_REPLACE 25
#define ZBX_PREPROC_VALIDATE_NOT_SUPPORTED 26
#define ZBX_PREPROC_XML_TO_JSON 27
#define ZBX_PREPROC_SNMP_WALK_TO_VALUE 28
#define ZBX_PREPROC_SNMP_WALK_TO_JSON 29
/* custom on fail actions */
#define ZBX_PREPROC_FAIL_DEFAULT 0
#define ZBX_PREPROC_FAIL_DISCARD_VALUE 1
#define ZBX_PREPROC_FAIL_SET_VALUE 2
#define ZBX_PREPROC_FAIL_SET_ERROR 3
/* includes terminating '\0' */
#define CUID_LEN 26
void zbx_new_cuid(char *cuid);
typedef struct
{
char *tag;
char *value;
}
zbx_tag_t;
#define ZBX_STR2UCHAR(var, string) var = (unsigned char)atoi(string)
#define ZBX_CONST_STRING(str) "" str
#define ZBX_CONST_STRLEN(str) (sizeof(ZBX_CONST_STRING(str)) - 1)
/* time and memory size suffixes */
zbx_uint64_t suffix2factor(char c);
/******************************************************************************
* *
* CODE BELOW IS LIBC WRAPPERS WHICH COULD BE LATER MOVED TO SEPARATE LIBRARY *
* *
******************************************************************************/
#define ZBX_MESSAGE_BUF_SIZE 1024
char *zbx_strerror(int errnum);
#if !defined(_WINDOWS)
# if defined(HAVE_LIBPTHREAD)
# define zbx_sigmask pthread_sigmask
# else
# define zbx_sigmask sigprocmask
# endif
#endif
#define ZBX_GET_CONFIG_VAR(type, varname, defvalue) \
static type varname = defvalue; \
static type get_##varname(void) \
{ \
return varname; \
}
#define ZBX_GET_CONFIG_VAR2(type1, type2, varname, defvalue) \
static type1 varname = defvalue; \
static type2 get_##varname(void) \
{ \
return varname; \
}
#define LOG_LEVEL_EMPTY 0 /* printing nothing (if not LOG_LEVEL_INFORMATION set) */
#define LOG_LEVEL_CRIT 1
#define LOG_LEVEL_ERR 2
#define LOG_LEVEL_WARNING 3
#define LOG_LEVEL_DEBUG 4
#define LOG_LEVEL_TRACE 5
#define LOG_LEVEL_INFORMATION 127 /* printing in any case no matter what level set */
#define ZBX_CHECK_LOG_LEVEL(level) \
((LOG_LEVEL_INFORMATION != (level) && \
((level) > zbx_get_log_level() || LOG_LEVEL_EMPTY == (level))) ? FAIL : SUCCEED)
#ifdef HAVE___VA_ARGS__
# define ZBX_ZABBIX_LOG_CHECK
# define zabbix_log(level, ...) \
\
do \
{ \
if (SUCCEED == ZBX_CHECK_LOG_LEVEL(level)) \
zbx_log_handle(level, __VA_ARGS__); \
} \
while (0)
#else
# define zabbix_log zbx_log_handle
#endif
typedef void (*zbx_log_func_t)(int level, const char *fmt, va_list args);
void zbx_init_library_common(zbx_log_func_t log_func);
void zbx_log_handle(int level, const char *fmt, ...);
int zbx_get_log_level(void);
void zbx_set_log_level(int level);
const char *zbx_get_log_component_name(void);
#ifndef _WINDOWS
void zabbix_increase_log_level(void);
void zabbix_decrease_log_level(void);
void zabbix_report_log_level_change(void);
const char *zabbix_get_log_level_string(void);
typedef struct
{
int level;
const char *name;
}
zbx_log_component_t;
void zbx_set_log_component(const char *name, zbx_log_component_t *component);
void zbx_change_component_log_level(zbx_log_component_t *component, int direction);
#endif
#endif