diff options
author | Christian Linke <Christian.Linke@bmw.de> | 2016-02-11 07:28:47 +0100 |
---|---|---|
committer | Christian Linke <Christian.Linke@bmw.de> | 2016-02-15 09:00:59 +0100 |
commit | 5bcd206b9270d9a79e212f91723ea1a08a4d4859 (patch) | |
tree | 55b0cd4d07fbd7ebfd15d58d02e9cae6ae61b127 /AudioManagerUtilities | |
parent | 59080ecc2c8840fd85c561adea3f85f5344534a8 (diff) | |
download | audiomanager-5bcd206b9270d9a79e212f91723ea1a08a4d4859.tar.gz |
* rework of the build structure, adopt to standard cmake package structure7.4
* check versions when loading the libs
* introduction of the AudioManagerCore
* give control plugin as file or directory
* remove SQLITE
* either find and use gmock or build and install it
* fixed [Bug 411]
* compile flag gnu11 is now used
Signed-off-by: Christian Linke <Christian.Linke@bmw.de>
Signed-off-by: Christian Linke <Christian.Linke@bmw.de>
Diffstat (limited to 'AudioManagerUtilities')
-rw-r--r-- | AudioManagerUtilities/CMakeLists.txt | 151 | ||||
-rw-r--r-- | AudioManagerUtilities/include/CAmCommonAPIWrapper.h | 4 | ||||
-rw-r--r-- | AudioManagerUtilities/include/CAmDltWrapper.h | 10 | ||||
-rw-r--r-- | AudioManagerUtilities/include/CAmSocketHandler.h | 43 | ||||
-rw-r--r-- | AudioManagerUtilities/include/sd-daemon.h | 286 | ||||
-rw-r--r-- | AudioManagerUtilities/src/CAmDltWrapper.cpp | 108 | ||||
-rw-r--r-- | AudioManagerUtilities/src/CAmSocketHandler.cpp | 3 | ||||
-rwxr-xr-x | AudioManagerUtilities/src/CAmWatchdog.cpp | 9 | ||||
-rw-r--r-- | AudioManagerUtilities/src/sd-daemon.c | 534 | ||||
-rw-r--r-- | AudioManagerUtilities/test/AmSocketHandlerTest/CAmSocketHandlerTest.cpp | 357 | ||||
-rw-r--r-- | AudioManagerUtilities/test/AmSocketHandlerTest/CAmSocketHandlerTest.h | 87 | ||||
-rw-r--r-- | AudioManagerUtilities/test/AmSocketHandlerTest/CMakeLists.txt | 50 | ||||
-rw-r--r-- | AudioManagerUtilities/test/CMakeLists.txt | 4 |
13 files changed, 689 insertions, 957 deletions
diff --git a/AudioManagerUtilities/CMakeLists.txt b/AudioManagerUtilities/CMakeLists.txt index 69555fa..f859026 100644 --- a/AudioManagerUtilities/CMakeLists.txt +++ b/AudioManagerUtilities/CMakeLists.txt @@ -15,25 +15,22 @@ # For further information see http://www.genivi.org/. # -CMAKE_MINIMUM_REQUIRED(VERSION 2.8.8) +CMAKE_MINIMUM_REQUIRED(VERSION 3.0) -PROJECT(AudioManagerUtilities) - -set(AudioManagerUtilities_VERSION_MAJOR 1) -set(AudioManagerUtilities_VERSION_MINOR 0) -set(AudioManagerUtilities_VERSION_PATCH 0) -set(AudioManagerUtilities_VERSION_STRING ${AudioManagerUtilities_VERSION_MAJOR}.${AudioManagerUtilities_VERSION_MINOR}.${AudioManagerUtilities_VERSION_PATCH}) +PROJECT(AudioManagerUtilities LANGUAGES CXX VERSION ${DAEMONVERSION}) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") -SET(INCLUDE_FOLDER "include") -INCLUDE_DIRECTORIES( - ${INCLUDE_FOLDER} +SET(AUDIOMANAGER_UTILITIES_INCLUDE + ${AUDIOMANAGER_UTILITIES}/include ${AUDIO_INCLUDE_FOLDER} - ${AUDIOMANAGER_INCLUDE_FOLDER} - ${DBUS_INCLUDE_DIRS} ${TCLAP_INCLUDE_DIR} -) + ${AUDIOMANAGER_INCLUDE_FOLDER} + CACHE INTERNAL "AUDIOMANAGER_INCLUDE directories" FORCE) + +SET(AUDIO_MANAGER_UTILITIES_LIBS + ${CMAKE_DL_LIBS} + CACHE INTERNAL "AUDIO_MANAGER_UTILITIES_LIBS libs" FORCE) IF (WITH_SHARED_UTILITIES) SET(LIBRARY_TYPE SHARED) @@ -47,79 +44,117 @@ SET(AUDIO_MANAGER_UTILITIES_SRCS_CXX src/CAmSocketHandler.cpp) if(WITH_SYSTEMD_WATCHDOG) - - pkg_check_modules(SYSTEMD libsystemd>=44) - if (SYSTEMD_FOUND) - message(STATUS "Found libsystemd-daemon, version: ${SYSTEMD_VERSION}") - else (SYSTEMD_FOUND) - message(STATUS "Did not find libsystemd-daemon, using own lib") - endif(SYSTEMD_FOUND) - + pkg_check_modules(SYSTEMD REQUIRED "libsystemd >= 44") + + message(STATUS "Found libsystemd-daemon, version: ${SYSTEMD_VERSION}") + set (AUDIO_MANAGER_UTILITIES_LIBS + ${AUDIO_MANAGER_UTILITIES_LIBS} + ${SYSTEMD_LIBRARIES} + CACHE INTERNAL "AUDIO_MANAGER_UTILITIES_LIBS libs" FORCE) + set(AUDIOMANAGER_UTILITIES_INCLUDE + ${AUDIOMANAGER_UTILITIES_INCLUDE} + ${SYSTEMD_INCLUDEDIR}) set (AUDIO_MANAGER_UTILITIES_SRCS_CXX ${AUDIO_MANAGER_UTILITIES_SRCS_CXX} src/CAmWatchdog.cpp) - set (AM_LINK_LIBS - ${AM_LINK_LIBS} - ${SYSTEMD_LIBRARIES}) -endif(WITH_SYSTEMD_WATCHDOG) - - -if (NOT SYSTEMD_FOUND) - set (AUDIO_MANAGER_UTILITIES_SRCS_CXX - ${AUDIO_MANAGER_UTILITIES_SRCS_CXX} - src/sd-daemon.c) -endif (NOT SYSTEMD_FOUND) - - -IF (WITH_DBUS_WRAPPER) - pkg_check_modules (DBUS "dbus-1 >= 1.4") -ENDIF (WITH_DBUS_WRAPPER) -IF (WITH_CAPI_WRAPPER) - FIND_PACKAGE(CommonAPI REQUIRED) -ENDIF (WITH_CAPI_WRAPPER) +endif(WITH_SYSTEMD_WATCHDOG) IF (WITH_DBUS_WRAPPER) - SET (AM_LINK_LIBS - ${AM_LINK_LIBS} - ${DBUS_LIBRARIES}) - SET(AUDIO_MANAGER_UTILITIES_SRCS_CXX + pkg_check_modules (DBUS REQUIRED "dbus-1 >= 1.4") + + set(AUDIOMANAGER_UTILITIES_INCLUDE + ${AUDIOMANAGER_UTILITIES_INCLUDE} + ${DBUS_INCLUDE_DIRS} + CACHE INTERNAL "AUDIOMANAGER_INCLUDE directories" FORCE) + + set (AUDIO_MANAGER_UTILITIES_LIBS + ${AUDIO_MANAGER_UTILITIES_LIBS} + ${DBUS_LIBRARIES} + CACHE INTERNAL "AUDIO_MANAGER_UTILITIES_LIBS libs" FORCE) + + set(AUDIO_MANAGER_UTILITIES_SRCS_CXX ${AUDIO_MANAGER_UTILITIES_SRCS_CXX} src/CAmDbusWrapper.cpp) ENDIF (WITH_DBUS_WRAPPER) IF (WITH_CAPI_WRAPPER) - SET(AM_LINK_LIBS - ${AM_LINK_LIBS} - ${DBUS_LIBRARIES} - ${COMMON_API_LIBRARIES} - ${COMMON_API_DBUS_LIBRARIES}) - SET(AUDIO_MANAGER_UTILITIES_SRCS_CXX + pkg_check_modules(COMMONAPI REQUIRED "CommonAPI >= 3.1.5") + + set(AUDIO_MANAGER_UTILITIES_LIBS + ${AUDIO_MANAGER_UTILITIES_LIBS} + ${COMMONAPI_LIBRARIES} + ${COMMONAPI_DBUS_LIBRARIES} + CACHE INTERNAL "AUDIO_MANAGER_UTILITIES_LIBS libs" FORCE) + + set(AUDIO_MANAGER_UTILITIES_SRCS_CXX ${AUDIO_MANAGER_UTILITIES_SRCS_CXX} src/CAmCommonAPIWrapper.cpp) - INCLUDE_DIRECTORIES(${INCLUDE_DIRECTORIES} - ${COMMONAPI_INCLUDE_DIRS}) + + set(AUDIOMANAGER_UTILITIES_INCLUDE + ${AUDIOMANAGER_UTILITIES_INCLUDE} + ${COMMONAPI_INCLUDE_DIRS} + CACHE INTERNAL "AUDIOMANAGER_INCLUDE directories" FORCE) ENDIF (WITH_CAPI_WRAPPER) +if(WITH_DLT) + pkg_check_modules(DLT REQUIRED "automotive-dlt >= 2.2.0") + + add_definitions(${DLT_CFLAGS_OTHER}) + + set(AUDIO_MANAGER_UTILITIES_LIBS + ${AUDIO_MANAGER_UTILITIES_LIBS} + ${DLT_LIBRARIES} + CACHE INTERNAL "AUDIO_MANAGER_UTILITIES_LIBS libs" FORCE) + + SET(AUDIOMANAGER_UTILITIES_INCLUDE + ${AUDIOMANAGER_UTILITIES_INCLUDE} + ${DLT_LIBRARY_DIRS} + CACHE INTERNAL "AUDIOMANAGER_INCLUDE directories" FORCE) +endif(WITH_DLT) + + +INCLUDE_DIRECTORIES(${AUDIOMANAGER_UTILITIES_INCLUDE}) + ADD_LIBRARY(AudioManagerUtilities ${LIBRARY_TYPE} ${AUDIO_MANAGER_UTILITIES_SRCS_CXX}) -TARGET_LINK_LIBRARIES(AudioManagerUtilities ${AM_LINK_LIBS}) +TARGET_LINK_LIBRARIES(AudioManagerUtilities ${AUDIO_MANAGER_UTILITIES_LIBS}) -set_target_properties(AudioManagerUtilities PROPERTIES VERSION ${AudioManagerUtilities_VERSION_STRING} SOVERSION ${AudioManagerUtilities_VERSION_MAJOR}) +set_target_properties(AudioManagerUtilities PROPERTIES VERSION ${AudioManagerUtilities_VERSION} SOVERSION ${AudioManagerUtilities_VERSION_MAJOR}) IF (WITH_SHARED_UTILITIES) INSTALL(TARGETS AudioManagerUtilities LIBRARY DESTINATION lib PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ COMPONENT bin) - configure_file( ${CMAKE_SOURCE_DIR}/cmake/audiomanagerutilities.pc.in ${CMAKE_BINARY_DIR}/audiomanagerutilities.pc @ONLY ) - install(FILES ${CMAKE_BINARY_DIR}/audiomanagerutilities.pc DESTINATION lib/pkgconfig COMPONENT devel) ELSE (WITH_SHARED_UTILITIES) INSTALL(TARGETS AudioManagerUtilities ARCHIVE DESTINATION lib COMPONENT dev) ENDIF (WITH_SHARED_UTILITIES) -INSTALL(DIRECTORY "${AUDIOMANAGER_UTILITIES_INCLUDE}/" - DESTINATION ${CMAKE_INSTALL_PREFIX}/include/${LIB_INSTALL_SUFFIX} +configure_file( ${CMAKE_SOURCE_DIR}/cmake/audiomanagerutilities.pc.in ${CMAKE_BINARY_DIR}/audiomanagerutilities.pc @ONLY ) +install(FILES ${CMAKE_BINARY_DIR}/audiomanagerutilities.pc DESTINATION lib/pkgconfig COMPONENT devel) + +configure_package_config_file ( + ${CMAKE_SOURCE_DIR}/cmake/AudioManagerUtilitiesConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/AudioManagerUtilitiesConfig.cmake + INSTALL_DESTINATION lib/${LIB_INSTALL_SUFFIX}/cmake + PATH_VARS AUDIO_INCLUDE_FOLDER ) + +write_basic_package_version_file( + ${CMAKE_CURRENT_BINARY_DIR}/AudioManagerUtilitiesConfigVersion.cmake + VERSION ${DAEMONVERSION} + COMPATIBILITY SameMajorVersion ) + +install( +FILES ${CMAKE_CURRENT_BINARY_DIR}/AudioManagerUtilitiesConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/AudioManagerUtilitiesConfigVersion.cmake +DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/cmake/AudioManagerUtilities-${DAEMONVERSION}) + +INSTALL(DIRECTORY "include/" + DESTINATION ${CMAKE_INSTALL_PREFIX}/include/${LIB_INSTALL_SUFFIX}/AudioManagerUtilities COMPONENT dev) + +if(WITH_TESTS) + add_subdirectory (test) +endif(WITH_TESTS) diff --git a/AudioManagerUtilities/include/CAmCommonAPIWrapper.h b/AudioManagerUtilities/include/CAmCommonAPIWrapper.h index f9a6b01..82328d6 100644 --- a/AudioManagerUtilities/include/CAmCommonAPIWrapper.h +++ b/AudioManagerUtilities/include/CAmCommonAPIWrapper.h @@ -35,10 +35,6 @@ #include "audiomanagerconfig.h" #include "CAmSocketHandler.h" -#if COMMONAPI_VERSION_NUMBER < 300 -#error "CommonAPI versions < 300 are not supported." -#endif - /** * A Common-API wrapper class, which loads the common-api runtime and instantiates all necessary objects. * It is implemented as singleton and usually instantiated at the beginning with CAmSocketHandler as parameter. diff --git a/AudioManagerUtilities/include/CAmDltWrapper.h b/AudioManagerUtilities/include/CAmDltWrapper.h index 7e4d2d4..d227929 100644 --- a/AudioManagerUtilities/include/CAmDltWrapper.h +++ b/AudioManagerUtilities/include/CAmDltWrapper.h @@ -131,7 +131,10 @@ public: template<typename T = const char*> void append(const char* value) { #ifdef WITH_DLT - dlt_user_log_write_string(&mDltContextData, value); + if(mEnableNoDLTDebug) + { + dlt_user_log_write_string(&mDltContextData, value); + } #else mDltContextData.buffer << value; #endif @@ -153,7 +156,8 @@ public: "E_ABORTED", "E_WRONG_FORMAT" }; - append(str_error[value]); + if(mEnableNoDLTDebug) + append(str_error[value]); } // Template to print unknown pointer types with their address @@ -188,10 +192,10 @@ private: CAmDltWrapper(const bool enableNoDLTDebug); //is private because of singleton pattern #ifndef WITH_DLT template<class T> void appendNoDLT(T value); - bool mEnableNoDLTDebug; #endif DltContext mDltContext; //!< the default context DltContextData mDltContextData; //!< contextdata + bool mEnableNoDLTDebug; static CAmDltWrapper* mpDLTWrapper; //!< pointer to the wrapper instance static pthread_mutex_t mMutex; diff --git a/AudioManagerUtilities/include/CAmSocketHandler.h b/AudioManagerUtilities/include/CAmSocketHandler.h index 5e11fa5..1a988c5 100644 --- a/AudioManagerUtilities/include/CAmSocketHandler.h +++ b/AudioManagerUtilities/include/CAmSocketHandler.h @@ -441,16 +441,7 @@ private: bool mRecreatePollfds; //!<when this is true, the poll list needs to be recreated timespec mStartTime; //!<here the actual time is saved for timecorrection -// void debugPrintTimerList () -// { -// std::list<sh_timer_s>::iterator it(mListActiveTimer.begin()); -// for(;it!=mListActiveTimer.end();++it) -// { -// std::cout<< "Handle " << it->handle << "sec " << it->countdown.tv_sec << "nsec " << it->countdown.tv_nsec<<std::endl; -// } -// } -} -; +}; /** * template to create the functor for a class @@ -465,9 +456,7 @@ public: TAmShTimerCallBack(TClass* instance, void (TClass::*function)(sh_timerHandle_t handle, void* userData)) : mInstance(instance), // mFunction(function) - { - } - ; + {}; virtual void Call(sh_timerHandle_t handle, void* userData) { @@ -488,15 +477,12 @@ public: TAmShPollPrepare(TClass* instance, void (TClass::*function)(const sh_timerHandle_t handle, void* userData)) : mInstance(instance), // mFunction(function) - { - } - ; + {}; virtual void Call(const sh_timerHandle_t handle, void* userData) { (*mInstance.*mFunction)(handle, userData); - } - ; + }; }; /**make private, not public @@ -512,15 +498,12 @@ public: TAmShPollFired(TClass* instance, void (TClass::*function)(const pollfd pollfd, const sh_pollHandle_t handle, void* userData)) : mInstance(instance), // mFunction(function) - { - } - ; + {}; virtual void Call(const pollfd pollfd, const sh_pollHandle_t handle, void* userData) { (*mInstance.*mFunction)(pollfd, handle, userData); - } - ; + }; }; /** @@ -536,15 +519,12 @@ public: TAmShPollCheck(TClass* instance, bool (TClass::*function)(const sh_pollHandle_t handle, void* userData)) : mInstance(instance), // mFunction(function) - { - } - ; + {}; virtual bool Call(const sh_pollHandle_t handle, void* userData) { return ((*mInstance.*mFunction)(handle, userData)); - } - ; + }; }; /** @@ -560,15 +540,12 @@ public: TAmShPollDispatch(TClass* instance, bool (TClass::*function)(const sh_pollHandle_t handle, void* userData)) : mInstance(instance), // mFunction(function) - { - } - ; + {}; virtual bool Call(const sh_pollHandle_t handle, void* userData) { return ((*mInstance.*mFunction)(handle, userData)); - } - ; + }; }; } /* namespace am */ #endif /* SOCKETHANDLER_H_ */ diff --git a/AudioManagerUtilities/include/sd-daemon.h b/AudioManagerUtilities/include/sd-daemon.h deleted file mode 100644 index 50f7409..0000000 --- a/AudioManagerUtilities/include/sd-daemon.h +++ /dev/null @@ -1,286 +0,0 @@ -/** - * SPDX license identifier: MIT - */ - -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - -#ifndef foosddaemonhfoo -#define foosddaemonhfoo - -/*** - Copyright 2010 Lennart Poettering - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation files - (the "Software"), to deal in the Software without restriction, - including without limitation the rights to use, copy, modify, merge, - publish, distribute, sublicense, and/or sell copies of the Software, - and to permit persons to whom the Software is furnished to do so, - subject to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. -***/ - -#include <sys/types.h> -#include <inttypes.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/* - Reference implementation of a few systemd related interfaces for - writing daemons. These interfaces are trivial to implement. To - simplify porting we provide this reference implementation. - Applications are welcome to reimplement the algorithms described - here if they do not want to include these two source files. - - The following functionality is provided: - - - Support for logging with log levels on stderr - - File descriptor passing for socket-based activation - - Daemon startup and status notification - - Detection of systemd boots - - You may compile this with -DDISABLE_SYSTEMD to disable systemd - support. This makes all those calls NOPs that are directly related to - systemd (i.e. only sd_is_xxx() will stay useful). - - Since this is drop-in code we don't want any of our symbols to be - exported in any case. Hence we declare hidden visibility for all of - them. - - You may find an up-to-date version of these source files online: - - http://cgit.freedesktop.org/systemd/systemd/plain/src/systemd/sd-daemon.h - http://cgit.freedesktop.org/systemd/systemd/plain/src/sd-daemon.c - - This should compile on non-Linux systems, too, but with the - exception of the sd_is_xxx() calls all functions will become NOPs. - - See sd-daemon(7) for more information. -*/ - -#ifndef _sd_printf_attr_ -#if __GNUC__ >= 4 -#define _sd_printf_attr_(a,b) __attribute__ ((format (printf, a, b))) -#else -#define _sd_printf_attr_(a,b) -#endif -#endif - -/* - Log levels for usage on stderr: - - fprintf(stderr, SD_NOTICE "Hello World!\n"); - - This is similar to printk() usage in the kernel. -*/ -#define SD_EMERG "<0>" /* system is unusable */ -#define SD_ALERT "<1>" /* action must be taken immediately */ -#define SD_CRIT "<2>" /* critical conditions */ -#define SD_ERR "<3>" /* error conditions */ -#define SD_WARNING "<4>" /* warning conditions */ -#define SD_NOTICE "<5>" /* normal but significant condition */ -#define SD_INFO "<6>" /* informational */ -#define SD_DEBUG "<7>" /* debug-level messages */ - -/* The first passed file descriptor is fd 3 */ -#define SD_LISTEN_FDS_START 3 - -/* - Returns how many file descriptors have been passed, or a negative - errno code on failure. Optionally, removes the $LISTEN_FDS and - $LISTEN_PID file descriptors from the environment (recommended, but - problematic in threaded environments). If r is the return value of - this function you'll find the file descriptors passed as fds - SD_LISTEN_FDS_START to SD_LISTEN_FDS_START+r-1. Returns a negative - errno style error code on failure. This function call ensures that - the FD_CLOEXEC flag is set for the passed file descriptors, to make - sure they are not passed on to child processes. If FD_CLOEXEC shall - not be set, the caller needs to unset it after this call for all file - descriptors that are used. - - See sd_listen_fds(3) for more information. -*/ -int sd_listen_fds(int unset_environment); - -/* - Helper call for identifying a passed file descriptor. Returns 1 if - the file descriptor is a FIFO in the file system stored under the - specified path, 0 otherwise. If path is NULL a path name check will - not be done and the call only verifies if the file descriptor - refers to a FIFO. Returns a negative errno style error code on - failure. - - See sd_is_fifo(3) for more information. -*/ -int sd_is_fifo(int fd, const char *path); - -/* - Helper call for identifying a passed file descriptor. Returns 1 if - the file descriptor is a special character device on the file - system stored under the specified path, 0 otherwise. - If path is NULL a path name check will not be done and the call - only verifies if the file descriptor refers to a special character. - Returns a negative errno style error code on failure. - - See sd_is_special(3) for more information. -*/ -int sd_is_special(int fd, const char *path); - -/* - Helper call for identifying a passed file descriptor. Returns 1 if - the file descriptor is a socket of the specified family (AF_INET, - ...) and type (SOCK_DGRAM, SOCK_STREAM, ...), 0 otherwise. If - family is 0 a socket family check will not be done. If type is 0 a - socket type check will not be done and the call only verifies if - the file descriptor refers to a socket. If listening is > 0 it is - verified that the socket is in listening mode. (i.e. listen() has - been called) If listening is == 0 it is verified that the socket is - not in listening mode. If listening is < 0 no listening mode check - is done. Returns a negative errno style error code on failure. - - See sd_is_socket(3) for more information. -*/ -int sd_is_socket(int fd, int family, int type, int listening); - -/* - Helper call for identifying a passed file descriptor. Returns 1 if - the file descriptor is an Internet socket, of the specified family - (either AF_INET or AF_INET6) and the specified type (SOCK_DGRAM, - SOCK_STREAM, ...), 0 otherwise. If version is 0 a protocol version - check is not done. If type is 0 a socket type check will not be - done. If port is 0 a socket port check will not be done. The - listening flag is used the same way as in sd_is_socket(). Returns a - negative errno style error code on failure. - - See sd_is_socket_inet(3) for more information. -*/ -int sd_is_socket_inet(int fd, int family, int type, int listening, uint16_t port); - -/* - Helper call for identifying a passed file descriptor. Returns 1 if - the file descriptor is an AF_UNIX socket of the specified type - (SOCK_DGRAM, SOCK_STREAM, ...) and path, 0 otherwise. If type is 0 - a socket type check will not be done. If path is NULL a socket path - check will not be done. For normal AF_UNIX sockets set length to - 0. For abstract namespace sockets set length to the length of the - socket name (including the initial 0 byte), and pass the full - socket path in path (including the initial 0 byte). The listening - flag is used the same way as in sd_is_socket(). Returns a negative - errno style error code on failure. - - See sd_is_socket_unix(3) for more information. -*/ -int sd_is_socket_unix(int fd, int type, int listening, const char *path, size_t length); - -/* - Helper call for identifying a passed file descriptor. Returns 1 if - the file descriptor is a POSIX Message Queue of the specified name, - 0 otherwise. If path is NULL a message queue name check is not - done. Returns a negative errno style error code on failure. -*/ -int sd_is_mq(int fd, const char *path); - -/* - Informs systemd about changed daemon state. This takes a number of - newline separated environment-style variable assignments in a - string. The following variables are known: - - READY=1 Tells systemd that daemon startup is finished (only - relevant for services of Type=notify). The passed - argument is a boolean "1" or "0". Since there is - little value in signaling non-readiness the only - value daemons should send is "READY=1". - - STATUS=... Passes a single-line status string back to systemd - that describes the daemon state. This is free-from - and can be used for various purposes: general state - feedback, fsck-like programs could pass completion - percentages and failing programs could pass a human - readable error message. Example: "STATUS=Completed - 66% of file system check..." - - ERRNO=... If a daemon fails, the errno-style error code, - formatted as string. Example: "ERRNO=2" for ENOENT. - - BUSERROR=... If a daemon fails, the D-Bus error-style error - code. Example: "BUSERROR=org.freedesktop.DBus.Error.TimedOut" - - MAINPID=... The main pid of a daemon, in case systemd did not - fork off the process itself. Example: "MAINPID=4711" - - WATCHDOG=1 Tells systemd to update the watchdog timestamp. - Services using this feature should do this in - regular intervals. A watchdog framework can use the - timestamps to detect failed services. - - Daemons can choose to send additional variables. However, it is - recommended to prefix variable names not listed above with X_. - - Returns a negative errno-style error code on failure. Returns > 0 - if systemd could be notified, 0 if it couldn't possibly because - systemd is not running. - - Example: When a daemon finished starting up, it could issue this - call to notify systemd about it: - - sd_notify(0, "READY=1"); - - See sd_notifyf() for more complete examples. - - See sd_notify(3) for more information. -*/ -int sd_notify(int unset_environment, const char *state); - -/* - Similar to sd_notify() but takes a format string. - - Example 1: A daemon could send the following after initialization: - - sd_notifyf(0, "READY=1\n" - "STATUS=Processing requests...\n" - "MAINPID=%lu", - (unsigned long) getpid()); - - Example 2: A daemon could send the following shortly before - exiting, on failure: - - sd_notifyf(0, "STATUS=Failed to start up: %s\n" - "ERRNO=%i", - strerror(errno), - errno); - - See sd_notifyf(3) for more information. -*/ -int sd_notifyf(int unset_environment, const char *format, ...) _sd_printf_attr_(2,3); - -/* - Returns > 0 if the system was booted with systemd. Returns < 0 on - error. Returns 0 if the system was not booted with systemd. Note - that all of the functions above handle non-systemd boots just - fine. You should NOT protect them with a call to this function. Also - note that this function checks whether the system, not the user - session is controlled by systemd. However the functions above work - for both user and system services. - - See sd_booted(3) for more information. -*/ -int sd_booted(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/AudioManagerUtilities/src/CAmDltWrapper.cpp b/AudioManagerUtilities/src/CAmDltWrapper.cpp index 33baa46..3b10ef4 100644 --- a/AudioManagerUtilities/src/CAmDltWrapper.cpp +++ b/AudioManagerUtilities/src/CAmDltWrapper.cpp @@ -48,7 +48,10 @@ CAmDltWrapper *CAmDltWrapper::instance(const bool enableNoDLTDebug) void CAmDltWrapper::unregisterContext(DltContext & handle) { #ifdef WITH_DLT - dlt_unregister_context(&handle); + if (mEnableNoDLTDebug) + { + dlt_unregister_context(&handle); + } #else (void) handle; #endif @@ -57,16 +60,17 @@ void CAmDltWrapper::unregisterContext(DltContext & handle) void CAmDltWrapper::deinit() { #ifdef WITH_DLT - unregisterContext(mDltContext); + if (mEnableNoDLTDebug) + { + unregisterContext(mDltContext); + } #endif } -CAmDltWrapper::CAmDltWrapper(const bool enableNoDLTDebug) : -#ifndef WITH_DLT - mEnableNoDLTDebug(enableNoDLTDebug), -#endif +CAmDltWrapper::CAmDltWrapper(const bool enableNoDLTDebug=true) : mDltContext(), // - mDltContextData() + mDltContextData(), // + mEnableNoDLTDebug(enableNoDLTDebug) { (void) enableNoDLTDebug; #ifndef WITH_DLT @@ -77,9 +81,12 @@ CAmDltWrapper::CAmDltWrapper(const bool enableNoDLTDebug) : void CAmDltWrapper::registerApp(const char *appid, const char *description) { #ifdef WITH_DLT - dlt_register_app(appid, description); - //register a default context - dlt_register_context(&mDltContext, "def", "default Context registered by DLTWrapper CLass"); + if (mEnableNoDLTDebug) + { + dlt_register_app(appid, description); + //register a default context + dlt_register_context(&mDltContext, "def", "default Context registered by DLTWrapper CLass"); + } #else (void) appid; (void) description; @@ -89,7 +96,10 @@ void CAmDltWrapper::registerApp(const char *appid, const char *description) void CAmDltWrapper::registerContext(DltContext& handle, const char *contextid, const char *description) { #ifdef WITH_DLT - dlt_register_context(&handle, contextid, description); + if (mEnableNoDLTDebug) + { + dlt_register_context(&handle, contextid, description); + } #else strncpy(handle.contextID,contextid,4); @@ -115,7 +125,10 @@ void CAmDltWrapper::registerContext(DltContext& handle, const char *contextid, c const DltLogLevelType level, const DltTraceStatusType status) { #ifdef WITH_DLT - dlt_register_context_ll_ts(&handle, contextid, description, level, status); + if (mEnableNoDLTDebug) + { + dlt_register_context_ll_ts(&handle, contextid, description, level, status); + } #else strncpy(handle.contextID,contextid,4); @@ -144,14 +157,15 @@ bool CAmDltWrapper::init(DltLogLevelType loglevel, DltContext* context) if (!context) context = &mDltContext; #ifdef WITH_DLT - if (dlt_user_log_write_start(context, &mDltContextData, loglevel) <= 0) + if (mEnableNoDLTDebug) + if(dlt_user_log_write_start(context, &mDltContextData, loglevel) <= 0) #else if((mEnableNoDLTDebug == false) || (loglevel > context->log_level_user)) #endif - { - pthread_mutex_unlock(&mMutex); - return false; - } + { + pthread_mutex_unlock(&mMutex); + return false; + } #ifndef WITH_DLT std::cout << "\e[0;34m[" << context->contextID << "]\e[0;30m\t"; #endif @@ -161,7 +175,10 @@ bool CAmDltWrapper::init(DltLogLevelType loglevel, DltContext* context) void CAmDltWrapper::send() { #ifdef WITH_DLT - dlt_user_log_write_finish(&mDltContextData); + if (mEnableNoDLTDebug) + { + dlt_user_log_write_finish(&mDltContextData); + } #else if(mEnableNoDLTDebug) std::cout << mDltContextData.buffer.str().c_str() << std::endl; @@ -175,7 +192,10 @@ void CAmDltWrapper::send() void CAmDltWrapper::append(const int8_t value) { #ifdef WITH_DLT - dlt_user_log_write_int8(&mDltContextData, value); + if (mEnableNoDLTDebug) + { + dlt_user_log_write_int8(&mDltContextData, value); + } #else appendNoDLT(value); #endif @@ -184,7 +204,10 @@ void CAmDltWrapper::append(const int8_t value) void CAmDltWrapper::append(const uint8_t value) { #ifdef WITH_DLT - dlt_user_log_write_uint8(&mDltContextData, value); + if (mEnableNoDLTDebug) + { + dlt_user_log_write_uint8(&mDltContextData, value); + } #else appendNoDLT(value); #endif @@ -193,7 +216,10 @@ void CAmDltWrapper::append(const uint8_t value) void CAmDltWrapper::append(const int16_t value) { #ifdef WITH_DLT - dlt_user_log_write_int16(&mDltContextData, value); + if (mEnableNoDLTDebug) + { + dlt_user_log_write_int16(&mDltContextData, value); + } #else appendNoDLT(value); #endif @@ -202,7 +228,10 @@ void CAmDltWrapper::append(const int16_t value) void CAmDltWrapper::append(const uint16_t value) { #ifdef WITH_DLT - dlt_user_log_write_uint16(&mDltContextData, value); + if (mEnableNoDLTDebug) + { + dlt_user_log_write_uint16(&mDltContextData, value); + } #else appendNoDLT(value); #endif @@ -211,7 +240,10 @@ void CAmDltWrapper::append(const uint16_t value) void CAmDltWrapper::append(const int32_t value) { #ifdef WITH_DLT - dlt_user_log_write_int32(&mDltContextData, value); + if (mEnableNoDLTDebug) + { + dlt_user_log_write_int32(&mDltContextData, value); + } #else appendNoDLT(value); #endif @@ -220,7 +252,10 @@ void CAmDltWrapper::append(const int32_t value) void CAmDltWrapper::append(const uint32_t value) { #ifdef WITH_DLT - dlt_user_log_write_uint32(&mDltContextData, value); + if (mEnableNoDLTDebug) + { + dlt_user_log_write_uint32(&mDltContextData, value); + } #else appendNoDLT(value); #endif @@ -228,13 +263,17 @@ void CAmDltWrapper::append(const uint32_t value) void CAmDltWrapper::append(const std::string& value) { - append(value.c_str()); + if (mEnableNoDLTDebug) + append(value.c_str()); } void CAmDltWrapper::append(const bool value) { #ifdef WITH_DLT - dlt_user_log_write_bool(&mDltContextData, static_cast<uint8_t>(value)); + if (mEnableNoDLTDebug) + { + dlt_user_log_write_bool(&mDltContextData, static_cast<uint8_t>(value)); + } #else appendNoDLT(value); #endif @@ -243,7 +282,10 @@ void CAmDltWrapper::append(const bool value) void CAmDltWrapper::append(const int64_t value) { #ifdef WITH_DLT - dlt_user_log_write_int64(&mDltContextData, value); + if (mEnableNoDLTDebug) + { + dlt_user_log_write_int64(&mDltContextData, value); + } #else appendNoDLT(value); #endif @@ -252,7 +294,10 @@ void CAmDltWrapper::append(const int64_t value) void CAmDltWrapper::append(const uint64_t value) { #ifdef WITH_DLT - dlt_user_log_write_uint64(&mDltContextData, value); + if (mEnableNoDLTDebug) + { + dlt_user_log_write_uint64(&mDltContextData, value); + } #else appendNoDLT(value); #endif @@ -261,7 +306,10 @@ void CAmDltWrapper::append(const uint64_t value) void CAmDltWrapper::append(const std::vector<uint8_t> & data) { #ifdef WITH_DLT - dlt_user_log_write_raw(&mDltContextData,(void*)data.data(),data.size()); + if (mEnableNoDLTDebug) + { + dlt_user_log_write_raw(&mDltContextData,(void*)data.data(),data.size()); + } #else mDltContextData.buffer << data.data(); #endif @@ -281,7 +329,7 @@ void CAmDltWrapper::enableNoDLTDebug(const bool enableNoDLTDebug) CAmDltWrapper::~CAmDltWrapper() { - if (mpDLTWrapper) + if (mpDLTWrapper && mEnableNoDLTDebug) { mpDLTWrapper->unregisterContext(mDltContext); delete mpDLTWrapper; diff --git a/AudioManagerUtilities/src/CAmSocketHandler.cpp b/AudioManagerUtilities/src/CAmSocketHandler.cpp index 4b113fa..8947a5a 100644 --- a/AudioManagerUtilities/src/CAmSocketHandler.cpp +++ b/AudioManagerUtilities/src/CAmSocketHandler.cpp @@ -22,7 +22,6 @@ */ #include "CAmSocketHandler.h" -//#include <audiomanagerconfig.h> #include <cassert> #include <sys/fcntl.h> #include <sys/errno.h> @@ -113,7 +112,7 @@ void CAmSocketHandler::start_listenting() else { logError("SocketHandler::start_listenting ppoll returned with error", errno); - exit(0); + throw std::runtime_error(std::string("SocketHandler::start_listenting ppoll returned with error.")); } } diff --git a/AudioManagerUtilities/src/CAmWatchdog.cpp b/AudioManagerUtilities/src/CAmWatchdog.cpp index db65095..9de2a85 100755 --- a/AudioManagerUtilities/src/CAmWatchdog.cpp +++ b/AudioManagerUtilities/src/CAmWatchdog.cpp @@ -27,12 +27,7 @@ #include <stdexcept> #include "audiomanagerconfig.h" #include "CAmDltWrapper.h" - -#ifdef SYSTEMD_FOUND - #include <systemd/sd-daemon.h> -#else - #include "sd-daemon.h" -#endif +#include <systemd/sd-daemon.h> namespace am { @@ -61,7 +56,7 @@ CAmWatchdog::CAmWatchdog(CAmSocketHandler* CAmSocketHandler) : timeout.tv_sec = (watchdogTimeout / 2) / 1000000; timeout.tv_nsec = ((watchdogTimeout / 2) % 1000000) * 1000; logInfo("CAmWatchdog::CAmWatchdog setting watchdog timeout:", watchdogTimeout, "us. Notification set to:", - timeout.tv_sec, "sec and", timeout.tv_nsec, "ns"); + (int)timeout.tv_sec, "sec and", (int)timeout.tv_nsec, "ns"); //add the timer here if (mpCAmSocketHandler->addTimer(timeout, &TimerCallback, mHandle, NULL)) diff --git a/AudioManagerUtilities/src/sd-daemon.c b/AudioManagerUtilities/src/sd-daemon.c deleted file mode 100644 index cf35148..0000000 --- a/AudioManagerUtilities/src/sd-daemon.c +++ /dev/null @@ -1,534 +0,0 @@ -/** - * SPDX license identifier: MIT - */ - -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - -/*** - Copyright 2010 Lennart Poettering - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation files - (the "Software"), to deal in the Software without restriction, - including without limitation the rights to use, copy, modify, merge, - publish, distribute, sublicense, and/or sell copies of the Software, - and to permit persons to whom the Software is furnished to do so, - subject to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. -***/ - -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif - -#include <sys/types.h> -#include <sys/stat.h> -#include <sys/socket.h> -#include <sys/un.h> -#ifdef __BIONIC__ -#include <linux/fcntl.h> -#else -#include <sys/fcntl.h> -#endif -#include <netinet/in.h> -#include <stdlib.h> -#include <errno.h> -#include <unistd.h> -#include <string.h> -#include <stdarg.h> -#include <stdio.h> -#include <stddef.h> -#include <limits.h> - -#if defined(__linux__) -#include <mqueue.h> -#endif - -#include "sd-daemon.h" - -#if (__GNUC__ >= 4) -#ifdef SD_EXPORT_SYMBOLS -/* Export symbols */ -#define _sd_export_ __attribute__ ((visibility("default"))) -#else -/* Don't export the symbols */ -#define _sd_export_ __attribute__ ((visibility("hidden"))) -#endif -#else -#define _sd_export_ -#endif - -_sd_export_ int sd_listen_fds(int unset_environment) { - -#if defined(DISABLE_SYSTEMD) || !defined(__linux__) - return 0; -#else - int r, fd; - const char *e; - char *p = NULL; - unsigned long l; - - if (!(e = getenv("LISTEN_PID"))) { - r = 0; - goto finish; - } - - errno = 0; - l = strtoul(e, &p, 10); - - if (errno != 0) { - r = -errno; - goto finish; - } - - if (!p || *p || l <= 0) { - r = -EINVAL; - goto finish; - } - - /* Is this for us? */ - if (getpid() != (pid_t) l) { - r = 0; - goto finish; - } - - if (!(e = getenv("LISTEN_FDS"))) { - r = 0; - goto finish; - } - - errno = 0; - l = strtoul(e, &p, 10); - - if (errno != 0) { - r = -errno; - goto finish; - } - - if (!p || *p) { - r = -EINVAL; - goto finish; - } - - for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + (int) l; fd ++) { - int flags; - - if ((flags = fcntl(fd, F_GETFD)) < 0) { - r = -errno; - goto finish; - } - - if (flags & FD_CLOEXEC) - continue; - - if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) < 0) { - r = -errno; - goto finish; - } - } - - r = (int) l; - -finish: - if (unset_environment) { - unsetenv("LISTEN_PID"); - unsetenv("LISTEN_FDS"); - } - - return r; -#endif -} - -_sd_export_ int sd_is_fifo(int fd, const char *path) { - struct stat st_fd; - - if (fd < 0) - return -EINVAL; - - memset(&st_fd, 0, sizeof(st_fd)); - if (fstat(fd, &st_fd) < 0) - return -errno; - - if (!S_ISFIFO(st_fd.st_mode)) - return 0; - - if (path) { - struct stat st_path; - - memset(&st_path, 0, sizeof(st_path)); - if (stat(path, &st_path) < 0) { - - if (errno == ENOENT || errno == ENOTDIR) - return 0; - - return -errno; - } - - return - st_path.st_dev == st_fd.st_dev && - st_path.st_ino == st_fd.st_ino; - } - - return 1; -} - -_sd_export_ int sd_is_special(int fd, const char *path) { - struct stat st_fd; - - if (fd < 0) - return -EINVAL; - - if (fstat(fd, &st_fd) < 0) - return -errno; - - if (!S_ISREG(st_fd.st_mode) && !S_ISCHR(st_fd.st_mode)) - return 0; - - if (path) { - struct stat st_path; - - if (stat(path, &st_path) < 0) { - - if (errno == ENOENT || errno == ENOTDIR) - return 0; - - return -errno; - } - - if (S_ISREG(st_fd.st_mode) && S_ISREG(st_path.st_mode)) - return - st_path.st_dev == st_fd.st_dev && - st_path.st_ino == st_fd.st_ino; - else if (S_ISCHR(st_fd.st_mode) && S_ISCHR(st_path.st_mode)) - return st_path.st_rdev == st_fd.st_rdev; - else - return 0; - } - - return 1; -} - -static int sd_is_socket_internal(int fd, int type, int listening) { - struct stat st_fd; - - if (fd < 0 || type < 0) - return -EINVAL; - - if (fstat(fd, &st_fd) < 0) - return -errno; - - if (!S_ISSOCK(st_fd.st_mode)) - return 0; - - if (type != 0) { - int other_type = 0; - socklen_t l = sizeof(other_type); - - if (getsockopt(fd, SOL_SOCKET, SO_TYPE, &other_type, &l) < 0) - return -errno; - - if (l != sizeof(other_type)) - return -EINVAL; - - if (other_type != type) - return 0; - } - - if (listening >= 0) { - int accepting = 0; - socklen_t l = sizeof(accepting); - - if (getsockopt(fd, SOL_SOCKET, SO_ACCEPTCONN, &accepting, &l) < 0) - return -errno; - - if (l != sizeof(accepting)) - return -EINVAL; - - if (!accepting != !listening) - return 0; - } - - return 1; -} - -union sockaddr_union { - struct sockaddr sa; - struct sockaddr_in in4; - struct sockaddr_in6 in6; - struct sockaddr_un un; - struct sockaddr_storage storage; -}; - -_sd_export_ int sd_is_socket(int fd, int family, int type, int listening) { - int r; - - if (family < 0) - return -EINVAL; - - if ((r = sd_is_socket_internal(fd, type, listening)) <= 0) - return r; - - if (family > 0) { - union sockaddr_union sockaddr; - socklen_t l; - - memset(&sockaddr, 0, sizeof(sockaddr)); - l = sizeof(sockaddr); - - if (getsockname(fd, &sockaddr.sa, &l) < 0) - return -errno; - - if (l < sizeof(sa_family_t)) - return -EINVAL; - - return sockaddr.sa.sa_family == family; - } - - return 1; -} - -_sd_export_ int sd_is_socket_inet(int fd, int family, int type, int listening, uint16_t port) { - union sockaddr_union sockaddr; - socklen_t l; - int r; - - if (family != 0 && family != AF_INET && family != AF_INET6) - return -EINVAL; - - if ((r = sd_is_socket_internal(fd, type, listening)) <= 0) - return r; - - memset(&sockaddr, 0, sizeof(sockaddr)); - l = sizeof(sockaddr); - - if (getsockname(fd, &sockaddr.sa, &l) < 0) - return -errno; - - if (l < sizeof(sa_family_t)) - return -EINVAL; - - if (sockaddr.sa.sa_family != AF_INET && - sockaddr.sa.sa_family != AF_INET6) - return 0; - - if (family > 0) - if (sockaddr.sa.sa_family != family) - return 0; - - if (port > 0) { - if (sockaddr.sa.sa_family == AF_INET) { - if (l < sizeof(struct sockaddr_in)) - return -EINVAL; - - return htons(port) == sockaddr.in4.sin_port; - } else { - if (l < sizeof(struct sockaddr_in6)) - return -EINVAL; - - return htons(port) == sockaddr.in6.sin6_port; - } - } - - return 1; -} - -_sd_export_ int sd_is_socket_unix(int fd, int type, int listening, const char *path, size_t length) { - union sockaddr_union sockaddr; - socklen_t l; - int r; - - if ((r = sd_is_socket_internal(fd, type, listening)) <= 0) - return r; - - memset(&sockaddr, 0, sizeof(sockaddr)); - l = sizeof(sockaddr); - - if (getsockname(fd, &sockaddr.sa, &l) < 0) - return -errno; - - if (l < sizeof(sa_family_t)) - return -EINVAL; - - if (sockaddr.sa.sa_family != AF_UNIX) - return 0; - - if (path) { - if (length <= 0) - length = strlen(path); - - if (length <= 0) - /* Unnamed socket */ - return l == offsetof(struct sockaddr_un, sun_path); - - if (path[0]) - /* Normal path socket */ - return - (l >= offsetof(struct sockaddr_un, sun_path) + length + 1) && - memcmp(path, sockaddr.un.sun_path, length+1) == 0; - else - /* Abstract namespace socket */ - return - (l == offsetof(struct sockaddr_un, sun_path) + length) && - memcmp(path, sockaddr.un.sun_path, length) == 0; - } - - return 1; -} - -_sd_export_ int sd_is_mq(int fd, const char *path) { -#if !defined(__linux__) - return 0; -#else - struct mq_attr attr; - - if (fd < 0) - return -EINVAL; - - if (mq_getattr(fd, &attr) < 0) - return -errno; - - if (path) { - char fpath[PATH_MAX]; - struct stat a, b; - - if (path[0] != '/') - return -EINVAL; - - if (fstat(fd, &a) < 0) - return -errno; - - strncpy(stpcpy(fpath, "/dev/mqueue"), path, sizeof(fpath) - 12); - fpath[sizeof(fpath)-1] = 0; - - if (stat(fpath, &b) < 0) - return -errno; - - if (a.st_dev != b.st_dev || - a.st_ino != b.st_ino) - return 0; - } - - return 1; -#endif -} - -_sd_export_ int sd_notify(int unset_environment, const char *state) { -#if defined(DISABLE_SYSTEMD) || !defined(__linux__) || !defined(SOCK_CLOEXEC) - return 0; -#else - int fd = -1, r; - struct msghdr msghdr; - struct iovec iovec; - union sockaddr_union sockaddr; - const char *e; - - if (!state) { - r = -EINVAL; - goto finish; - } - - if (!(e = getenv("NOTIFY_SOCKET"))) - return 0; - - /* Must be an abstract socket, or an absolute path */ - if ((e[0] != '@' && e[0] != '/') || e[1] == 0) { - r = -EINVAL; - goto finish; - } - - if ((fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0)) < 0) { - r = -errno; - goto finish; - } - - memset(&sockaddr, 0, sizeof(sockaddr)); - sockaddr.sa.sa_family = AF_UNIX; - strncpy(sockaddr.un.sun_path, e, sizeof(sockaddr.un.sun_path)); - - if (sockaddr.un.sun_path[0] == '@') - sockaddr.un.sun_path[0] = 0; - - memset(&iovec, 0, sizeof(iovec)); - iovec.iov_base = (char*) state; - iovec.iov_len = strlen(state); - - memset(&msghdr, 0, sizeof(msghdr)); - msghdr.msg_name = &sockaddr; - msghdr.msg_namelen = offsetof(struct sockaddr_un, sun_path) + strlen(e); - - if (msghdr.msg_namelen > sizeof(struct sockaddr_un)) - msghdr.msg_namelen = sizeof(struct sockaddr_un); - - msghdr.msg_iov = &iovec; - msghdr.msg_iovlen = 1; - - if (sendmsg(fd, &msghdr, MSG_NOSIGNAL) < 0) { - r = -errno; - goto finish; - } - - r = 1; - -finish: - if (unset_environment) - unsetenv("NOTIFY_SOCKET"); - - if (fd >= 0) - close(fd); - - return r; -#endif -} - -_sd_export_ int sd_notifyf(int unset_environment, const char *format, ...) { -#if defined(DISABLE_SYSTEMD) || !defined(__linux__) - return 0; -#else - va_list ap; - char *p = NULL; - int r; - - va_start(ap, format); - r = vasprintf(&p, format, ap); - va_end(ap); - - if (r < 0 || !p) - return -ENOMEM; - - r = sd_notify(unset_environment, p); - free(p); - - return r; -#endif -} - -_sd_export_ int sd_booted(void) { -#if defined(DISABLE_SYSTEMD) || !defined(__linux__) - return 0; -#else - - struct stat a, b; - - /* We simply test whether the systemd cgroup hierarchy is - * mounted */ - - if (lstat("/sys/fs/cgroup", &a) < 0) - return 0; - - if (lstat("/sys/fs/cgroup/systemd", &b) < 0) - return 0; - - return a.st_dev != b.st_dev; -#endif -} diff --git a/AudioManagerUtilities/test/AmSocketHandlerTest/CAmSocketHandlerTest.cpp b/AudioManagerUtilities/test/AmSocketHandlerTest/CAmSocketHandlerTest.cpp new file mode 100644 index 0000000..50e2aa9 --- /dev/null +++ b/AudioManagerUtilities/test/AmSocketHandlerTest/CAmSocketHandlerTest.cpp @@ -0,0 +1,357 @@ +/** + * SPDX license identifier: MPL-2.0 + * + * Copyright (C) 2012, BMW AG + * + * This file is part of GENIVI Project AudioManager. + * + * Contributions are licensed to the GENIVI Alliance under one or more + * Contribution License Agreements. + * + * \copyright + * This Source Code Form is subject to the terms of the + * Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with + * this file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * + * \author Christian Linke, christian.linke@bmw.de BMW 2011,2012 + * + * For further information see http://www.genivi.org/. + * + */ + +#include "CAmSocketHandlerTest.h" +#include <cstdio> +#include <sys/socket.h> +#include <arpa/inet.h> +#include <sys/ioctl.h> +#include <string.h> +#include <netdb.h> +#include <fcntl.h> +#include <sys/un.h> +#include <sys/poll.h> +#include "CAmSocketHandler.h" + +//todo: expand test, implement more usecases +//todo: test removeFD + +#define SOCK_PATH "/tmp/mysock" + +using namespace testing; +using namespace am; + +CAmSocketHandlerTest::CAmSocketHandlerTest() +{ +} + +CAmSocketHandlerTest::~CAmSocketHandlerTest() +{ +} + +CAmTimerCb::CAmTimerCb(CAmSocketHandler *myHandler) : + pTimer1Callback(this, &CAmTimerCb::timer1Callback), // + pTimer2Callback(this, &CAmTimerCb::timer2Callback), // + pTimer3Callback(this, &CAmTimerCb::timer3Callback), // + pTimer4Callback(this, &CAmTimerCb::timer4Callback), // + mSocketHandler(myHandler) + +{ +} + +am::CAmTimerCb::~CAmTimerCb() +{ +} + +void am::CAmTimerCb::timer1Callback(sh_timerHandle_t handle, void* userData) +{ + (void) handle; + (void) userData; + std::cout << "callback1 called" << std::endl; + timespec timeout; + timeout.tv_nsec = 0; + timeout.tv_sec = 1; + mSocketHandler->updateTimer(handle,timeout); +} + +void am::CAmTimerCb::timer2Callback(sh_timerHandle_t handle, void* userData) +{ + (void) handle; + (void) userData; + std::cout << "callback2 called" << std::endl; + timespec timeout; + timeout.tv_nsec = 011110000; + timeout.tv_sec = 1; + mSocketHandler->updateTimer(handle,timeout); +} + +void am::CAmTimerCb::timer3Callback(sh_timerHandle_t, void* userData) +{ + (void) userData; + std::cout << "callback3 called" << std::endl; +} + +void am::CAmTimerCb::timer4Callback(sh_timerHandle_t, void* userData) +{ + (void) userData; + std::cout << "callback4 called" << std::endl; + mSocketHandler->stop_listening(); +} + +void* playWithSocketServer(void* data) +{ + (void) data; + CAmSocketHandler myHandler; + CAmSamplePlugin::sockType_e type = CAmSamplePlugin::INET; + CAmSamplePlugin myplugin(&myHandler, type); + myHandler.start_listenting(); + return (NULL); +} + +void* playWithUnixSocketServer(void* data) +{ + (void) data; + CAmSocketHandler myHandler; + CAmSamplePlugin::sockType_e type = CAmSamplePlugin::UNIX; + CAmSamplePlugin myplugin(&myHandler, type); + myHandler.start_listenting(); + return (NULL); +} + +TEST(CAmSocketHandlerTest,playWithTimers) +{ + CAmSocketHandler myHandler; + CAmTimerCb testCallback(&myHandler); + timespec timeoutTime, timeout2, timeout3, timeout4; + timeoutTime.tv_sec = 1; + timeoutTime.tv_nsec = 02223234; + timeout2.tv_nsec = 333000; + timeout2.tv_sec = 0; + timeout3.tv_nsec = 333; + timeout3.tv_sec = 3; + timeout4.tv_nsec = 0; + timeout4.tv_sec = 20; + sh_timerHandle_t handle; + myHandler.addTimer(timeoutTime, &testCallback.pTimer1Callback, handle, NULL); + myHandler.addTimer(timeout2, &testCallback.pTimer2Callback, handle, NULL); + myHandler.addTimer(timeout3, &testCallback.pTimer3Callback, handle, NULL); + myHandler.addTimer(timeout4, &testCallback.pTimer4Callback, handle, NULL); + myHandler.start_listenting(); + +} + + +TEST(CAmSocketHandlerTest,playWithUNIXSockets) +{ + pthread_t serverThread; + struct sockaddr_un servAddr; + int socket_; + + //creates a thread that handles the serverpart + pthread_create(&serverThread, NULL, playWithUnixSocketServer, NULL); + + sleep(1); //we need that here because the port needs to be opened + if ((socket_ = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) + { + std::cout << "socket problem" << std::endl; + + } + + memset(&servAddr, 0, sizeof(servAddr)); + strcpy(servAddr.sun_path, SOCK_PATH); + servAddr.sun_family = AF_UNIX; + if (connect(socket_, (struct sockaddr *) &servAddr, sizeof(servAddr)) < 0) + { + std::cout << "ERROR: connect() failed\n" << std::endl; + } + + for (int i = 0; i <= 1000; i++) + { + std::string string("Got It?"); + send(socket_, string.c_str(), string.size(), 0); + } + std::string string("finish!"); + send(socket_, string.c_str(), string.size(), 0); + + pthread_join(serverThread, NULL); +} + +TEST(CAmSocketHandlerTest,playWithSockets) +{ + pthread_t serverThread; + struct sockaddr_in servAddr; + unsigned short servPort = 6060; + struct hostent *host; + int socket_; + + //creates a thread that handles the serverpart + pthread_create(&serverThread, NULL, playWithSocketServer, NULL); + + sleep(1); //we need that here because the port needs to be opened + if ((socket_ = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) + { + std::cout << "socket problem" << std::endl; + + } + + if ((host = (struct hostent*) gethostbyname("localhost")) == 0) + { + std::cout << "ERROR: gethostbyname() failed\n" << std::endl; + exit(1); + } + + memset(&servAddr, 0, sizeof(servAddr)); + servAddr.sin_family = AF_INET; + servAddr.sin_addr.s_addr = inet_addr(inet_ntoa(*(struct in_addr*) (host->h_addr_list[0]))); + servAddr.sin_port = htons(servPort); + + if (connect(socket_, (struct sockaddr *) &servAddr, sizeof(servAddr)) < 0) + { + std::cout << "ERROR: connect() failed\n" << std::endl; + } + + for (int i = 0; i <= 1000; i++) + { + std::string string("Got It?"); + send(socket_, string.c_str(), string.size(), 0); + } + std::string string("finish!"); + send(socket_, string.c_str(), string.size(), 0); + + pthread_join(serverThread, NULL); +} + + +void CAmSocketHandlerTest::SetUp() +{ +} + +void CAmSocketHandlerTest::TearDown() +{ +} + +int main(int argc, char **argv) +{ + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} + +am::CAmSamplePlugin::CAmSamplePlugin(CAmSocketHandler *mySocketHandler, sockType_e socketType) : + connectFiredCB(this, &CAmSamplePlugin::connectSocket), // + receiveFiredCB(this, &CAmSamplePlugin::receiveData), // + sampleDispatchCB(this, &CAmSamplePlugin::dispatchData), // + sampleCheckCB(this, &CAmSamplePlugin::check), // + mSocketHandler(mySocketHandler), // + mConnecthandle(), // + mReceiveHandle(), // + msgList() +{ + int yes = 1; + + int socketHandle; + struct sockaddr_in servAddr; + struct sockaddr_un unixAddr; + unsigned int servPort = 6060; + + switch (socketType) + { + case UNIX: + socketHandle = socket(AF_UNIX, SOCK_STREAM, 0); + unixAddr.sun_family = AF_UNIX; + strcpy(unixAddr.sun_path, SOCK_PATH); + unlink(unixAddr.sun_path); + bind(socketHandle, (struct sockaddr *) &unixAddr, strlen(unixAddr.sun_path) + sizeof(unixAddr.sun_family)); + break; + case INET: + socketHandle = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); + setsockopt(socketHandle, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)); + memset(&servAddr, 0, sizeof(servAddr)); + servAddr.sin_family = AF_INET; + servAddr.sin_addr.s_addr = INADDR_ANY; + servAddr.sin_port = htons(servPort); + bind(socketHandle, (struct sockaddr *) &servAddr, sizeof(servAddr)); + break; + default: + break; + } + + if (listen(socketHandle, 3) < 0) + { + std::cout << "listen ok" << std::endl; + } /* if */ + + int a = 1; + ioctl(socketHandle, FIONBIO, (char *) &a); + setsockopt(socketHandle, SOL_SOCKET, SO_KEEPALIVE, (char *) &a, sizeof(a)); + + short events = 0; + events |= POLLIN; + mySocketHandler->addFDPoll(socketHandle, events, NULL, &connectFiredCB, NULL, NULL, NULL, mConnecthandle); + std::cout << "setup server - listening" << std::endl; +} + +void am::CAmSamplePlugin::connectSocket(const pollfd pollfd1, const sh_pollHandle_t handle, void *userData) +{ + (void) handle; + (void) userData; + //first, accept the connection, create a new filedescriptor + std::cout << "Got a connection request !" << std::endl; + struct sockaddr answer; + socklen_t len = sizeof(answer); + int receiveFD = accept(pollfd1.fd, (struct sockaddr*) &answer, &len); + + //set the correct event: + short event = 0; + event |= POLLIN; + + //aded the filedescriptor to the sockethandler and register the callbacks for receiving the data + mSocketHandler->addFDPoll(receiveFD, event, NULL, &receiveFiredCB, &sampleCheckCB, &sampleDispatchCB, NULL, mReceiveHandle); + +} + +void am::CAmSamplePlugin::receiveData(const pollfd pollfd, const sh_pollHandle_t handle, void *userData) +{ + (void) handle; + (void) userData; + //initialize buffer + char buffer[10]; + //read until buffer is full or no more data is there + int read = recv(pollfd.fd, buffer, 7, 0); + if (read > 1) + { + //read the message and store it in a queue + std::string msg = std::string(buffer, read); + msgList.push(msg); + std::cout << "Got a message !" << std::endl; + } +} + +bool am::CAmSamplePlugin::dispatchData(const sh_pollHandle_t handle, void *userData) +{ + (void) handle; + (void) userData; + //read data from the queue + std::cout << "Data:" << msgList.front() << std::endl; + + //if the message was our finish message, we quit the poll loop + if (msgList.front().compare("finish!") == 0) + { + mSocketHandler->stop_listening(); + } + //remove the message from the queue and return false if there is no more message to read. + msgList.pop(); + if (msgList.size() != 0) + return true; + return false; +} + +bool am::CAmSamplePlugin::check(const sh_pollHandle_t handle, void *userData) +{ + (void) handle; + (void) userData; + //checks if there is data to dispatch + std::cout << "check!:" << std::endl; + if (msgList.size() != 0) + return true; + return false; +} + diff --git a/AudioManagerUtilities/test/AmSocketHandlerTest/CAmSocketHandlerTest.h b/AudioManagerUtilities/test/AmSocketHandlerTest/CAmSocketHandlerTest.h new file mode 100644 index 0000000..95e5446 --- /dev/null +++ b/AudioManagerUtilities/test/AmSocketHandlerTest/CAmSocketHandlerTest.h @@ -0,0 +1,87 @@ +/** + * SPDX license identifier: MPL-2.0 + * + * Copyright (C) 2012, BMW AG + * + * This file is part of GENIVI Project AudioManager. + * + * Contributions are licensed to the GENIVI Alliance under one or more + * Contribution License Agreements. + * + * \copyright + * This Source Code Form is subject to the terms of the + * Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with + * this file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * + * \author Christian Linke, christian.linke@bmw.de BMW 2011,2012 + * + * For further information see http://www.genivi.org/. + * + */ + +#ifndef SOCKETHANDLERTEST_H_ +#define SOCKETHANDLERTEST_H_ + +#define WITH_DLT + +#include "gtest/gtest.h" +#include <queue> +#include "CAmSocketHandler.h" + +namespace am +{ + +class CAmSamplePlugin +{ +public: + enum sockType_e + { + UNIX, INET + }; + CAmSamplePlugin(CAmSocketHandler *mySocketHandler, sockType_e socketType); + ~CAmSamplePlugin() + { + } + ; + void connectSocket(const pollfd pollfd, const sh_pollHandle_t handle, void* userData); + void receiveData(const pollfd pollfd, const sh_pollHandle_t handle, void* userData); + bool dispatchData(const sh_pollHandle_t handle, void* userData); + bool check(const sh_pollHandle_t handle, void* userData); + TAmShPollFired<CAmSamplePlugin> connectFiredCB; + TAmShPollFired<CAmSamplePlugin> receiveFiredCB; + TAmShPollDispatch<CAmSamplePlugin> sampleDispatchCB; + TAmShPollCheck<CAmSamplePlugin> sampleCheckCB; +private: + CAmSocketHandler *mSocketHandler; + sh_pollHandle_t mConnecthandle, mReceiveHandle; + std::queue<std::string> msgList; +}; + +class CAmTimerCb +{ +public: + CAmTimerCb(CAmSocketHandler *SocketHandler); + virtual ~CAmTimerCb(); + void timer1Callback(sh_timerHandle_t handle, void * userData); + void timer2Callback(sh_timerHandle_t handle, void * userData); + void timer3Callback(sh_timerHandle_t handle, void * userData); + void timer4Callback(sh_timerHandle_t handle, void * userData); + TAmShTimerCallBack<CAmTimerCb> pTimer1Callback; + TAmShTimerCallBack<CAmTimerCb> pTimer2Callback; + TAmShTimerCallBack<CAmTimerCb> pTimer3Callback; + TAmShTimerCallBack<CAmTimerCb> pTimer4Callback; + CAmSocketHandler *mSocketHandler; +}; + +class CAmSocketHandlerTest: public ::testing::Test +{ +public: + CAmSocketHandlerTest(); + ~CAmSocketHandlerTest(); + void SetUp(); + void TearDown(); +}; + +} /* namespace am */ +#endif /* SOCKETHANDLERTEST_H_ */ diff --git a/AudioManagerUtilities/test/AmSocketHandlerTest/CMakeLists.txt b/AudioManagerUtilities/test/AmSocketHandlerTest/CMakeLists.txt new file mode 100644 index 0000000..2a3b9d8 --- /dev/null +++ b/AudioManagerUtilities/test/AmSocketHandlerTest/CMakeLists.txt @@ -0,0 +1,50 @@ +# Copyright (C) 2012, BMW AG +# +# This file is part of GENIVI Project AudioManager. +# +# Contributions are licensed to the GENIVI Alliance under one or more +# Contribution License Agreements. +# +# copyright +# This Source Code Form is subject to the terms of the +# Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with +# this file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# author Christian Linke, christian.linke@bmw.de BMW 2011,2012 +# +# For further information see http://www.genivi.org/. +# + +cmake_minimum_required(VERSION 3.0) + +project(AmSocketHandlerTest LANGUAGES CXX VERSION ${DAEMONVERSION}) + +INCLUDE_DIRECTORIES( + ${AUDIOMANAGER_UTILITIES_INCLUDE} + ${GMOCK_INCLUDE_DIRS} +) + + +file(GLOB Socket_SRCS_CXX + "*.cpp" +) + +ADD_EXECUTABLE(AmSocketHandlerTest ${Socket_SRCS_CXX}) + +TARGET_LINK_LIBRARIES(AmSocketHandlerTest + ${GTEST_LIBRARIES} + ${GMOCK_LIBRARIES} + AudioManagerUtilities +) + +ADD_TEST(AmSocketHandlerTest AmSocketHandlerTest ${Socket_SRCS_CXX}) + +ADD_DEPENDENCIES(AmSocketHandlerTest AudioManagerUtilities) + +INSTALL(TARGETS AmSocketHandlerTest + DESTINATION ${TEST_EXECUTABLE_INSTALL_PATH} + PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ + COMPONENT tests +) + + diff --git a/AudioManagerUtilities/test/CMakeLists.txt b/AudioManagerUtilities/test/CMakeLists.txt new file mode 100644 index 0000000..fb55831 --- /dev/null +++ b/AudioManagerUtilities/test/CMakeLists.txt @@ -0,0 +1,4 @@ +add_subdirectory (AmSocketHandlerTest) + + + |