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/src | |
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/src')
-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 |
4 files changed, 81 insertions, 573 deletions
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 -} |