Commit e118e958 authored by Max Kellermann's avatar Max Kellermann

protocol/ArgParser: add overload with max_value parameter

parent ee61dfe0
...@@ -309,14 +309,9 @@ CommandResult ...@@ -309,14 +309,9 @@ CommandResult
handle_setvol(Client &client, Request args) handle_setvol(Client &client, Request args)
{ {
unsigned level; unsigned level;
if (!ParseCommandArg(client, level, args.front())) if (!ParseCommandArg(client, level, args.front(), 100))
return CommandResult::ERROR; return CommandResult::ERROR;
if (level > 100) {
command_error(client, ACK_ERROR_ARG, "Invalid volume value");
return CommandResult::ERROR;
}
if (!volume_level_change(client.partition.outputs, level)) { if (!volume_level_change(client.partition.outputs, level)) {
command_error(client, ACK_ERROR_SYSTEM, command_error(client, ACK_ERROR_SYSTEM,
"problems setting volume"); "problems setting volume");
...@@ -330,14 +325,9 @@ CommandResult ...@@ -330,14 +325,9 @@ CommandResult
handle_volume(Client &client, Request args) handle_volume(Client &client, Request args)
{ {
int relative; int relative;
if (!ParseCommandArg(client, relative, args.front())) if (!ParseCommandArg(client, relative, args.front(), -100, 100))
return CommandResult::ERROR; return CommandResult::ERROR;
if (relative < -100 || relative > 100) {
command_error(client, ACK_ERROR_ARG, "Invalid volume value");
return CommandResult::ERROR;
}
const int old_volume = volume_level_get(client.partition.outputs); const int old_volume = volume_level_get(client.partition.outputs);
if (old_volume < 0) { if (old_volume < 0) {
command_error(client, ACK_ERROR_SYSTEM, "No mixer"); command_error(client, ACK_ERROR_SYSTEM, "No mixer");
......
...@@ -314,15 +314,9 @@ handle_prio(Client &client, Request args) ...@@ -314,15 +314,9 @@ handle_prio(Client &client, Request args)
{ {
const char *const priority_string = args.shift(); const char *const priority_string = args.shift();
unsigned priority; unsigned priority;
if (!ParseCommandArg(client, priority, priority_string)) if (!ParseCommandArg(client, priority, priority_string, 0xff))
return CommandResult::ERROR; return CommandResult::ERROR;
if (priority > 0xff) {
command_error(client, ACK_ERROR_ARG,
"Priority out of range: %s", priority_string);
return CommandResult::ERROR;
}
for (const char *i : args) { for (const char *i : args) {
RangeArg range; RangeArg range;
if (!ParseCommandArg(client, range, i)) if (!ParseCommandArg(client, range, i))
...@@ -344,15 +338,9 @@ handle_prioid(Client &client, Request args) ...@@ -344,15 +338,9 @@ handle_prioid(Client &client, Request args)
{ {
const char *const priority_string = args.shift(); const char *const priority_string = args.shift();
unsigned priority; unsigned priority;
if (!ParseCommandArg(client, priority, priority_string)) if (!ParseCommandArg(client, priority, priority_string, 0xff))
return CommandResult::ERROR; return CommandResult::ERROR;
if (priority > 0xff) {
command_error(client, ACK_ERROR_ARG,
"Priority out of range: %s", priority_string);
return CommandResult::ERROR;
}
for (const char *i : args) { for (const char *i : args) {
unsigned song_id; unsigned song_id;
if (!ParseCommandArg(client, song_id, i)) if (!ParseCommandArg(client, song_id, i))
......
...@@ -39,7 +39,8 @@ check_uint32(Client &client, uint32_t *dst, const char *s) ...@@ -39,7 +39,8 @@ check_uint32(Client &client, uint32_t *dst, const char *s)
} }
bool bool
ParseCommandArg(Client &client, int &value_r, const char *s) ParseCommandArg(Client &client, int &value_r, const char *s,
int min_value, int max_value)
{ {
char *test; char *test;
long value; long value;
...@@ -51,8 +52,7 @@ ParseCommandArg(Client &client, int &value_r, const char *s) ...@@ -51,8 +52,7 @@ ParseCommandArg(Client &client, int &value_r, const char *s)
return false; return false;
} }
if (value < std::numeric_limits<int>::min() || if (value < min_value || value > max_value) {
value > std::numeric_limits<int>::max()) {
command_error(client, ACK_ERROR_ARG, command_error(client, ACK_ERROR_ARG,
"Number too large: %s", s); "Number too large: %s", s);
return false; return false;
...@@ -63,6 +63,14 @@ ParseCommandArg(Client &client, int &value_r, const char *s) ...@@ -63,6 +63,14 @@ ParseCommandArg(Client &client, int &value_r, const char *s)
} }
bool bool
ParseCommandArg(Client &client, int &value_r, const char *s)
{
return ParseCommandArg(client, value_r, s,
std::numeric_limits<int>::min(),
std::numeric_limits<int>::max());
}
bool
ParseCommandArg(Client &client, RangeArg &value_r, const char *s) ParseCommandArg(Client &client, RangeArg &value_r, const char *s)
{ {
char *test, *test2; char *test, *test2;
...@@ -129,7 +137,8 @@ ParseCommandArg(Client &client, RangeArg &value_r, const char *s) ...@@ -129,7 +137,8 @@ ParseCommandArg(Client &client, RangeArg &value_r, const char *s)
} }
bool bool
ParseCommandArg(Client &client, unsigned &value_r, const char *s) ParseCommandArg(Client &client, unsigned &value_r, const char *s,
unsigned max_value)
{ {
unsigned long value; unsigned long value;
char *endptr; char *endptr;
...@@ -141,7 +150,7 @@ ParseCommandArg(Client &client, unsigned &value_r, const char *s) ...@@ -141,7 +150,7 @@ ParseCommandArg(Client &client, unsigned &value_r, const char *s)
return false; return false;
} }
if (value > std::numeric_limits<unsigned>::max()) { if (value > max_value) {
command_error(client, ACK_ERROR_ARG, command_error(client, ACK_ERROR_ARG,
"Number too large: %s", s); "Number too large: %s", s);
return false; return false;
...@@ -152,6 +161,13 @@ ParseCommandArg(Client &client, unsigned &value_r, const char *s) ...@@ -152,6 +161,13 @@ ParseCommandArg(Client &client, unsigned &value_r, const char *s)
} }
bool bool
ParseCommandArg(Client &client, unsigned &value_r, const char *s)
{
return ParseCommandArg(client, value_r, s,
std::numeric_limits<unsigned>::max());
}
bool
ParseCommandArg(Client &client, bool &value_r, const char *s) ParseCommandArg(Client &client, bool &value_r, const char *s)
{ {
long value; long value;
......
...@@ -34,6 +34,10 @@ bool ...@@ -34,6 +34,10 @@ bool
check_uint32(Client &client, uint32_t *dst, const char *s); check_uint32(Client &client, uint32_t *dst, const char *s);
bool bool
ParseCommandArg(Client &client, int &value_r, const char *s,
int min_value, int max_value);
bool
ParseCommandArg(Client &client, int &value_r, const char *s); ParseCommandArg(Client &client, int &value_r, const char *s);
struct RangeArg { struct RangeArg {
...@@ -49,6 +53,10 @@ bool ...@@ -49,6 +53,10 @@ bool
ParseCommandArg(Client &client, RangeArg &value_r, const char *s); ParseCommandArg(Client &client, RangeArg &value_r, const char *s);
bool bool
ParseCommandArg(Client &client, unsigned &value_r, const char *s,
unsigned max_value);
bool
ParseCommandArg(Client &client, unsigned &value_r, const char *s); ParseCommandArg(Client &client, unsigned &value_r, const char *s);
bool bool
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment