From cf7ed8c5df3ca2a4a10c389097732d9e55234ae4 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 15 Oct 2008 18:21:57 +0200 Subject: idle: client command "noidle" aborts idle --- src/client.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/client.c b/src/client.c index 48189992c..5b3b161b5 100644 --- a/src/client.c +++ b/src/client.c @@ -345,6 +345,27 @@ static int client_process_line(struct client *client, char *line) { int ret = 1; + if (strcmp(line, "noidle") == 0) { + if (client->idle_waiting) { + /* send empty idle response and leave idle mode */ + client->idle_waiting = false; + command_success(client); + client_write_output(client); + } + + /* do nothing if the client wasn't idling: the client + has already received the full idle response from + client_idle_notify(), which he can now evaluate */ + + return 0; + } else if (client->idle_waiting) { + /* during idle mode, clients must not send anything + except "noidle" */ + ERROR("client %i: command \"%s\" during idle\n", + client->num, line); + return COMMAND_RETURN_CLOSE; + } + if (client->cmd_list_OK >= 0) { if (strcmp(line, CLIENT_LIST_MODE_END) == 0) { DEBUG("client %i: process command " @@ -418,9 +439,6 @@ static int client_input_received(struct client *client, int bytesRead) char *newline, *next; int ret; - /* any input from the client makes it leave "idle" mode */ - client->idle_waiting = false; - client->bufferLength += bytesRead; /* process all lines */ -- cgit v1.2.3