static void process_trapper_child(zbx_socket_t *sock, zbx_timespec_t *ts) { if (SUCCEED != zbx_tcp_recv_to(sock, CONFIG_TRAPPER_TIMEOUT)) return; process_trap(sock, sock->buffer, ts); }
static void process_listener(zbx_sock_t *s) { AGENT_RESULT result; char *command; char **value = NULL; int ret; if (SUCCEED == (ret = zbx_tcp_recv_to(s, &command, CONFIG_TIMEOUT))) { zbx_rtrim(command, "\r\n"); zabbix_log(LOG_LEVEL_DEBUG, "Requested [%s]", command); init_result(&result); process(command, 0, &result); if (NULL == (value = GET_TEXT_RESULT(&result))) value = GET_MSG_RESULT(&result); if (NULL != value) { zabbix_log(LOG_LEVEL_DEBUG, "Sending back [%s]", *value); ret = zbx_tcp_send_to(s, *value, CONFIG_TIMEOUT); } free_result(&result); } if (FAIL == ret) zabbix_log(LOG_LEVEL_DEBUG, "Process listener error: %s", zbx_tcp_strerror()); }
/****************************************************************************** * * * Function: zbx_recv_response * * * * Purpose: read a response message (in JSON format) from socket, optionally * * extract "info" value. * * * * Parameters: sock - [IN] socket descriptor * * timeout - [IN] timeout for this operation * * error - [OUT] pointer to error message * * * * Return value: SUCCEED - "response":"success" successfully retrieved * * FAIL - otherwise * * Comments: * * Allocates memory. * * * * If an error occurs, the function allocates dynamic memory for an error * * message and writes its address into location pointed to by "error" * * parameter. * * * * When the "info" value is present in the response message then function * * copies the "info" value into the "error" buffer as additional * * information * * * * IMPORTANT: it is a responsibility of the caller to release the * * "error" memory ! * * * ******************************************************************************/ int zbx_recv_response(zbx_socket_t *sock, int timeout, char **error) { const char *__function_name = "zbx_recv_response"; struct zbx_json_parse jp; char value[16]; int ret = FAIL; zabbix_log(LOG_LEVEL_DEBUG, "In %s()", __function_name); if (SUCCEED != zbx_tcp_recv_to(sock, timeout)) { /* since we have successfully sent data earlier, we assume the other */ /* side is just too busy processing our data if there is no response */ *error = zbx_strdup(*error, zbx_socket_strerror()); goto out; } zabbix_log(LOG_LEVEL_DEBUG, "%s() '%s'", __function_name, sock->buffer); /* deal with empty string here because zbx_json_open() does not produce an error message in this case */ if ('\0' == *sock->buffer) { *error = zbx_strdup(*error, "empty string received"); goto out; } if (SUCCEED != zbx_json_open(sock->buffer, &jp)) { *error = zbx_strdup(*error, zbx_json_strerror()); goto out; } if (SUCCEED != zbx_json_value_by_name(&jp, ZBX_PROTO_TAG_RESPONSE, value, sizeof(value))) { *error = zbx_strdup(*error, "no \"" ZBX_PROTO_TAG_RESPONSE "\" tag"); goto out; } if (0 != strcmp(value, ZBX_PROTO_VALUE_SUCCESS)) { char *info = NULL; size_t info_alloc = 0; if (SUCCEED == zbx_json_value_by_name_dyn(&jp, ZBX_PROTO_TAG_INFO, &info, &info_alloc)) *error = zbx_strdup(*error, info); else *error = zbx_dsprintf(*error, "negative response \"%s\"", value); zbx_free(info); goto out; } ret = SUCCEED; out: zabbix_log(LOG_LEVEL_DEBUG, "End of %s():%s", __function_name, zbx_result_string(ret)); return ret; }
static void process_listener(zbx_socket_t *s) { AGENT_RESULT result; char **value = NULL; int ret; if (SUCCEED == (ret = zbx_tcp_recv_to(s, CONFIG_TIMEOUT))) { zbx_rtrim(s->buffer, "\r\n"); zabbix_log(LOG_LEVEL_DEBUG, "Requested [%s]", s->buffer); init_result(&result); if (SUCCEED == process(s->buffer, PROCESS_WITH_ALIAS, &result)) { if (NULL != (value = GET_TEXT_RESULT(&result))) { zabbix_log(LOG_LEVEL_DEBUG, "Sending back [%s]", *value); ret = zbx_tcp_send_to(s, *value, CONFIG_TIMEOUT); } } else { value = GET_MSG_RESULT(&result); if (NULL != value) { static char *buffer = NULL; static size_t buffer_alloc = 256; size_t buffer_offset = 0; zabbix_log(LOG_LEVEL_DEBUG, "Sending back [" ZBX_NOTSUPPORTED ": %s]", *value); if (NULL == buffer) buffer = (char *)zbx_malloc(buffer, buffer_alloc); zbx_strncpy_alloc(&buffer, &buffer_alloc, &buffer_offset, ZBX_NOTSUPPORTED, ZBX_CONST_STRLEN(ZBX_NOTSUPPORTED)); buffer_offset++; zbx_strcpy_alloc(&buffer, &buffer_alloc, &buffer_offset, *value); ret = zbx_tcp_send_bytes_to(s, buffer, buffer_offset, CONFIG_TIMEOUT); } else { zabbix_log(LOG_LEVEL_DEBUG, "Sending back [" ZBX_NOTSUPPORTED "]"); ret = zbx_tcp_send_to(s, ZBX_NOTSUPPORTED, CONFIG_TIMEOUT); } } free_result(&result); } if (FAIL == ret) zabbix_log(LOG_LEVEL_DEBUG, "Process listener error: %s", zbx_socket_strerror()); }
static void process_trapper_child(zbx_sock_t *sock) { char *data; if (SUCCEED != zbx_tcp_recv_to(sock, &data, CONFIG_TRAPPER_TIMEOUT)) return; process_trap(sock, data, sizeof(data)); }
/****************************************************************************** * * * Function: * * * * Purpose: * * * * Parameters: * * * * Return value: * * * * Comments: * * * ******************************************************************************/ int ja_tcp_recv_to(zbx_sock_t * s, ja_job_object * job, int timeout) { int ret, cnt=0; char *data; const char *__function_name = "ja_tcp_recv_to"; zabbix_log(LOG_LEVEL_DEBUG, "In %s()", __function_name); // 2016/01/07 Park.iggy ADD /* ORG ret = zbx_tcp_recv_to(s, &data, timeout); if (ret == FAIL) { zbx_snprintf(job->message, sizeof(job->message), "%s", zbx_tcp_strerror()); goto error; } */ while((ret = zbx_tcp_recv_to(s, &data, timeout+15)) == FAIL){ if(cnt >= 1) break; cnt++; } if (ret == FAIL) { zbx_snprintf(job->message, sizeof(job->message), "%s", zbx_tcp_strerror()); goto error; } //Park.iggy END zabbix_log(LOG_LEVEL_DEBUG, "In %s() %s", __function_name, data); if (strlen(data) == 0) { zbx_snprintf(job->message, sizeof(job->message), "received data is null"); goto error; } zbx_rtrim(data, "\r\n"); ret = ja_telegram_from(data, job); error: if (ret == FAIL) { zabbix_log(LOG_LEVEL_ERR, "In %s() message: %s", __function_name, job->message); } return ret; }
/****************************************************************************** * * * Function: * * * * Purpose: * * * * Parameters: * * * * Return value: * * * * Comments: * * * ******************************************************************************/ int ja_tcp_recv(zbx_sock_t * s, int timeout, json_object * json) { int ret; char *data, *err; json_object *jp; const char *__function_name = "ja_tcp_recv"; zabbix_log(LOG_LEVEL_DEBUG, "In %s()", __function_name); ret = FAIL; jp = NULL; err = NULL; if (zbx_tcp_recv_to(s, &data, timeout) == FAIL) { err = zbx_dsprintf(NULL, "%s", zbx_tcp_strerror()); goto error; } zabbix_log(LOG_LEVEL_DEBUG, "In %s() data: %s", __function_name, data); if (strlen(data) == 0) { err = zbx_dsprintf(NULL, "received data is null"); goto error; } jp = json_tokener_parse(data); if (is_error(jp)) { err = zbx_dsprintf(NULL, "can not parse json data: %s", data); goto error; } json_object_object_add(json, "data", jp); ret = SUCCEED; error: if (ret == FAIL) { zabbix_log(LOG_LEVEL_ERR, "In %s() error: %s", __function_name, err); json_object_object_add(json, "data", json_object_new_string(err)); } if (err != NULL) zbx_free(err); return ret; }