static void handle_metric_buffer(const char *payload, int payload_len, int has_noit) { if (payload_len <= 0) { return; } switch (payload[0]) { case 'C': case 'D': case 'S': case 'H': case 'M': { // mtev_fq will free the fq_msg -> copy the payload char *copy = mtev__strndup(payload, payload_len); noit_metric_message_t *message = calloc(1, sizeof(noit_metric_message_t)); message->type = copy[0]; message->original_message = copy; message->original_message_len = payload_len; noit_metric_director_message_ref(message); int rv = noit_message_decoder_parse_line(copy, payload_len, &message->id.id, &message->id.name, &message->id.name_len, &message->value, has_noit); if(rv == 1) { distribute_message(message); } noit_metric_director_message_deref(message); } break; case 'B': { int n_metrics, i; char **metrics = NULL; n_metrics = noit_check_log_b_to_sm((const char *)payload, payload_len, &metrics, has_noit); for(i = 0; i < n_metrics; i++) { handle_metric_buffer(metrics[i], strlen(metrics[i]), false); free(metrics[i]); } free(metrics); } break; default: ; /* ignored */ } }
static int reflect_message_fragment(struct client *cl) { ssize_t rc; char *msg; /* do read */ rc = read(cl->fd, read_buf, sizeof(read_buf)); if (rc == -1) { if (errno == EAGAIN || errno == EINTR) return 0; return -1; } else if (rc == 0) return -1; cl->rbuf = uim_helper_buffer_append(cl->rbuf, read_buf, rc); while ((msg = uim_helper_buffer_get_message(cl->rbuf))) { distribute_message(msg, cl); free(msg); } return 1; }