diff options
-rw-r--r-- | NEWS | 1 | ||||
-rw-r--r-- | src/Idle.cxx | 13 | ||||
-rw-r--r-- | src/Idle.hxx | 10 | ||||
-rw-r--r-- | src/command/OtherCommands.cxx | 17 |
4 files changed, 33 insertions, 8 deletions
@@ -4,6 +4,7 @@ ver 0.19 (not yet released) - "lsinfo" and "readcomments" allowed for remote files - "listneighbors" lists file servers on the local network - "playlistadd" supports file:/// + - "idle" with unrecognized event name fails * database - proxy: forward "idle" events - proxy: copy "Last-Modified" from remote directories diff --git a/src/Idle.cxx b/src/Idle.cxx index ed16bbecb..713454da5 100644 --- a/src/Idle.cxx +++ b/src/Idle.cxx @@ -25,6 +25,7 @@ #include "config.h" #include "Idle.hxx" #include "GlobalEvents.hxx" +#include "util/ASCII.hxx" #include <atomic> @@ -70,3 +71,15 @@ idle_get_names(void) { return idle_names; } + +unsigned +idle_parse_name(const char *name) +{ + assert(name != nullptr); + + for (unsigned i = 0; idle_names[i] != nullptr; ++i) + if (StringEqualsCaseASCII(name, idle_names[i])) + return 1 << i; + + return 0; +} diff --git a/src/Idle.hxx b/src/Idle.hxx index 7fc79d10a..48f7a6aa0 100644 --- a/src/Idle.hxx +++ b/src/Idle.hxx @@ -25,6 +25,8 @@ #ifndef MPD_IDLE_HXX #define MPD_IDLE_HXX +#include "Compiler.h" + /** song database has been updated*/ static constexpr unsigned IDLE_DATABASE = 0x1; @@ -81,4 +83,12 @@ idle_get(void); const char*const* idle_get_names(void); +/** + * Parse an idle name and return its mask. Returns 0 if the given + * name is unknown. + */ +gcc_nonnull_all gcc_pure +unsigned +idle_parse_name(const char *name); + #endif diff --git a/src/command/OtherCommands.cxx b/src/command/OtherCommands.cxx index 3c0b6963a..b3564040c 100644 --- a/src/command/OtherCommands.cxx +++ b/src/command/OtherCommands.cxx @@ -33,7 +33,6 @@ #include "protocol/Result.hxx" #include "ls.hxx" #include "mixer/Volume.hxx" -#include "util/ASCII.hxx" #include "util/UriUtil.hxx" #include "util/Error.hxx" #include "fs/AllocatedPath.hxx" @@ -363,17 +362,19 @@ CommandResult handle_idle(Client &client, gcc_unused int argc, gcc_unused char *argv[]) { - unsigned flags = 0, j; + unsigned flags = 0; int i; - const char *const* idle_names; - idle_names = idle_get_names(); for (i = 1; i < argc; ++i) { - for (j = 0; idle_names[j]; ++j) { - if (StringEqualsCaseASCII(argv[i], idle_names[j])) { - flags |= (1 << j); - } + unsigned event = idle_parse_name(argv[i]); + if (event == 0) { + command_error(client, ACK_ERROR_ARG, + "Unrecognized idle event: %s", + argv[i]); + return CommandResult::ERROR; } + + flags |= event; } /* No argument means that the client wants to receive everything */ |