| summaryrefslogtreecommitdiff |
diff options
Diffstat (limited to 'src/config/parameters/handle_remote_client_commands.c')
| -rw-r--r-- | src/config/parameters/handle_remote_client_commands.c | 302 |
1 files changed, 295 insertions, 7 deletions
diff --git a/src/config/parameters/handle_remote_client_commands.c b/src/config/parameters/handle_remote_client_commands.c index 5523e37..caa82dc 100644 --- a/src/config/parameters/handle_remote_client_commands.c +++ b/src/config/parameters/handle_remote_client_commands.c @@ -58,6 +58,10 @@ static int get_next_argument return -1; } + /* + * size is "not including the terminating null byte", so it's the '\n' + * character. + */ input->buffer[(input->size - 1)] = '\0'; return 0; @@ -89,7 +93,7 @@ static void finalize_client_input static int handle_timeout_change ( struct relabsd_parameters_client_input input [const restrict static 1], - struct relabsd_parameters parameters [const static 1] + struct relabsd_parameters parameters [const restrict static 1] ) { int timeout_msec; @@ -113,12 +117,281 @@ static int handle_timeout_change return 0; } -static int handle_inputs +static int handle_name_change +( + struct relabsd_parameters_client_input input [const restrict static 1], + struct relabsd_parameters parameters [const restrict static 1] +) +{ + const char * device_name; + + if (get_next_argument(input) < 0) + { + RELABSD_S_ERROR("Could not get device name value from client."); + + return -1; + } + + device_name = + (const char *) calloc((size_t) (input->size - 1), sizeof(char)); + + if (device_name == (const char *) NULL) + { + RELABSD_S_ERROR + ( + "Could not allocate memory to store the device name requested by" + " the client." + ); + + return -1; + } + + (void) memcpy + ( + (void *) device_name, + (const void *) input->buffer, + (size_t) (input->size - 1) + ); + + if (parameters->device_name_was_modified) + { + free((void *) parameters->device_name); + } + + parameters->device_name = device_name; + parameters->device_name_was_modified = 1; + + return 0; +} + +static int handle_axis_mod ( struct relabsd_parameters_client_input input [const restrict static 1], struct relabsd_parameters parameters [const static 1] ) { + enum relabsd_axis_name axis_name; + int * value_to_modify; + int min_value; + int input_value; + + if (get_next_argument(input) < 0) + { + RELABSD_S_ERROR("Could not get name of axis to modify from client."); + + return -1; + } + + axis_name = relabsd_axis_parse_name(input->buffer); + + if (axis_name == RELABSD_UNKNOWN) + { + RELABSD_ERROR + ( + "Client requested modification on unknown axis \"%s\".", + input->buffer + ); + + return -1; + } + + if (get_next_argument(input) < 0) + { + RELABSD_S_ERROR("Could not get parameter of axis to modify from client."); + + return -1; + } + + if (RELABSD_STRING_EQUALS("min", input->buffer)) + { + value_to_modify = &(parameters->axes[axis_name].min); + min_value = INT_MIN; + } + else if (RELABSD_STRING_EQUALS("max", input->buffer)) + { + value_to_modify = &(parameters->axes[axis_name].max); + min_value = INT_MIN; + } + else if (RELABSD_STRING_EQUALS("fuzz", input->buffer)) + { + value_to_modify = &(parameters->axes[axis_name].fuzz); + min_value = 0; + } + else if (RELABSD_STRING_EQUALS("flat", input->buffer)) + { + value_to_modify = &(parameters->axes[axis_name].flat); + min_value = 0; + } + else if (RELABSD_STRING_EQUALS("resolution", input->buffer)) + { + value_to_modify = &(parameters->axes[axis_name].resolution); + min_value = 0; + } + else + { + RELABSD_ERROR + ( + "Client requested modification on unknown axis parameter \"%s\".", + input->buffer + ); + + return -1; + } + + if (get_next_argument(input) < 0) + { + RELABSD_S_ERROR + ( + "Could not get new value for axis modification requested by client." + ); + + return -1; + } + + if + ( + relabsd_util_parse_int + ( + (input->buffer + 1), + min_value, + INT_MAX, + &input_value + ) + < 0 + ) + { + RELABSD_ERROR + ( + "Invalid value \"%s\"for axis modification requested by client.", + (input->buffer + 1) + ); + + return -1; + } + + switch (input->buffer[0]) + { + case '=': + *value_to_modify = input_value; + break; + + case '-': + if (input_value == INT_MIN) + { + input_value = INT_MAX; + } + else + { + input_value = -input_value; + } + /* fall through */ + case '+': + if + ( + ( + (input_value > 0) + && (*value_to_modify > (INT_MAX - input_value)) + ) + || + ( + (input_value < 0) + && (*value_to_modify < (min_value - input_value)) + ) + ) + { + RELABSD_S_WARNING + ( + "Client request would make axis parameter over/underflow." + ); + + *value_to_modify = (input_value < 0) ? min_value : INT_MAX; + } + else + { + *value_to_modify += input_value; + } + break; + } + + parameters->axes[axis_name].previous_value = 0; + parameters->axes[axis_name].attributes_were_modified = 1; + + return 0; +} + +static int handle_option_toggle +( + struct relabsd_parameters_client_input input [const restrict static 1], + struct relabsd_parameters parameters [const restrict static 1] +) +{ + enum relabsd_axis_name axis_name; + + if (get_next_argument(input) < 0) + { + RELABSD_S_ERROR("Could not get name of axis to modify from client."); + + return -1; + } + + axis_name = relabsd_axis_parse_name(input->buffer); + + if (axis_name == RELABSD_UNKNOWN) + { + RELABSD_ERROR + ( + "Client requested modification on unknown axis \"%s\".", + input->buffer + ); + + return -1; + } + + if (get_next_argument(input) < 0) + { + RELABSD_S_ERROR("Could not get option of axis to modify from client."); + + return -1; + } + + if (RELABSD_STRING_EQUALS("framed", input->buffer)) + { + parameters->axes[axis_name].flags[RELABSD_FRAMED] ^= 1; + } + else if (RELABSD_STRING_EQUALS("direct", input->buffer)) + { + parameters->axes[axis_name].flags[RELABSD_DIRECT] ^= 1; + } + else if (RELABSD_STRING_EQUALS("real_fuzz", input->buffer)) + { + parameters->axes[axis_name].flags[RELABSD_REAL_FUZZ] ^= 1; + } + else if (RELABSD_STRING_EQUALS("enable", input->buffer)) + { + parameters->axes[axis_name].is_enabled ^= 1; + } + else + { + RELABSD_ERROR + ( + "Client requested toggle of unknown axis option \"%s\".", + input->buffer + ); + + return -1; + } + + parameters->axes[axis_name].previous_value = 0; + + return 0; +} + +static int handle_inputs +( + struct relabsd_parameters_client_input input [const restrict static 1], + struct relabsd_parameters parameters [const restrict static 1] +) +{ for (;;) { if (get_next_argument(input) < 0) @@ -148,7 +421,7 @@ static int handle_inputs { if (handle_timeout_change(input, parameters) < 0) { - return 0; + return -1; } } else if @@ -157,8 +430,10 @@ static int handle_inputs || RELABSD_STRING_EQUALS("--name", input->buffer) ) { - /* TODO: implement */ - RELABSD_PROG_ERROR("Unimplemented command \"%s\".", input->buffer); + if (handle_name_change(input, parameters) < 0) + { + return -1; + } } else if ( @@ -166,8 +441,21 @@ static int handle_inputs || RELABSD_STRING_EQUALS("--mod-axis", input->buffer) ) { - /* TODO: implement */ - RELABSD_PROG_ERROR("Unimplemented command \"%s\".", input->buffer); + if (handle_axis_mod(input, parameters) < 0) + { + return -1; + } + } + else if + ( + RELABSD_STRING_EQUALS("-o", input->buffer) + || RELABSD_STRING_EQUALS("--toggle-option", input->buffer) + ) + { + if (handle_option_toggle(input, parameters) < 0) + { + return -1; + } } else { |


