diff options
author | Max Kellermann <max@duempel.org> | 2014-02-09 08:05:02 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2014-02-09 08:07:48 +0100 |
commit | 570b12ec1392dc6561b21c7bb8b653eb7a922a01 (patch) | |
tree | 670fa261da1ee278273b095d29feb36688ada785 /src | |
parent | ac286ef734cb3d8cc59acb71096da29c6d83d690 (diff) | |
download | mpd-570b12ec1392dc6561b21c7bb8b653eb7a922a01.tar.gz mpd-570b12ec1392dc6561b21c7bb8b653eb7a922a01.tar.xz mpd-570b12ec1392dc6561b21c7bb8b653eb7a922a01.zip |
Idle: error out when unrecognized idle event was specified
Implements the error checks missing in commit 0bad8406
Diffstat (limited to '')
-rw-r--r-- | src/Idle.cxx | 13 | ||||
-rw-r--r-- | src/Idle.hxx | 10 | ||||
-rw-r--r-- | src/command/OtherCommands.cxx | 17 |
3 files changed, 32 insertions, 8 deletions
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 */ |