summaryrefslogtreecommitdiffstats
path: root/src/libs/zbxsysinfo
diff options
context:
space:
mode:
authorosmiy <osmiy@97f52cf1-0a1b-0410-bd0e-c28be96e8082>2007-06-28 14:35:44 +0000
committerosmiy <osmiy@97f52cf1-0a1b-0410-bd0e-c28be96e8082>2007-06-28 14:35:44 +0000
commit8c13594d1bb50b44a708dbd3c0acaa19fa340660 (patch)
treefddca3b670cf005baec37c3ce523a3017e301a36 /src/libs/zbxsysinfo
parent5268a939d762eb782750151c17a58628cab0e9e8 (diff)
downloadzabbix-8c13594d1bb50b44a708dbd3c0acaa19fa340660.tar.gz
zabbix-8c13594d1bb50b44a708dbd3c0acaa19fa340660.tar.xz
zabbix-8c13594d1bb50b44a708dbd3c0acaa19fa340660.zip
- improoved UserParameters for Win32 (Eugene)
git-svn-id: svn://svn.zabbix.com/trunk@4376 97f52cf1-0a1b-0410-bd0e-c28be96e8082
Diffstat (limited to 'src/libs/zbxsysinfo')
-rw-r--r--src/libs/zbxsysinfo/common/common.c159
-rw-r--r--src/libs/zbxsysinfo/sysinfo.c1
2 files changed, 84 insertions, 76 deletions
diff --git a/src/libs/zbxsysinfo/common/common.c b/src/libs/zbxsysinfo/common/common.c
index 13658a3d..58b6ceb9 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 989d49ab..1d7b15ba 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;