int NET_TCP_LISTEN(AGENT_REQUEST *request, AGENT_RESULT *result) { MIB_TCPTABLE *pTcpTable = NULL; DWORD dwSize, dwRetVal; int i, ret = SYSINFO_RET_FAIL; unsigned short port; char *port_str; if (1 < request->nparam) { SET_MSG_RESULT(result, zbx_strdup(NULL, "Too many parameters.")); return SYSINFO_RET_FAIL; } port_str = get_rparam(request, 0); if (NULL == port_str || SUCCEED != is_ushort(port_str, &port)) { SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid first parameter.")); return SYSINFO_RET_FAIL; } dwSize = sizeof(MIB_TCPTABLE); pTcpTable = (MIB_TCPTABLE *)zbx_malloc(pTcpTable, dwSize); /* Make an initial call to GetTcpTable to get the necessary size into the dwSize variable */ if (ERROR_INSUFFICIENT_BUFFER == (dwRetVal = GetTcpTable(pTcpTable, &dwSize, TRUE))) pTcpTable = (MIB_TCPTABLE *)zbx_realloc(pTcpTable, dwSize); /* Make a second call to GetTcpTable to get the actual data we require */ if (NO_ERROR == (dwRetVal = GetTcpTable(pTcpTable, &dwSize, TRUE))) { for (i = 0; i < (int)pTcpTable->dwNumEntries; i++) { if (MIB_TCP_STATE_LISTEN == pTcpTable->table[i].dwState && port == ntohs((u_short)pTcpTable->table[i].dwLocalPort)) { SET_UI64_RESULT(result, 1); break; } } ret = SYSINFO_RET_OK; } else { zabbix_log(LOG_LEVEL_DEBUG, "GetTcpTable failed with error: %s", strerror_from_system(dwRetVal)); SET_MSG_RESULT(result, zbx_dsprintf(NULL, "Cannot obtain system information: %s", strerror_from_system(dwRetVal))); goto clean; } if (!ISSET_UI64(result)) SET_UI64_RESULT(result, 0); clean: zbx_free(pTcpTable); return ret; }
int NET_TCP_LISTEN(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result) { MIB_TCPTABLE *pTcpTable = NULL; DWORD dwSize, dwRetVal; int i, ret = SYSINFO_RET_FAIL; unsigned short port; char tmp[8]; assert(result); init_result(result); if (num_param(param) > 1) return SYSINFO_RET_FAIL; if (0 != get_param(param, 1, tmp, sizeof(tmp))) return SYSINFO_RET_FAIL; if (SUCCEED != is_ushort(tmp, &port)) return SYSINFO_RET_FAIL; dwSize = sizeof(MIB_TCPTABLE); pTcpTable = (MIB_TCPTABLE *)zbx_malloc(pTcpTable, dwSize); /* Make an initial call to GetTcpTable to get the necessary size into the dwSize variable */ if (ERROR_INSUFFICIENT_BUFFER == (dwRetVal = GetTcpTable(pTcpTable, &dwSize, TRUE))) pTcpTable = (MIB_TCPTABLE *)zbx_realloc(pTcpTable, dwSize); /* Make a second call to GetTcpTable to get the actual data we require */ if (NO_ERROR == (dwRetVal = GetTcpTable(pTcpTable, &dwSize, TRUE))) { for (i = 0; i < (int)pTcpTable->dwNumEntries; i++) { if (MIB_TCP_STATE_LISTEN == pTcpTable->table[i].dwState && port == ntohs((u_short)pTcpTable->table[i].dwLocalPort)) { SET_UI64_RESULT(result, 1); break; } } ret = SYSINFO_RET_OK; } else { zabbix_log(LOG_LEVEL_DEBUG, "GetTcpTable failed with error: %s", strerror_from_system(dwRetVal)); goto clean; } if (!ISSET_UI64(result)) SET_UI64_RESULT(result, 0); clean: zbx_free(pTcpTable); return ret; }
static zbx_uint64_t *get_result_ui64_value(AGENT_RESULT *result) { zbx_uint64_t value; assert(result); if (0 != ISSET_UI64(result)) { /* nothing to do */ } else if (0 != ISSET_DBL(result)) { SET_UI64_RESULT(result, result->dbl); } else if (0 != ISSET_STR(result)) { zbx_rtrim(result->str, " \""); zbx_ltrim(result->str, " \"+"); del_zeroes(result->str); if (SUCCEED != is_uint64(result->str, &value)) return NULL; SET_UI64_RESULT(result, value); } else if (0 != ISSET_TEXT(result)) { zbx_rtrim(result->text, " \""); zbx_ltrim(result->text, " \"+"); del_zeroes(result->text); if (SUCCEED != is_uint64(result->text, &value)) return NULL; SET_UI64_RESULT(result, value); } /* skip AR_MESSAGE - it is information field */ if (0 != ISSET_UI64(result)) return &result->ui64; return NULL; }
void test_parameter(const char *key) { #define ZBX_COL_WIDTH 45 AGENT_RESULT result; int n; n = printf("%s", key); if (0 < n && ZBX_COL_WIDTH > n) printf("%-*s", ZBX_COL_WIDTH - n, " "); init_result(&result); if (SUCCEED == process(key, 0, &result)) { if (0 != ISSET_UI64(&result)) printf(" [u|" ZBX_FS_UI64 "]", result.ui64); if (0 != ISSET_DBL(&result)) printf(" [d|" ZBX_FS_DBL "]", result.dbl); if (0 != ISSET_STR(&result)) printf(" [s|%s]", result.str); if (0 != ISSET_TEXT(&result)) printf(" [t|%s]", result.text); if (0 != ISSET_MSG(&result)) printf(" [m|%s]", result.msg); } else { if (0 != ISSET_MSG(&result)) printf(" [m|" ZBX_NOTSUPPORTED "] [%s]", result.msg); else printf(" [m|" ZBX_NOTSUPPORTED "]"); } free_result(&result); printf("\n"); fflush(stdout); }
static double *get_result_dbl_value(AGENT_RESULT *result) { double value; assert(result); if (0 != ISSET_DBL(result)) { /* nothing to do */ } else if (0 != ISSET_UI64(result)) { SET_DBL_RESULT(result, result->ui64); } else if (0 != ISSET_STR(result)) { zbx_rtrim(result->str, " \""); zbx_ltrim(result->str, " \"+"); if (SUCCEED != is_double(result->str)) return NULL; value = atof(result->str); SET_DBL_RESULT(result, value); } else if (0 != ISSET_TEXT(result)) { zbx_rtrim(result->text, " \""); zbx_ltrim(result->text, " \"+"); if (SUCCEED != is_double(result->text)) return NULL; value = atof(result->text); SET_DBL_RESULT(result, value); } /* skip AR_MESSAGE - it is information field */ if (0 != ISSET_DBL(result)) return &result->dbl; return NULL; }