From ee48214209e66aa8c6f353262b175895373f76df Mon Sep 17 00:00:00 2001 From: Nathanael Sensfelder Date: Sat, 4 Jan 2020 21:31:55 +0100 Subject: ... --- CMakeLists.txt | 8 +- include/relabsd/client.h | 12 + include/relabsd/config/parameters.h | 16 ++ include/relabsd/config/parameters_types.h | 5 +- include/relabsd/device/axis.h | 6 + include/relabsd/device/physical_device.h | 6 +- include/relabsd/device/virtual_device.h | 4 +- include/relabsd/server.h | 39 ++++ include/relabsd/server_types.h | 18 ++ src/client.c | 9 +- src/config/parameters/parameters.c | 16 +- src/config/parameters/parameters_accessors.c | 48 +++- src/config/parameters/parse_config_file.c | 68 ++++-- src/device/physical/physical_device.c | 12 + src/device/virtual/virtual_device.c | 6 +- src/main.c | 11 +- src/server/communication_node.c | 15 +- src/server/communication_thread.c | 33 ++- src/server/conversion_main_loop.c | 331 ++++++++++++++++----------- src/server/daemon.c | 5 + src/server/interruption.c | 69 +++++- src/server/server.c | 45 ++-- 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 + +#include + +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 + #include 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 + +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 + +/**** RELABSD *****************************************************************/ +#include + +#include +#include + +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\"