aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/COMMANDS6
-rw-r--r--src/client.c24
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 */