From 37c5641b9fa8529d3d0ea7fb4bc9f23e2539de65 Mon Sep 17 00:00:00 2001 From: Martin Pulec Date: Wed, 20 May 2015 14:02:26 +0200 Subject: [PATCH] Control socket: added option to toggle statistic --- src/control_socket.cpp | 52 +++++++++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 19 deletions(-) diff --git a/src/control_socket.cpp b/src/control_socket.cpp index 274211c13..06b7d3367 100644 --- a/src/control_socket.cpp +++ b/src/control_socket.cpp @@ -117,6 +117,8 @@ struct control_state { thread stat_thread_id; condition_variable stat_cv; queue stat_queue; + + bool stats_on; }; #define CONTROL_EXIT -1 @@ -319,29 +321,41 @@ static int process_msg(struct control_state *s, fd_t client_fd, char *message, s if(strcasecmp(message, "quit") == 0) { return CONTROL_EXIT; } else if (prefix_matches(message, "stats ")) { - assert(is_internal_port(client_fd)); - struct client *cur = clients; - char *new_msg = NULL; + if (is_internal_port(client_fd)) { + struct client *cur = clients; + char *new_msg = NULL; - while (cur) { - if(is_internal_port(cur->fd)) { // skip local FD + while (cur) { + if(is_internal_port(cur->fd)) { // skip local FD + cur = cur->next; + continue; + } + if (!new_msg) { + // append again + new_msg = (char *) malloc(strlen(message) + 1 + 2); + strcpy(new_msg, message); + new_msg[strlen(message)] = '\r'; + new_msg[strlen(message) + 1] = '\n'; + new_msg[strlen(message) + 2] = '\0'; + } + + write_all(cur->fd, new_msg, strlen(new_msg)); cur = cur->next; - continue; } - if (!new_msg) { - // append again - new_msg = (char *) malloc(strlen(message) + 1 + 2); - strcpy(new_msg, message); - new_msg[strlen(message)] = '\r'; - new_msg[strlen(message) + 1] = '\n'; - new_msg[strlen(message) + 2] = '\0'; + free(new_msg); + return ret; + } else { + const char *toggle = suffix(message, "stats "); + if (strcasecmp(toggle, "on") == 0) { + s->stats_on = true; + resp = new_response(RESPONSE_OK, NULL); + } else if (strcasecmp(toggle, "off") == 0) { + s->stats_on = false; + resp = new_response(RESPONSE_OK, NULL); + } else { + resp = new_response(RESPONSE_BAD_REQUEST, NULL); } - - write_all(cur->fd, new_msg, strlen(new_msg)); - cur = cur->next; } - free(new_msg); - return ret; } else if(prefix_matches(message, "receiver ") || prefix_matches(message, "play") || prefix_matches(message, "pause") || prefix_matches(message, "sender-port ")) { struct msg_sender *msg = @@ -741,7 +755,7 @@ void control_done(struct control_state *s) void control_report_stats(struct control_state *s, const std::string &report_line) { - if (!s) { + if (!s || !s->stats_on) { return; }