| summaryrefslogtreecommitdiff |
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-01-04 21:31:55 +0100 |
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-01-04 21:31:55 +0100 |
| commit | ee48214209e66aa8c6f353262b175895373f76df (patch) | |
| tree | c2b61a4bd702602d856f613992c46a802e0a888c | |
| parent | 0c68e544b113f0493b9b80511c26c1e4584bd1e7 (diff) | |
...
| -rw-r--r-- | CMakeLists.txt | 8 | ||||
| -rw-r--r-- | include/relabsd/client.h | 12 | ||||
| -rw-r--r-- | include/relabsd/config/parameters.h | 16 | ||||
| -rw-r--r-- | include/relabsd/config/parameters_types.h | 5 | ||||
| -rw-r--r-- | include/relabsd/device/axis.h | 6 | ||||
| -rw-r--r-- | include/relabsd/device/physical_device.h | 6 | ||||
| -rw-r--r-- | include/relabsd/device/virtual_device.h | 4 | ||||
| -rw-r--r-- | include/relabsd/server.h | 39 | ||||
| -rw-r--r-- | include/relabsd/server_types.h | 18 | ||||
| -rw-r--r-- | src/client.c | 9 | ||||
| -rw-r--r-- | src/config/parameters/parameters.c | 16 | ||||
| -rw-r--r-- | src/config/parameters/parameters_accessors.c | 48 | ||||
| -rw-r--r-- | src/config/parameters/parse_config_file.c | 68 | ||||
| -rw-r--r-- | src/device/physical/physical_device.c | 12 | ||||
| -rw-r--r-- | src/device/virtual/virtual_device.c | 6 | ||||
| -rw-r--r-- | src/main.c | 11 | ||||
| -rw-r--r-- | src/server/communication_node.c | 15 | ||||
| -rw-r--r-- | src/server/communication_thread.c | 33 | ||||
| -rw-r--r-- | src/server/conversion_main_loop.c | 331 | ||||
| -rw-r--r-- | src/server/daemon.c | 5 | ||||
| -rw-r--r-- | src/server/interruption.c | 69 | ||||
| -rw-r--r-- | src/server/server.c | 45 | ||||
| -rw-r--r-- | src/util/string.c | 1 |
23 files changed, 561 insertions, 222 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index f5da0f6..1f76a90 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,7 @@ include(FindPkgConfig) # ${SRC_FILES} is recursively defined in the subdirectories. # Each subdirectory adds only the source files that are present at its level. -file(GLOB_RECURSE SRC_FILES src/ true *.c) +file(GLOB_RECURSE SRC_FILES src/ true src/*.c) add_executable(relabsd ${SRC_FILES}) include_directories(include/) @@ -21,10 +21,14 @@ pkg_search_module(LIBEVDEV REQUIRED libevdev) include_directories(${LIBEVDEV_INCLUDE_DIRS}) target_link_libraries(relabsd ${LIBEVDEV_LIBRARIES}) +# We use pthreads. +find_package(Threads) +target_link_libraries(relabsd ${CMAKE_THREAD_LIBS_INIT}) + # Be loud about dubious code. if (CMAKE_COMPILER_IS_GNUCC) message(STATUS "CMake is using GNUCC. Verbose flags are activated.") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -pedantic -Wextra") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -pedantic -Werror -Wextra") endif (CMAKE_COMPILER_IS_GNUCC) option( diff --git a/include/relabsd/client.h b/include/relabsd/client.h index e69de29..21e3b74 100644 --- a/include/relabsd/client.h +++ b/include/relabsd/client.h @@ -0,0 +1,12 @@ +#pragma once + +#include <relabsd/client_types.h> + +#include <relabsd/config/parameters.h> + +int relabsd_client_main +( + const int argc, + const char * const argv [const static argc], + struct relabsd_parameters parameters [const restrict static 1] +); diff --git a/include/relabsd/config/parameters.h b/include/relabsd/config/parameters.h index 8a5df32..215f61c 100644 --- a/include/relabsd/config/parameters.h +++ b/include/relabsd/config/parameters.h @@ -75,5 +75,21 @@ enum relabsd_parameters_run_mode relabsd_parameters_get_execution_mode struct relabsd_axis * relabsd_parameters_get_axis ( const enum relabsd_axis_name i, + struct relabsd_parameters parameters [const restrict static 1] +); + +void relabsd_parameters_set_timeout +( + const int timeout_msec, + struct relabsd_parameters parameters [const restrict static 1] +); + +struct timeval relabsd_parameters_get_timeout +( + const struct relabsd_parameters parameters [const restrict static 1] +); + +int relabsd_parameters_use_timeout +( const struct relabsd_parameters parameters [const restrict static 1] ); diff --git a/include/relabsd/config/parameters_types.h b/include/relabsd/config/parameters_types.h index e6c4009..f7b82b1 100644 --- a/include/relabsd/config/parameters_types.h +++ b/include/relabsd/config/parameters_types.h @@ -1,5 +1,7 @@ #pragma once +#include <sys/time.h> + #include <relabsd/device/axis_types.h> enum relabsd_parameters_run_mode @@ -18,6 +20,7 @@ struct relabsd_parameters const char * device_name; const char * physical_device_file_name; const char * configuration_file; - int timeout; /* TODO: use time structure + enabled flag */ + int use_timeout; + struct timeval timeout; struct relabsd_axis axes[RELABSD_AXIS_VALID_AXES_COUNT]; }; diff --git a/include/relabsd/device/axis.h b/include/relabsd/device/axis.h index 792a1cd..1638b80 100644 --- a/include/relabsd/device/axis.h +++ b/include/relabsd/device/axis.h @@ -82,3 +82,9 @@ void relabsd_axis_to_absinfo struct relabsd_axis axis [const restrict static 1], struct input_absinfo absinfo [const restrict static 1] ); + +int relabsd_axis_filter_new_value +( + struct relabsd_axis axis [const restrict static 1], + int value [const restrict static 1] +); diff --git a/include/relabsd/device/physical_device.h b/include/relabsd/device/physical_device.h index 910d46f..33ff18a 100644 --- a/include/relabsd/device/physical_device.h +++ b/include/relabsd/device/physical_device.h @@ -27,7 +27,6 @@ void relabsd_physical_device_close * * The 'input_*' parameters do not need to be initialized, as the function will * do that for you (on success). - * Requires 'input' to be open. */ int relabsd_physical_device_read ( @@ -41,3 +40,8 @@ int relabsd_physical_device_is_late ( const struct relabsd_physical_device device [const restrict static 1] ); + +int relabsd_physical_device_get_file_descriptor +( + const struct relabsd_physical_device device [const restrict static 1] +); diff --git a/include/relabsd/device/virtual_device.h b/include/relabsd/device/virtual_device.h index 5ffd1c9..fffb2a3 100644 --- a/include/relabsd/device/virtual_device.h +++ b/include/relabsd/device/virtual_device.h @@ -21,7 +21,7 @@ */ int relabsd_virtual_device_create_from ( - const struct relabsd_parameters parameters [const restrict static 1], + struct relabsd_parameters parameters [const restrict static 1], struct relabsd_virtual_device device [const restrict static 1] ); @@ -51,6 +51,6 @@ int relabsd_virtual_device_write_evdev_event */ void relabsd_virtual_device_set_axes_to_zero ( - const struct relabsd_parameters parameters [const restrict static 1], + struct relabsd_parameters parameters [const restrict static 1], const struct relabsd_virtual_device device [const restrict static 1] ); diff --git a/include/relabsd/server.h b/include/relabsd/server.h index e69de29..2bc0447 100644 --- a/include/relabsd/server.h +++ b/include/relabsd/server.h @@ -0,0 +1,39 @@ +#pragma once + +#include <relabsd/server_types.h> + +int relabsd_server_main +( + const int argc, + const char * const argv [const static argc], + struct relabsd_parameters parameters [const static 1] +); + +int relabsd_server_create_daemon (void); + +int relabsd_server_keep_running (void); +void relabsd_server_interrupt (void); +int relabsd_server_initialize_signal_handlers (void); +void relabsd_server_finalize_signal_handlers (void); +int relabsd_server_get_interruption_file_descriptor (void); + +int relabsd_server_create_communication_thread +( + struct relabsd_server server [const static 1] +); + +int relabsd_server_create_communication_node +( + const char socket_name [const restrict static 1], + int socket [const restrict static 1] +); + +int relabsd_server_conversion_loop +( + struct relabsd_server server [const static 1] +); + +int relabsd_server_join_communication_thread +( + struct relabsd_server server [const static 1] +); diff --git a/include/relabsd/server_types.h b/include/relabsd/server_types.h index e69de29..51a17de 100644 --- a/include/relabsd/server_types.h +++ b/include/relabsd/server_types.h @@ -0,0 +1,18 @@ +#pragma once + +/**** POSIX *******************************************************************/ +#include <pthread.h> + +/**** RELABSD *****************************************************************/ +#include <relabsd/config/parameters_types.h> + +#include <relabsd/device/physical_device_types.h> +#include <relabsd/device/virtual_device_types.h> + +struct relabsd_server +{ + pthread_t communication_thread; + struct relabsd_parameters parameters; + struct relabsd_physical_device physical_device; + struct relabsd_virtual_device virtual_device; +}; diff --git a/src/client.c b/src/client.c index b0459af..4d1f659 100644 --- a/src/client.c +++ b/src/client.c @@ -97,7 +97,7 @@ static int open_socket static int send_commands ( const int argc, - const char * argv [const restrict static argc], + const char * const argv [const restrict static argc], FILE socket [const restrict static 1] ) { @@ -158,16 +158,19 @@ static int receive_reply FILE socket [const restrict static 1] ) { + /* TODO: implement. */ + (void) fclose(socket); + return 0; } /******************************************************************************/ /**** EXPORTED FUNCTIONS ******************************************************/ /******************************************************************************/ -int relabsd_client +int relabsd_client_main ( const int argc, - const char * argv [const restrict static argc], + const char * const argv [const restrict static argc], struct relabsd_parameters parameters [const restrict static 1] ) { diff --git a/src/config/parameters/parameters.c b/src/config/parameters/parameters.c index ac6a790..fa53b6a 100644 --- a/src/config/parameters/parameters.c +++ b/src/config/parameters/parameters.c @@ -216,6 +216,8 @@ int relabsd_parameters_parse_options || RELABSD_STRING_EQUALS("--timeout", argv[i]) ) { + int timeout; + if (argc == i) { RELABSD_FATAL("Missing value for \"%s\" <OPTION>.", argv[i]); @@ -226,17 +228,7 @@ int relabsd_parameters_parse_options ++i; - if - ( - relabsd_util_parse_int - ( - argv[i], - 0, - INT_MAX, - &(parameters->timeout) - ) - < 0 - ) + if (relabsd_util_parse_int(argv[i], 0, INT_MAX, &timeout) < 0) { RELABSD_FATAL ( @@ -250,6 +242,8 @@ int relabsd_parameters_parse_options return -1; } + + relabsd_parameters_set_timeout(timeout, parameters); } else if ( diff --git a/src/config/parameters/parameters_accessors.c b/src/config/parameters/parameters_accessors.c index bd6624c..71c2482 100644 --- a/src/config/parameters/parameters_accessors.c +++ b/src/config/parameters/parameters_accessors.c @@ -1,5 +1,6 @@ -/**** POSIXS ^*****************************************************************/ +/**** POSIXS ******************************************************************/ #include <stdlib.h> +#include <string.h> /**** RELABSD *****************************************************************/ #include <relabsd/config/parameters.h> @@ -66,9 +67,52 @@ enum relabsd_parameters_run_mode relabsd_parameters_get_execution_mode struct relabsd_axis * relabsd_parameters_get_axis ( const enum relabsd_axis_name i, - const struct relabsd_parameters parameters [const restrict static 1] + struct relabsd_parameters parameters [const restrict static 1] ) { return (parameters->axes + i); } +void relabsd_parameters_set_timeout +( + const int timeout_msec, + struct relabsd_parameters parameters [const restrict static 1] +) +{ + if (timeout_msec == 0) + { + parameters->use_timeout = 0; + + return; + } + + parameters->use_timeout = 1; + + (void) memset((void *) &(parameters->timeout), 0, sizeof(struct timeval)); + + /* FIXME: Not sure that's correct. */ + parameters->timeout.tv_sec = (time_t) (timeout_msec / 1000); + parameters->timeout.tv_usec = + ( + ((suseconds_t) timeout_msec) + * ((suseconds_t) 1000) + ); + + return; +} + +int relabsd_parameters_use_timeout +( + const struct relabsd_parameters parameters [const restrict static 1] +) +{ + return parameters->use_timeout; +} + +struct timeval relabsd_parameters_get_timeout +( + const struct relabsd_parameters parameters [const restrict static 1] +) +{ + return parameters->timeout; +} diff --git a/src/config/parameters/parse_config_file.c b/src/config/parameters/parse_config_file.c index a6920b4..c01090d 100644 --- a/src/config/parameters/parse_config_file.c +++ b/src/config/parameters/parse_config_file.c @@ -123,47 +123,66 @@ static int read_axis_options return -1; } -/* -static int parse_timeout_option +static int parse_timeout_configuration_line ( - struct relabsd_config * const conf, - const char * const param + FILE file [const restrict static 1], + struct relabsd_parameters parameters [const static 1] ) { + int read_count; int timeout_msec; - const int prev_errno = errno; - - conf->enable_timeout = 1; errno = 0; - timeout_msec = atoi(param); + read_count = fscanf(file, "%d", &timeout_msec); - if (timeout_msec <= 0) + if (read_count == EOF) { - RELABSD_FATAL + if (errno == 0) + { + RELABSD_S_FATAL + ( + "Unexpected end of file while reading the timeout parameter in the" + " configuration file." + ); + } + else + { + RELABSD_FATAL + ( + "An error occured while reading the timeout parameter in the" + " configuration file: %s.", + strerror(errno) + ); + } + + return -1; + } + else if (read_count < 1) + { + RELABSD_S_FATAL ( - "Illegal value for timeout \"%d\": accepted range is [1, %d].", - timeout_msec, - INT_MAX + "Invalid parameter count for the timeout option in the configuration" + " file." ); return -1; } - - memset((void *) &(conf->timeout), 0, sizeof(struct timeval)); - - conf->timeout.tv_sec = (time_t) (timeout_msec / 1000); - - conf->timeout.tv_usec = + else if (timeout_msec < 0) + { + RELABSD_FATAL ( - ((suseconds_t) timeout_msec) - * ((suseconds_t) 1000) + "Invalid value the timeout option in the configuration file (%d).", + timeout_msec ); + return -1; + } + + relabsd_parameters_set_timeout(timeout_msec, parameters); + return 0; } -*/ /* * Returns -1 on (fatal) error, @@ -184,6 +203,11 @@ static int parse_axis_configuration_line if (axis_index == RELABSD_UNKNOWN) { + if (RELABSD_IS_PREFIX("TO", axis_name)) + { + return parse_timeout_configuration_line(file, parameters); + } + RELABSD_FATAL("Unknown axis '%s' in the configuration file.", axis_name); return -1; diff --git a/src/device/physical/physical_device.c b/src/device/physical/physical_device.c index e7b4167..ca6f595 100644 --- a/src/device/physical/physical_device.c +++ b/src/device/physical/physical_device.c @@ -196,6 +196,10 @@ int relabsd_physical_device_read return -1; } + + RELABSD_S_PROG_ERROR("Reached what is supposed to be dead code."); + + return -1; } int relabsd_physical_device_is_late @@ -205,3 +209,11 @@ int relabsd_physical_device_is_late { return device->is_late; } + +int relabsd_physical_device_get_file_descriptor +( + const struct relabsd_physical_device device [const restrict static 1] +) +{ + return device->file; +} diff --git a/src/device/virtual/virtual_device.c b/src/device/virtual/virtual_device.c index 7617c8c..246a90b 100644 --- a/src/device/virtual/virtual_device.c +++ b/src/device/virtual/virtual_device.c @@ -24,7 +24,7 @@ /******************************************************************************/ static void replace_rel_axes ( - const struct relabsd_parameters parameters [const static 1], + struct relabsd_parameters parameters [const static 1], const struct relabsd_virtual_device device [const restrict static 1] ) { @@ -151,7 +151,7 @@ static int rename_device /******************************************************************************/ int relabsd_virtual_device_create_from ( - const struct relabsd_parameters parameters [const restrict static 1], + struct relabsd_parameters parameters [const restrict static 1], struct relabsd_virtual_device device [const restrict static 1] ) { @@ -316,7 +316,7 @@ int relabsd_virtual_device_write_evdev_event void relabsd_virtual_device_set_axes_to_zero ( - const struct relabsd_parameters parameters [const restrict static 1], + struct relabsd_parameters parameters [const restrict static 1], const struct relabsd_virtual_device device [const restrict static 1] ) { @@ -13,11 +13,13 @@ /******************************************************************************/ /**** EXPORTED FUNCTIONS ******************************************************/ /******************************************************************************/ -int main (int argc, char ** argv) +int main (int const argc, const char * const * const argv) { int retval; struct relabsd_parameters params; + retval = -1; + RELABSD_S_DEBUG(RELABSD_DEBUG_PROGRAM_FLOW, "relabsd started."); if (relabsd_parameters_parse_execution_mode(argc, argv, ¶ms) < 0) @@ -33,9 +35,14 @@ int main (int argc, char ** argv) retval = relabsd_client_main(argc, argv, ¶ms); break; - case RELABSD_PARAMETERS_RUN_SERVER_MODE: + case RELABSD_PARAMETERS_SERVER_MODE: retval = relabsd_server_main(argc, argv, ¶ms); break; + + case RELABSD_PARAMETERS_COMPATIBILITY_TEST_MODE: + /* TODO: implement this. */ + RELABSD_S_FATAL("Compatibility test mode not implemented."); + break; } RELABSD_S_DEBUG(RELABSD_DEBUG_PROGRAM_FLOW, "relabsd terminating."); diff --git a/src/server/communication_node.c b/src/server/communication_node.c index 70c7323..96f4af4 100644 --- a/src/server/communication_node.c +++ b/src/server/communication_node.c @@ -9,6 +9,7 @@ /**** RELABSD *****************************************************************/ #include <relabsd/debug.h> +#include <relabsd/server.h> /******************************************************************************/ /**** LOCAL FUNCTIONS *********************************************************/ @@ -79,7 +80,7 @@ static int bind_socket return 0; } - +/* static int set_socket_to_unblocking (const int socket) { int current_flags; @@ -114,7 +115,7 @@ static int set_socket_to_unblocking (const int socket) return 0; } - +*/ static int set_socket_as_listener (const int socket) { errno = 0; @@ -155,16 +156,6 @@ int relabsd_server_create_communication_node return -1; } - /* - if (set_socket_to_unblocking(*socket) < 0) - { - /* TODO: err message. *//* - (void) close(*socket); - - return -1; - } - */ - if (set_socket_as_listener(*socket) < 0) { /* TODO: err message. */ diff --git a/src/server/communication_thread.c b/src/server/communication_thread.c index 2da54d2..e226f17 100644 --- a/src/server/communication_thread.c +++ b/src/server/communication_thread.c @@ -4,20 +4,24 @@ /**** RELABSD *****************************************************************/ #include <relabsd/debug.h> +#include <relabsd/server.h> /******************************************************************************/ /**** LOCAL FUNCTIONS *********************************************************/ /******************************************************************************/ +/* TODO: implement. */ +/* void main_loop (struct relabsd_server server [const static 1]) { - } +*/ void * posix_main_loop (void * params) { - main_loop((struct relabsd_server *) params); + /* main_loop((struct relabsd_server *) params);*/ + params = NULL; - return NULL; + return params; } /******************************************************************************/ @@ -52,3 +56,26 @@ int relabsd_server_create_communication_thread return 0; } + +int relabsd_server_join_communication_thread +( + struct relabsd_server server [const static 1] +) +{ + int err; + + err = pthread_join(server->communication_thread, (void **) NULL); + + if (err != 0) + { + RELABSD_FATAL + ( + "Unable to join with the communication thread: %s", + strerror(err) + ); + + return -1; + } + + return 0; +} diff --git a/src/server/conversion_main_loop.c b/src/server/conversion_main_loop.c index b5b97db..c948954 100644 --- a/src/server/conversion_main_loop.c +++ b/src/server/conversion_main_loop.c @@ -1,192 +1,245 @@ -#include <fcntl.h> +/**** POSIX *******************************************************************/ +#include <sys/select.h> + #include <errno.h> #include <string.h> -#include <unistd.h> -#include <signal.h> - -#include "pervasive.h" -#include "error.h" -#include "config.h" -#include "input.h" -#include "relabsd_device.h" -static void handle_relative_axis_event -( - struct relabsd_config * const conf, - const struct relabsd_device * const dev, - unsigned int const input_type, - unsigned int const input_code, - int value -) -{ - unsigned int abs_code; - enum relabsd_axis rad_code; +/**** RELABSD *****************************************************************/ +#include <relabsd/debug.h> +#include <relabsd/server.h> - rad_code = relabsd_axis_convert_evdev_rel(input_code, &abs_code); +#include <relabsd/config/parameters.h> - switch (relabsd_config_filter(conf, rad_code, &value)) - { - case -1: - /* 'conf' doesn't want the event to be transmitted. */ - break; - - case 0: - /* 'conf' wants the event to be transmitted as is. */ - relabsd_device_write_evdev_event(dev, input_type, input_code, value); - break; - - case 1: - /* 'conf' allows the value to be emitted */ - relabsd_device_write_evdev_event(dev, EV_ABS, abs_code, value); - break; - } -} +#include <relabsd/device/axis.h> +#include <relabsd/device/physical_device.h> +#include <relabsd/device/virtual_device.h> +/******************************************************************************/ +/**** LOCAL FUNCTIONS *********************************************************/ +/******************************************************************************/ static void convert_input ( - struct relabsd_config * const conf, - struct relabsd_input * const input, - const struct relabsd_device * const dev + struct relabsd_server server [const restrict static 1] ) { unsigned int input_type, input_code; int value; - RELABSD_S_DEBUG(RELABSD_DEBUG_PROGRAM_FLOW, "Handling input events..."); - - input->timed_out = 1; + if + ( + relabsd_physical_device_read + ( + &(server->physical_device), + &input_type, + &input_code, + &value + ) + < 0 + ) + { + return; + } - while (RELABSD_RUN == 1) + if (input_type == EV_REL) { - if (conf->enable_timeout) - { - switch (relabsd_input_wait_for_next_event(input, conf)) - { - case 1: - input->timed_out = 0; - break; - - case 0: - relabsd_device_set_axes_to_zero(dev, conf); - input->timed_out = 1; - break; - - case -1: - continue; - } - } + unsigned int abs_code; + enum relabsd_axis_name axis_name; - if (relabsd_input_read(input, &input_type, &input_code, &value) < 0) - { - /* - * The next event should not be retransmitted, or some kind of error - * happened. - */ - /* TODO: error handling. */ - continue; - } + axis_name = + relabsd_axis_name_and_evdev_abs_from_evdev_rel(input_code, &abs_code); - if (input_type == EV_REL) + if (axis_name == RELABSD_UNKNOWN) { - /* We might have to convert the event. */ - handle_relative_axis_event(conf, dev, input_type, input_code, value); + return; } - else + + switch + ( + relabsd_axis_filter_new_value + ( + relabsd_parameters_get_axis(axis_name, &(server->parameters)), + &value + ) + ) { - /* Any other event is retransmitted as is. */ - relabsd_device_write_evdev_event(dev, input_type, input_code, value); + case -1: + /* Doesn't want the event to be transmitted. */ + return; + + case 1: + (void) relabsd_virtual_device_write_evdev_event + ( + &(server->virtual_device), + EV_ABS, + abs_code, + value + ); + return; + + case 0: + (void) relabsd_virtual_device_write_evdev_event + ( + &(server->virtual_device), + input_type, + input_code, + value + ); + return; } } + else + { + /* Any other event is retransmitted as is. */ + (void) relabsd_virtual_device_write_evdev_event + ( + &(server->virtual_device), + input_type, + input_code, + value + ); + } } -int relabsd_server_conversion_loop +static void reset_axes ( - struct relabsd_server server [const static 1] + struct relabsd_server server [const restrict static 1] ) { - return 0; + relabsd_virtual_device_set_axes_to_zero + ( + &(server->parameters), + &(server->virtual_device) + ); } - -int wait_for_next_event +static int wait_for_next_event ( - const struct relabsd_physical_device * const input, - const struct relabsd_config * const config + fd_set ready_to_read [const restrict static 1], + struct relabsd_server server [const static 1] ) { - int ready_fds; - const int old_errno = errno; - fd_set ready_to_read; - struct timeval curr_timeout; + int ready_fds, physical_device_fd, interruption_fd, highest_fd; - FD_ZERO(&ready_to_read); - FD_SET(input->fd, &ready_to_read); + FD_ZERO(ready_to_read); - /* call to select may alter timeout */ - memcpy - ( - (void *) &(curr_timeout), - (const void *) &(config->timeout), - sizeof(struct timeval) - ); + physical_device_fd = + relabsd_physical_device_get_file_descriptor(&(server->physical_device)); - errno = 0; + FD_SET(physical_device_fd, ready_to_read); - RELABSD_S_ERROR - ( - "Waiting for input to be ready..." - ); + if (relabsd_physical_device_is_late(&(server->physical_device))) + { + return 1; + } - ready_fds = select - ( - (input->fd + 1), - &ready_to_read, - (fd_set *) NULL, - (fd_set *) NULL, - (input->timed_out) ? NULL : &(curr_timeout) - ); + interruption_fd = relabsd_server_get_interruption_file_descriptor(); - if (errno != 0) - { - RELABSD_ERROR - ( - "Unable to wait for timeout: %s (errno: %d).", - strerror(errno), - errno - ); + FD_SET(interruption_fd, ready_to_read); - if (errno == EINTR) - { - /* Signal interruption? */ - } - else - { - /* TODO: error message */ - } + if (interruption_fd > physical_device_fd) + { + highest_fd = interruption_fd; + } + { + highest_fd = physical_device_fd; + } - errno = old_errno; + errno = 0; - return -1; + if (relabsd_parameters_use_timeout(&(server->parameters))) + { + struct timeval curr_timeout; + + /* TODO: mutex lock */ + /* call to select may alter timeout */ + curr_timeout = relabsd_parameters_get_timeout(&(server->parameters)); + /* TODO: mutex unlock */ + + ready_fds = + select + ( + (highest_fd + 1), + ready_to_read, + (fd_set *) NULL, + (fd_set *) NULL, + (struct timeval *) &curr_timeout + ); + } + else + { + ready_fds = + select + ( + (highest_fd + 1), + ready_to_read, + (fd_set *) NULL, + (fd_set *) NULL, + (struct timeval *) NULL + ); } if (ready_fds == -1) { - /* TODO: error message */ - - RELABSD_S_ERROR + RELABSD_ERROR ( - "Unable to wait for timeout, yet errno was not set to anything." + "Error while waiting for new input from the physical device: %s.", + strerror(errno) ); - errno = old_errno; + FD_ZERO(ready_to_read); - return -1; + return 1; } - RELABSD_ERROR - ( - "Input is ready, ready_fds = %d", ready_fds - ); - + /* ready_fds == 0 on timeout */ return ready_fds; } + +/******************************************************************************/ +/**** EXPORTED FUNCTIONS ******************************************************/ +/******************************************************************************/ +int relabsd_server_conversion_loop +( + struct relabsd_server server [const static 1] +) +{ + fd_set ready_to_read; + + for (;;) + { + switch (wait_for_next_event(&ready_to_read, server)) + { + case 1: + case 2: + if (!relabsd_server_keep_running()) + { + return 0; + } + + if + ( + FD_ISSET + ( + relabsd_physical_device_get_file_descriptor + ( + &(server->physical_device) + ), + &ready_to_read + ) + ) + { + /* TODO: mutex lock */ + convert_input(server); + /* TODO: mutex unlock */ + } + + break; + + case 0: + /* TODO: mutex lock */ + reset_axes(server); + /* TODO: mutex unlock */ + break; + } + } +} diff --git a/src/server/daemon.c b/src/server/daemon.c index c8561f3..9740b80 100644 --- a/src/server/daemon.c +++ b/src/server/daemon.c @@ -151,6 +151,8 @@ int relabsd_server_create_daemon (void) if (proc_id != ((pid_t) 0)) { + errno = 0; + if (close(unnamed_pipe[1]) == -1) { RELABSD_ERROR @@ -195,6 +197,8 @@ int relabsd_server_create_daemon (void) /* We need those. */ /* 14/ Signal completion ***************************************************/ + errno = 0; + if (write(unnamed_pipe[0], (void *) "!", (size_t) 1) == -1) { RELABSD_ERROR @@ -206,6 +210,7 @@ int relabsd_server_create_daemon (void) } /* Step 15 is done on the very first process. */ + errno = 0; if (close(unnamed_pipe[1]) == -1) { diff --git a/src/server/interruption.c b/src/server/interruption.c index 6eb7827..32cda53 100644 --- a/src/server/interruption.c +++ b/src/server/interruption.c @@ -1,23 +1,86 @@ +/**** POSIX *******************************************************************/ +#include <errno.h> +#include <signal.h> +#include <string.h> +#include <unistd.h> + +/**** RELABSD *****************************************************************/ +#include <relabsd/debug.h> + +/******************************************************************************/ +/**** LOCAL FUNCTIONS *********************************************************/ +/******************************************************************************/ +static int RELABSD_INTERRUPTION_PIPES[2]; static int RELABSD_RUN = 1; -static void interrupt (int unused_mandatory_parameter) +static void interrupt (int unused_mandatory_parameter __attribute__((unused))) { RELABSD_RUN = 0; - RELABSD_S_WARNING("Interrupted, will exit at the next input device event."); + errno = 0; + + if (write(RELABSD_INTERRUPTION_PIPES[0], (void *) "!", (size_t) 1) == -1) + { + RELABSD_ERROR + ( + "Unable to signal the interruption to the conversion thread." + " Interruption should still occur following the next input from the" + " physical device. Error: %s.", + strerror(errno) + ); + } +} + +/******************************************************************************/ +/**** EXPORTED FUNCTIONS ******************************************************/ +/******************************************************************************/ +int relabsd_server_keep_running (void) +{ + return RELABSD_RUN; +} + +void relabsd_server_interrupt (void) +{ + interrupt(0); } -static int set_signal_handlers () +int relabsd_server_initialize_signal_handlers (void) { RELABSD_S_DEBUG(RELABSD_DEBUG_PROGRAM_FLOW, "Setting signal handlers."); + errno = 0; + + if (pipe(RELABSD_INTERRUPTION_PIPES) == -1) + { + RELABSD_FATAL + ( + "Unable to create an unnamed pipe for the interruption handling: %s", + strerror(errno) + ); + + return -1; + } + if (signal(SIGINT, interrupt) == SIG_ERR) { RELABSD_S_FATAL("Unable to set the SIGINT signal handler."); + (void) close(RELABSD_INTERRUPTION_PIPES[0]); + (void) close(RELABSD_INTERRUPTION_PIPES[1]); + return -1; } return 0; } +void relabsd_server_finalize_signal_handlers (void) +{ + (void) close(RELABSD_INTERRUPTION_PIPES[0]); + (void) close(RELABSD_INTERRUPTION_PIPES[1]); +} + +int relabsd_server_get_interruption_file_descriptor (void) +{ + return RELABSD_INTERRUPTION_PIPES[1]; +} diff --git a/src/server/server.c b/src/server/server.c index d6678d2..2988732 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -5,22 +5,25 @@ #include <relabsd/config/parameters.h> +#include <relabsd/device/physical_device.h> +#include <relabsd/device/virtual_device.h> + /******************************************************************************/ /**** LOCAL FUNCTIONS *********************************************************/ /******************************************************************************/ static int initialize ( - struct relabsd_server server [const restrict static 1], - struct relabsd_parameters parameters [const static 1] + struct relabsd_server server [const restrict static 1] ) { - server->parameters = parameters; - if ( relabsd_physical_device_open ( - relabsd_parameters_get_physical_device_name(parameters), + relabsd_parameters_get_physical_device_file_name + ( + &(server->parameters) + ), &(server->physical_device) ) < 0 @@ -29,7 +32,15 @@ static int initialize return -1; } - if (relabsd_virtual_device_create(parameters, &(server->virtual_device)) < 0) + if + ( + relabsd_virtual_device_create_from + ( + &(server->parameters), + &(server->virtual_device) + ) + < 0 + ) { relabsd_physical_device_close(&(server->physical_device)); @@ -39,10 +50,10 @@ static int initialize if ( ( - relabsd_parameters_get_communication_node_name(parameters) + relabsd_parameters_get_communication_node_name(&(server->parameters)) != ((char *) NULL) ) - && (relabsd_server_create_communication_thread(&server) < 0) + && (relabsd_server_create_communication_thread(server) < 0) ) { relabsd_virtual_device_destroy(&(server->virtual_device)); @@ -58,11 +69,11 @@ static void finalize (struct relabsd_server server [const static 1]) { if ( - relabsd_parameters_get_communication_node_name(server->parameters) + relabsd_parameters_get_communication_node_name(&(server->parameters)) != ((char *) NULL) ) { - relabsd_server_join_communication_thread(&server); + relabsd_server_join_communication_thread(server); } relabsd_virtual_device_destroy(&(server->virtual_device)); @@ -72,32 +83,34 @@ static void finalize (struct relabsd_server server [const static 1]) /******************************************************************************/ /**** EXPORTED FUNCTIONS ******************************************************/ /******************************************************************************/ -int relabsd_server +int relabsd_server_main ( const int argc, - const char * const argv [const restrict static argc], - struct relabsd_parameters parameters [const static 1] + const char * const argv [const static argc], + struct relabsd_parameters parameters [const restrict static 1] ) { struct relabsd_server server; + server.parameters = *parameters; + RELABSD_S_DEBUG(RELABSD_DEBUG_PROGRAM_FLOW, "Started server mode."); - if (relabsd_parameters_parse_options(argc, argv, parameters) < 0) + if (relabsd_parameters_parse_options(argc, argv, &(server.parameters)) < 0) { return -1; } if ( - relabsd_parameters_get_run_as_daemon(parameters) + relabsd_parameters_get_run_as_daemon(&(server.parameters)) && (relabsd_server_create_daemon() < 0) ) { return -2; } - (void) initialize(&server, parameters); + (void) initialize(&server); (void) relabsd_server_conversion_loop(&server); diff --git a/src/util/string.c b/src/util/string.c index 7e754bd..ff4e8d3 100644 --- a/src/util/string.c +++ b/src/util/string.c @@ -1,5 +1,6 @@ /**** POSIX *******************************************************************/ #include <stdlib.h> +#include <stdio.h> /******************************************************************************/ /**** LOCAL FUNCTIONS *********************************************************/ |


