diff options
-rw-r--r-- | doc/COMMANDS | 6 | ||||
-rw-r--r-- | src/client.c | 24 |
2 files changed, 25 insertions, 5 deletions
diff --git a/doc/COMMANDS b/doc/COMMANDS index 718dcf24e..e84f85afd 100644 --- a/doc/COMMANDS +++ b/doc/COMMANDS @@ -282,8 +282,10 @@ idle While a client waits for "idle" results, the server disables timeouts, allowing a client to wait for events as long as mpd - runs. The "idle" command can be canceled by sending a new - command. + runs. The "idle" command can be canceled by sending the + command "noidle" (no other commands are allowed). MPD will + then leave "idle" mode and print results immediately; might be + empty at this time. COMMAND LIST 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 */ |