Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/zabbix/zabbix.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugene Grigorjev <git-no-reply@zabbix.com>2007-06-28 18:35:44 +0400
committerEugene Grigorjev <git-no-reply@zabbix.com>2007-06-28 18:35:44 +0400
commit5f32658e8edda9b7e394001590478ee7f8d1ffcc (patch)
tree9b01e2aaf88d9d7b6db6384888c6f5ad1c38b04e
parent1a42b2b50626a719a70183fca039d8b47a314ed4 (diff)
- improoved UserParameters for Win32 (Eugene)
-rw-r--r--ChangeLog1
-rwxr-xr-xbin/win32/zabbix_agentd.exebin159744 -> 159744 bytes
-rwxr-xr-xbuild/win32/include/config.h3
-rw-r--r--include/alias.h1
-rw-r--r--include/service.h10
-rw-r--r--include/threads.h4
-rw-r--r--src/libs/zbxcommon/alias.c48
-rw-r--r--src/libs/zbxcomms/comms.c29
-rw-r--r--src/libs/zbxsysinfo/common/common.c159
-rw-r--r--src/libs/zbxsysinfo/sysinfo.c1
-rw-r--r--src/libs/zbxwin32/service.c23
-rw-r--r--src/zabbix_agent/perfstat.c1
-rw-r--r--src/zabbix_agent/zabbix_agent.c2
-rw-r--r--src/zabbix_agent/zabbix_agentd.c29
-rw-r--r--src/zabbix_agent/zbxconf.c3
-rw-r--r--src/zabbix_get/zabbix_get.c6
-rw-r--r--src/zabbix_sender/zabbix_sender.c3
17 files changed, 194 insertions, 129 deletions
diff --git a/ChangeLog b/ChangeLog
index 0b8bb07040f..bf6e8cd9929 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -7,6 +7,7 @@ Changes for 1.5:
Changes for 1.4.1:
+ - improoved UserParameters for Win32 (Eugene)
- fixed several issues in housekeeper (Alexei)
- changed properties of text files in SVN repository (Alexei)
- removed text "Current node [N]" from node selector (Alexei)
diff --git a/bin/win32/zabbix_agentd.exe b/bin/win32/zabbix_agentd.exe
index a247e7b5235..07a5962c7e8 100755
--- a/bin/win32/zabbix_agentd.exe
+++ b/bin/win32/zabbix_agentd.exe
Binary files differ
diff --git a/build/win32/include/config.h b/build/win32/include/config.h
index 496e48d9de1..a03504873c1 100755
--- a/build/win32/include/config.h
+++ b/build/win32/include/config.h
@@ -51,3 +51,6 @@
/* Define to 1 if you have the <assert.h> header file. */
#define HAVE_ASSERT_H 1
+
+/* Define to 1 if you have the <signal.h> header file. */
+#define HAVE_SIGNAL_H
diff --git a/include/alias.h b/include/alias.h
index d3b91214ba0..fe43bad9a7b 100644
--- a/include/alias.h
+++ b/include/alias.h
@@ -36,5 +36,4 @@ int add_alias_from_config(char *value);
void alias_list_free(void);
void alias_expand(const char *orig, char *expanded, int exp_buf_len);
-
#endif /* ZABBIX_ALIAS_H */
diff --git a/include/service.h b/include/service.h
index e6fae036f3d..2d9e1cbdeb0 100644
--- a/include/service.h
+++ b/include/service.h
@@ -38,20 +38,20 @@ int ZabbixRemoveService(void);
int ZabbixStartService(void);
int ZabbixStopService(void);
-#define init_main_process()
+void init_main_process(void);
/* APPLICATION running status */
/* requred for closing application from service */
-extern int application_is_runned;
+int application_status;
-#define ZBX_APP_STOPPED 1
+#define ZBX_APP_STOPPED 0
#define ZBX_APP_RUNNED 1
/* ask for running application of closing status */
-#define ZBX_IS_RUNNING (ZBX_APP_RUNNED == application_is_runned)
+#define ZBX_IS_RUNNING (ZBX_APP_RUNNED == application_status)
/* ask for application closing status */
-#define ZBX_DO_EXIT() (application_is_runned = ZBX_APP_STOPPED)
+#define ZBX_DO_EXIT() zbx_error("[%s] [%li]", __FILE__, __LINE__); application_status = ZBX_APP_STOPPED
#define START_MAIN_ZABBIX_ENTRY(a) service_start()
diff --git a/include/threads.h b/include/threads.h
index 982382a0b97..9d574a171d5 100644
--- a/include/threads.h
+++ b/include/threads.h
@@ -40,6 +40,8 @@
#define zbx_sleep(sec) Sleep(((DWORD)(sec))*((DWORD)1000))
+ #define zbx_thread_kill(h) TerminateThread(h, SUCCEED);
+
#else /* not _WINDOWS */
int zbx_fork();
@@ -60,6 +62,8 @@
#define zbx_sleep(sec) sleep((sec))
+ #define zbx_thread_kill(h) kill(h,SIGTERM);
+
#endif /* _WINDOWS */
ZBX_THREAD_HANDLE zbx_thread_start(ZBX_THREAD_ENTRY_POINTER(handler), void *args);
diff --git a/src/libs/zbxcommon/alias.c b/src/libs/zbxcommon/alias.c
index 46c4d321e73..e3df0efe7bc 100644
--- a/src/libs/zbxcommon/alias.c
+++ b/src/libs/zbxcommon/alias.c
@@ -48,43 +48,44 @@ int add_alias_from_config(char *line)
int add_alias(const char *name, const char *value)
{
- ALIAS *alias;
+ ALIAS *alias = NULL;
+
+ assert(name);
+ assert(value);
for(alias = aliasList; ; alias=alias->next)
{
/* Add new parameters */
- if(alias == NULL)
+ if ( NULL == alias )
{
- alias = (ALIAS *)malloc(sizeof(ALIAS));
- if (NULL != alias)
- {
- memset(alias,0,sizeof(ALIAS));
- zbx_strlcpy(alias->name, name, MAX_ALIAS_NAME-1);
- alias->value = (char *)malloc(strlen(value)+1);
- strcpy(alias->value,value);
- alias->next=aliasList;
- aliasList=alias;
-
- zabbix_log( LOG_LEVEL_DEBUG, "Alias added. [%s] -> [%s]", name, value);
- return SUCCEED;
- }
- break;
+ alias = (ALIAS *)zbx_malloc(alias, sizeof(ALIAS));
+ memset(alias,0,sizeof(ALIAS));
+
+ zbx_strlcpy(alias->name, name, MAX_ALIAS_NAME-1);
+
+ alias->value = strdup(value);
+
+ alias->next=aliasList;
+
+ aliasList=alias;
+
+ zabbix_log( LOG_LEVEL_DEBUG, "Alias added. [%s] -> [%s]", name, value);
+ return SUCCEED;
}
/* Replace existing parameters */
if (strcmp(alias->name, name) == 0)
{
- if(alias->value)
- free(alias->value);
+ zbx_free(alias->value);
memset(alias, 0, sizeof(ALIAS));
zbx_strlcpy(alias->name, name, MAX_ALIAS_NAME-1);
-
- alias->value = (char *)malloc(strlen(value)+1);
- strcpy(alias->value, value);
+
+ alias->value = strdup(value);
alias->next = aliasList;
+
aliasList = alias;
zabbix_log( LOG_LEVEL_DEBUG, "Alias replaced. [%s] -> [%s]", name, value);
@@ -105,9 +106,10 @@ void alias_list_free(void)
{
curr = next;
next = curr->next;
- free(curr->value);
- free(curr);
+ zbx_free(curr->value);
+ zbx_free(curr);
}
+ aliasList = NULL;
}
/*
diff --git a/src/libs/zbxcomms/comms.c b/src/libs/zbxcomms/comms.c
index b3ef82095c9..9327aca9a17 100644
--- a/src/libs/zbxcomms/comms.c
+++ b/src/libs/zbxcomms/comms.c
@@ -112,15 +112,19 @@ struct hostent *zbx_gethost(const char *hostname)
assert(hostname);
+zabbix_log( LOG_LEVEL_DEBUG, "gethostbyname"); /* TMP !!! */
host = gethostbyname(hostname);
if(host) return host;
addr = inet_addr(hostname);
+zabbix_log( LOG_LEVEL_DEBUG, "gethostbyaddr"); /* TMP !!! */
host = gethostbyaddr((char *)&addr, 4, AF_INET);
if(host) return host;
+zabbix_log( LOG_LEVEL_DEBUG, "FAIL"); /* TMP !!! */
+
ZBX_TCP_ERR_START "gethost() failed for address '%s' [%s]", hostname, strerror_from_system(zbx_sock_last_error()) ZBX_TCP_ERR_END;
return (struct hostent*) NULL;
@@ -313,6 +317,7 @@ int zbx_tcp_send_ext(zbx_sock_t *s, const char *data, unsigned char flags)
/* Write header */
if( ZBX_TCP_ERROR == ZBX_TCP_WRITE(s->socket, ZBX_TCP_HEADER, ZBX_TCP_HEADER_LEN))
{
+ ZBX_TCP_ERR_START "ZBX_TCP_WRITE() failed [%s]", strerror_from_system(zbx_sock_last_error()) ZBX_TCP_ERR_END;
return FAIL;
}
@@ -321,6 +326,7 @@ int zbx_tcp_send_ext(zbx_sock_t *s, const char *data, unsigned char flags)
/* Write data length */
if( ZBX_TCP_ERROR == ZBX_TCP_WRITE(s->socket, (char *) &len64, sizeof(len64)) )
{
+ ZBX_TCP_ERR_START "ZBX_TCP_WRITE() failed [%s]", strerror_from_system(zbx_sock_last_error()) ZBX_TCP_ERR_END;
return FAIL;
}
}
@@ -329,6 +335,7 @@ int zbx_tcp_send_ext(zbx_sock_t *s, const char *data, unsigned char flags)
{
if( ZBX_TCP_ERROR == (i = ZBX_TCP_WRITE(s->socket, data+written,strlen(data)-written)) )
{
+ ZBX_TCP_ERR_START "ZBX_TCP_WRITE() failed [%s]", strerror_from_system(zbx_sock_last_error()) ZBX_TCP_ERR_END;
return FAIL;
}
written += i;
@@ -546,6 +553,8 @@ int zbx_tcp_recv_ext(zbx_sock_t *s, char **data, unsigned char flags)
int allocated, offset;
zbx_uint64_t expected_len;
+zabbix_log(LOG_LEVEL_DEBUG, "zbx_tcp_recv_ext"); /* TMP !!! */
+
ZBX_TCP_START();
zbx_free(s->buf_dyn);
@@ -556,12 +565,18 @@ int zbx_tcp_recv_ext(zbx_sock_t *s, char **data, unsigned char flags)
read_bytes = 0;
s->buf_type = ZBX_BUF_TYPE_STAT;
+zabbix_log(LOG_LEVEL_DEBUG, "ZBX_TCP_READ"); /* TMP !!! */
+
left = ZBX_TCP_HEADER_LEN;
nbytes = ZBX_TCP_READ(s->socket, s->buf_stat, left);
+zabbix_log(LOG_LEVEL_DEBUG, "cmp"); /* TMP !!! */
if( ZBX_TCP_HEADER_LEN == nbytes && 0 == strncmp(s->buf_stat, ZBX_TCP_HEADER, ZBX_TCP_HEADER_LEN) )
{
+zabbix_log(LOG_LEVEL_DEBUG, "new protocol"); /* TMP !!! */
+
left = sizeof(zbx_uint64_t);
+zabbix_log(LOG_LEVEL_DEBUG, "ZBX_TCP_READ - len"); /* TMP !!! */
nbytes = ZBX_TCP_READ(s->socket, (void *)&expected_len, left);
/* The rest was already cleared */
@@ -571,6 +586,7 @@ int zbx_tcp_recv_ext(zbx_sock_t *s, char **data, unsigned char flags)
}
else if( ZBX_TCP_ERROR != nbytes )
{
+zabbix_log(LOG_LEVEL_DEBUG, "raw protocol"); /* TMP !!! */
read_bytes = nbytes;
expected_len = 16*1024*1024;
}
@@ -583,13 +599,16 @@ int zbx_tcp_recv_ext(zbx_sock_t *s, char **data, unsigned char flags)
if(nbytes < left) return SUCCEED;
}
-
left = sizeof(s->buf_stat) - read_bytes - 1;
+zabbix_log(LOG_LEVEL_DEBUG, "ZBX_TCP_READ - static"); /* TMP !!! */
+
/* fill static buffer */
while( read_bytes < expected_len && left > 0
&& ZBX_TCP_ERROR != (nbytes = ZBX_TCP_READ( s->socket, s->buf_stat + read_bytes, left)))
{
+zabbix_log(LOG_LEVEL_DEBUG, "ZBX_TCP_READ - [%i]", nbytes); /* TMP !!! */
+
read_bytes += nbytes;
if( flags & ZBX_TCP_READ_UNTIL_CLOSE ) {
@@ -612,6 +631,8 @@ int zbx_tcp_recv_ext(zbx_sock_t *s, char **data, unsigned char flags)
memset(s->buf_dyn,0,allocated);
memcpy(s->buf_dyn, s->buf_stat, sizeof(s->buf_stat));
+zabbix_log(LOG_LEVEL_DEBUG, "ZBX_TCP_READ - dynamic"); /* TMP !!! */
+
offset = read_bytes;
/* fill dynamic buffer */
while( read_bytes < expected_len && ZBX_TCP_ERROR != (nbytes = ZBX_TCP_READ(s->socket, s->buf_stat, sizeof(s->buf_stat)-1)) )
@@ -630,6 +651,7 @@ int zbx_tcp_recv_ext(zbx_sock_t *s, char **data, unsigned char flags)
*data = s->buf_dyn;
}
}
+zabbix_log(LOG_LEVEL_DEBUG, "zbx_tcp_recv_ext - end"); /* TMP !!! */
if( ZBX_TCP_ERROR == nbytes )
{
@@ -683,7 +705,7 @@ int zbx_tcp_check_security(
{
return SUCCEED;
}
-
+zabbix_log( LOG_LEVEL_DEBUG, "getpeername"); /* TMP !!! */
nlen = sizeof(ZBX_SOCKADDR);
if( ZBX_TCP_ERROR == getpeername(s->socket, (struct sockaddr*)&name, &nlen))
{
@@ -700,13 +722,14 @@ int zbx_tcp_check_security(
while( NULL != host )
{
+zabbix_log( LOG_LEVEL_DEBUG, "zbx_gethost"); /* TMP !!! */
/* Allow IP addresses or DNS names for authorization */
if( 0 != (hp = zbx_gethost(host)))
{
sip = inet_ntoa(*((struct in_addr *)hp->h_addr));
if( 0 == strcmp(sname, sip))
{
- ZBX_TCP_ERR_START "Connection from [%s] accepted. Allowed servers [%s] ",sname, ip_list ZBX_TCP_ERR_END;
+zabbix_log( LOG_LEVEL_DEBUG, "zbx_tcp_check_security - OK"); /* TMP !!! */
return SUCCEED;
}
}
diff --git a/src/libs/zbxsysinfo/common/common.c b/src/libs/zbxsysinfo/common/common.c
index 13658a3dd6d..58b6ceb9370 100644
--- a/src/libs/zbxsysinfo/common/common.c
+++ b/src/libs/zbxsysinfo/common/common.c
@@ -155,46 +155,41 @@ int EXECUTE_STR(const char *cmd, const char *param, unsigned flags, AGENT_RESULT
STARTUPINFO si = {0};
PROCESS_INFORMATION pi = {0};
SECURITY_ATTRIBUTES sa;
- HANDLE hOutput;
- char szTempPath[MAX_PATH],szTempFile[MAX_PATH];
+ HANDLE hWrite=NULL, hRead=NULL;
#else /* not _WINDOWS */
- FILE *f;
+ FILE *hRead = NULL;
#endif /* _WINDOWS */
- char cmd_result[MAX_STRING_LEN];
- char command[MAX_STRING_LEN];
- int i,len;
+ int ret = SYSINFO_RET_FAIL;
+
+ char stat_buf[128];
+ char *cmd_result=NULL;
+ char *command=NULL;
+ int len;
assert(result);
init_result(result);
-
- memset(cmd_result, 0, MAX_STRING_LEN);
+
+ cmd_result = zbx_dsprintf(cmd_result,"");
+ memset(stat_buf, 0, sizeof(stat_buf));
#if defined(_WINDOWS)
- /* Create temporary file to hold process output */
- GetTempPath( MAX_PATH-1, szTempPath);
- GetTempFileName( szTempPath, "zbx", 0, szTempFile);
-
- sa.nLength = sizeof(SECURITY_ATTRIBUTES);
- sa.lpSecurityDescriptor = NULL;
- sa.bInheritHandle = TRUE;
-
- if(INVALID_HANDLE_VALUE == (hOutput = CreateFile(
- szTempFile,
- GENERIC_READ | GENERIC_WRITE,
- 0,
- &sa,
- CREATE_ALWAYS,
- FILE_ATTRIBUTE_TEMPORARY,
- NULL)))
+ /* Set the bInheritHandle flag so pipe handles are inherited */
+ sa.nLength = sizeof(SECURITY_ATTRIBUTES);
+ sa.bInheritHandle = TRUE;
+ sa.lpSecurityDescriptor = NULL;
+
+ /* Create a pipe for the child process's STDOUT */
+ if (! CreatePipe(&hRead, &hWrite, &sa, sizeof(cmd_result)))
{
- zabbix_log(LOG_LEVEL_DEBUG, "Unable to create temporary file: '%s' [%s]", szTempFile, strerror_from_system(GetLastError()));
- return SYSINFO_RET_FAIL;
+ zabbix_log(LOG_LEVEL_DEBUG, "Unable to create pipe [%s]", strerror_from_system(GetLastError()));
+ ret = SYSINFO_RET_FAIL;
+ goto lbl_exit;
}
/* Fill in process startup info structure */
@@ -202,100 +197,113 @@ int EXECUTE_STR(const char *cmd, const char *param, unsigned flags, AGENT_RESULT
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
- si.hStdOutput = hOutput;
- si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
+ si.hStdOutput = hWrite;
+ si.hStdError = hWrite;
- zbx_snprintf(command, sizeof(command), "cmd /C \"%s\"", param);
+ command = zbx_dsprintf(command, "cmd /C \"%s\"", param);
/* Create new process */
if (!CreateProcess(NULL,command,NULL,NULL,TRUE,0,NULL,NULL,&si,&pi))
{
zabbix_log(LOG_LEVEL_DEBUG, "Unable to create process: '%s' [%s]", command, strerror_from_system(GetLastError()));
- /* Remove temporary file */
- CloseHandle(hOutput);
- DeleteFile(szTempFile);
+ ret = SYSINFO_RET_FAIL;
+ goto lbl_exit;
+ }
+ CloseHandle(hWrite); hWrite = NULL;
- return SYSINFO_RET_FAIL;
+ /* Read process output */
+ while( ReadFile(hRead, stat_buf, sizeof(stat_buf)-1, &len, NULL) && len > 0 )
+ {
+ cmd_result = zbx_strdcat(cmd_result, stat_buf);
+ memset(stat_buf, 0, sizeof(stat_buf));
}
- /* Wait for process termination and close all handles */
- WaitForSingleObject(pi.hProcess,INFINITE);
- CloseHandle(pi.hThread);
- CloseHandle(pi.hProcess);
+ /* Don't wait child process exiting. */
+ /* WaitForSingleObject( pi.hProcess, INFINITE ); */
- /* Rewind temporary file for reading */
- SetFilePointer(hOutput,0,NULL,FILE_BEGIN);
+ /* Terminate child process */
+ /* TerminateProcess(pi.hProcess, 0); */
- /* Read process output */
- ReadFile(hOutput, cmd_result, MAX_STRING_LEN-1, &len, NULL);
+ CloseHandle(pi.hProcess);
+ CloseHandle(pi.hThread);
- cmd_result[len] = '\0';
-
- /* Remove temporary file */
- CloseHandle(hOutput);
- DeleteFile(szTempFile);
+ CloseHandle(hRead); hRead = NULL;
+
#else /* not _WINDOWS */
zbx_strlcpy(command, param, sizeof(command));
- if(0 == (f = popen(command,"r")))
+ if(0 == (hRead = popen(command,"r")))
{
switch (errno)
{
- case EINTR:
- return SYSINFO_RET_TIMEOUT;
- default:
- return SYSINFO_RET_FAIL;
+ case EINTR: ret = SYSINFO_RET_TIMEOUT;
+ default: ret = SYSINFO_RET_FAIL;
}
+ goto lbl_exit;
}
- len = fread(cmd_result, 1, sizeof(cmd_result)-1, f);
+ ;
+ /* Read process output */
+ while( (len = fread(stat_buf, 1, sizeof(stat_buf)-1, hRead)) > 0 )
+ {
+ cmd_result = zbx_strdcat(cmd_result, stat_buf);
+ memset(stat_buf, 0, sizeof(stat_buf));
+ }
- if(0 != ferror(f))
+ if(0 != ferror(hRead))
{
switch (errno)
{
- case EINTR:
- pclose(f);
- return SYSINFO_RET_TIMEOUT;
- default:
- pclose(f);
- return SYSINFO_RET_FAIL;
+ case EINTR: ret = SYSINFO_RET_TIMEOUT;
+ default: ret = SYSINFO_RET_FAIL;
}
+ goto lbl_exit;
}
- cmd_result[len] = '\0';
-
- if(pclose(f) == -1)
+ if(pclose(hRead) == -1)
{
switch (errno)
{
- case EINTR:
- return SYSINFO_RET_TIMEOUT;
- default:
- return SYSINFO_RET_FAIL;
+ case EINTR: ret = SYSINFO_RET_TIMEOUT;
+ default: ret = SYSINFO_RET_FAIL;
}
+ goto lbl_exit;
}
#endif /* _WINDOWS */
zabbix_log(LOG_LEVEL_DEBUG, "Before");
- for(i=(int)strlen(cmd_result); i>0 && (cmd_result[i] == '\n' || cmd_result[i] == '\r' || cmd_result[i] == '\0'); cmd_result[i--] = '\0');
+ zbx_rtrim(cmd_result,"\n\r\0");
/* We got EOL only */
if(cmd_result[0] == '\0')
{
- return SYSINFO_RET_FAIL;
+ ret = SYSINFO_RET_FAIL;
+ goto lbl_exit;
}
- zabbix_log(LOG_LEVEL_DEBUG, "Run remote command [%s] Result [%d] [%s]", command, strlen(cmd_result), cmd_result);
+ zabbix_log(LOG_LEVEL_DEBUG, "Run remote command [%s] Result [%d] [%.20s]...", command, strlen(cmd_result), cmd_result);
SET_TEXT_RESULT(result, strdup(cmd_result));
- return SYSINFO_RET_OK;
+ ret = SYSINFO_RET_OK;
+
+lbl_exit:
+#if defined(_WINDOWS)
+ if ( hWrite ) CloseHandle(hWrite); hWrite = NULL;
+ if ( hRead) CloseHandle(hRead); hRead = NULL;
+#else /* not _WINDOWS */
+ if ( hRead ) pclose(hRead); hRead = NULL;
+#endif /* _WINDOWS */
+
+ zbx_free(command)
+ zbx_free(cmd_result);
+
+ return ret;
}
int EXECUTE_INT(const char *cmd, const char *command, unsigned flags, AGENT_RESULT *result)
@@ -307,11 +315,12 @@ int EXECUTE_INT(const char *cmd, const char *command, unsigned flags, AGENT_RESU
if(SYSINFO_RET_OK == ret)
{
- sscanf(result->text, "%lf", &value);
-
- UNSET_TEXT_RESULT(result);
-
- SET_DBL_RESULT(result, value);
+ if( NULL == GET_DBL_RESULT(result) )
+ {
+ zabbix_log(LOG_LEVEL_WARNING, "Remote command [%s] result is not double", command);
+ ret = SYSINFO_RET_FAIL;
+ }
+ UNSET_RESULT_EXCLUDING(result, AR_DOUBLE);
}
return ret;
diff --git a/src/libs/zbxsysinfo/sysinfo.c b/src/libs/zbxsysinfo/sysinfo.c
index 989d49abeb3..1d7b15bad56 100644
--- a/src/libs/zbxsysinfo/sysinfo.c
+++ b/src/libs/zbxsysinfo/sysinfo.c
@@ -107,7 +107,6 @@ void add_user_parameter(char *key,char *command)
commands[i].function = &EXECUTE_STR;
commands[i].main_param = strdup(command);
commands[i].test_param = 0;
-
commands = zbx_realloc(commands,(i+2)*sizeof(ZBX_METRIC));
commands[i+1].key=NULL;
diff --git a/src/libs/zbxwin32/service.c b/src/libs/zbxwin32/service.c
index 934082c3de1..9927a78371d 100644
--- a/src/libs/zbxwin32/service.c
+++ b/src/libs/zbxwin32/service.c
@@ -29,6 +29,8 @@
static int ZabbixRemoveEventSource(void);
static int ZabbixInstallEventSource(char *path);
+#define uninit() { zbx_on_exit(); }
+
/*
* Static data
*/
@@ -36,7 +38,20 @@ static int ZabbixInstallEventSource(char *path);
static SERVICE_STATUS serviceStatus;
static SERVICE_STATUS_HANDLE serviceHandle;
-int application_is_runned = ZBX_APP_RUNNED;
+int application_status = ZBX_APP_RUNNED;
+
+static void parent_signal_handler(int sig)
+{
+ switch(sig)
+ {
+ case SIGINT:
+ case SIGTERM:
+ zabbix_log( LOG_LEVEL_INFORMATION, "Got signal. Exiting ...");
+ uninit();
+ ExitProcess( FAIL );
+ break;
+ }
+}
/*
* ZABBIX service control handler
@@ -407,3 +422,9 @@ static int ZabbixRemoveEventSource(void)
return SUCCEED;
}
+
+void init_main_process(void)
+{
+ signal( SIGINT, parent_signal_handler);
+ signal( SIGTERM, parent_signal_handler );
+} \ No newline at end of file
diff --git a/src/zabbix_agent/perfstat.c b/src/zabbix_agent/perfstat.c
index e4a68dc63dd..0904444f8c1 100644
--- a/src/zabbix_agent/perfstat.c
+++ b/src/zabbix_agent/perfstat.c
@@ -213,6 +213,7 @@ void perfs_list_free(void)
zbx_free(curr->rawValueArray);
zbx_free(curr);
}
+ statPerfCounterList = NULL;
}
diff --git a/src/zabbix_agent/zabbix_agent.c b/src/zabbix_agent/zabbix_agent.c
index 1e67d2212ef..eeff4d5b690 100644
--- a/src/zabbix_agent/zabbix_agent.c
+++ b/src/zabbix_agent/zabbix_agent.c
@@ -178,8 +178,8 @@ int main(int argc, char **argv)
#if !defined(_WINDOWS)
signal( SIGINT, child_signal_handler);
- signal( SIGQUIT, child_signal_handler );
signal( SIGTERM, child_signal_handler );
+ signal( SIGQUIT, child_signal_handler );
signal( SIGALRM, child_signal_handler );
alarm(CONFIG_TIMEOUT);
diff --git a/src/zabbix_agent/zabbix_agentd.c b/src/zabbix_agent/zabbix_agentd.c
index 76abce4e65e..e9051634872 100644
--- a/src/zabbix_agent/zabbix_agentd.c
+++ b/src/zabbix_agent/zabbix_agentd.c
@@ -275,15 +275,16 @@ int MAIN_ZABBIX_ENTRY(void)
/* wait for all threads exiting */
for(i = 0; i < CONFIG_ZABBIX_FORKS; i++)
{
- zbx_thread_wait(threads[i]);
-
- zabbix_log( LOG_LEVEL_DEBUG, "%li: thread is terminated", threads[i]);
- ZBX_DO_EXIT();
- }
+ if(threads && threads[i])
+ {
+ zbx_thread_wait(threads[i]);
- free_collector_data();
+ if(threads)
+ zabbix_log( LOG_LEVEL_DEBUG, "thread [%i] is terminated", i);
- zbx_free(threads);
+ ZBX_DO_EXIT();
+ }
+ }
zbx_on_exit();
@@ -293,22 +294,22 @@ int MAIN_ZABBIX_ENTRY(void)
void zbx_on_exit()
{
-#if !defined(_WINDOWS)
-
int i = 0;
+ ZBX_DO_EXIT();
+
if(threads != NULL)
{
for(i = 0; i<CONFIG_ZABBIX_FORKS ; i++)
{
if(threads[i]) {
- kill(threads[i],SIGTERM);
+ zbx_thread_kill(threads[i]);
threads[i] = (ZBX_THREAD_HANDLE)NULL;
}
}
}
-#endif /* not _WINDOWS */
+ zbx_free(threads);
zabbix_log(LOG_LEVEL_DEBUG, "zbx_on_exit() called.");
@@ -319,17 +320,17 @@ void zbx_on_exit()
#endif /* USE_PID_FILE */
free_metrics();
-
free_collector_data();
alias_list_free();
perfs_list_free();
zbx_sleep(2); /* wait for all threads closing */
-
+
zabbix_log(LOG_LEVEL_INFORMATION, "ZABBIX Agent stopped");
+
zabbix_close_log();
- exit(SUCCEED);
+ ExitProcess(SUCCEED);
}
#ifndef ZABBIX_TEST
diff --git a/src/zabbix_agent/zbxconf.c b/src/zabbix_agent/zbxconf.c
index 5dab12d53a0..9d64e9cc048 100644
--- a/src/zabbix_agent/zbxconf.c
+++ b/src/zabbix_agent/zbxconf.c
@@ -80,7 +80,6 @@ void load_config()
{"StartAgents", &CONFIG_ZABBIX_FORKS, 0,TYPE_INT, PARM_OPT, 1,16},
{"RefreshActiveChecks", &CONFIG_REFRESH_ACTIVE_CHECKS, 0,TYPE_INT, PARM_OPT,60,3600},
- {"EnableRemoteCommands",&CONFIG_ENABLE_REMOTE_COMMANDS, 0,TYPE_INT, PARM_OPT,0,1},
{"AllowRoot", &CONFIG_ALLOW_ROOT, 0,TYPE_INT, PARM_OPT,0,1},
{"LogUnresolvedSymbols",&CONFIG_LOG_UNRES_SYMB, 0, TYPE_STRING,PARM_OPT,0,1},
@@ -142,6 +141,8 @@ void load_user_parameters(void)
{
/* PARAMETER, VAR, FUNC, TYPE(0i,1s), MANDATORY,MIN,MAX
*/
+ {"EnableRemoteCommands",&CONFIG_ENABLE_REMOTE_COMMANDS, 0,TYPE_INT, PARM_OPT,0,1},
+
{"Alias", 0, &add_alias_from_config, TYPE_STRING,PARM_OPT,0,0},
{"UserParameter", 0, &add_parameter, 0, 0, 0, 0},
diff --git a/src/zabbix_get/zabbix_get.c b/src/zabbix_get/zabbix_get.c
index 30db9b4168e..3bb0842e4e9 100644
--- a/src/zabbix_get/zabbix_get.c
+++ b/src/zabbix_get/zabbix_get.c
@@ -219,10 +219,12 @@ int main(int argc, char **argv)
if(ret == SUCCEED)
{
-#if !defined(_WINDOWS)
+
signal( SIGINT, signal_handler );
- signal( SIGQUIT, signal_handler );
signal( SIGTERM, signal_handler );
+
+#if !defined(_WINDOWS)
+ signal( SIGQUIT, signal_handler );
signal( SIGALRM, signal_handler );
alarm(SENDER_TIMEOUT);
diff --git a/src/zabbix_sender/zabbix_sender.c b/src/zabbix_sender/zabbix_sender.c
index df915552ea6..9010d703bee 100644
--- a/src/zabbix_sender/zabbix_sender.c
+++ b/src/zabbix_sender/zabbix_sender.c
@@ -165,10 +165,9 @@ static ZBX_THREAD_ENTRY(send_value, args)
);
#if !defined(_WINDOWS)
-
signal( SIGINT, send_signal_handler );
- signal( SIGQUIT, send_signal_handler );
signal( SIGTERM, send_signal_handler );
+ signal( SIGQUIT, send_signal_handler );
signal( SIGALRM, send_signal_handler );
alarm(SENDER_TIMEOUT);