From ef4279f2e5aa9881855ed608cb81062c3676f077 Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Fri, 13 Nov 2015 15:46:27 +0100 Subject: [PATCH] utils: Provide a fallback for sigwaitinfo() if needed Apparently, not available on Mac OS X 10.10 Yosemite. We don't provide this on Windows. --- configure.ac | 2 +- src/libstrongswan/utils/compat/android.h | 28 ------------------------ src/libstrongswan/utils/utils.c | 22 ++++++++++++++++++- src/libstrongswan/utils/utils.h | 16 +++++++++++++- 4 files changed, 37 insertions(+), 31 deletions(-) diff --git a/configure.ac b/configure.ac index 73953d4ae..a0e48f35f 100644 --- a/configure.ac +++ b/configure.ac @@ -586,7 +586,7 @@ AC_CHECK_FUNC( ) AC_CHECK_FUNCS(prctl mallinfo getpass closefrom getpwnam_r getgrnam_r getpwuid_r) -AC_CHECK_FUNCS(fmemopen funopen mmap memrchr setlinebuf strptime dirfd) +AC_CHECK_FUNCS(fmemopen funopen mmap memrchr setlinebuf strptime dirfd sigwaitinfo) AC_CHECK_FUNC([syslog], [ AC_DEFINE([HAVE_SYSLOG], [], [have syslog(3) and friends]) diff --git a/src/libstrongswan/utils/compat/android.h b/src/libstrongswan/utils/compat/android.h index a9a1b13a5..b3ea9c475 100644 --- a/src/libstrongswan/utils/compat/android.h +++ b/src/libstrongswan/utils/compat/android.h @@ -21,8 +21,6 @@ #ifndef ANDROID_H_ #define ANDROID_H_ -#include - /* stuff defined in AndroidConfig.h, which is included using the -include * command-line option, thus cannot be undefined using -U CFLAGS options. * the reason we have to undefine these flags in the first place, is that @@ -30,30 +28,4 @@ * actually defined. */ #undef HAVE_BACKTRACE -/* sigwaitinfo() is not defined up to this API level, provide a fallback */ -#if __ANDROID_API__ <= 21 -#include -#include - -static inline int sigwaitinfo(const sigset_t *set, void *info) -{ - int sig, err; - - if (info) - { /* we don't replicate siginfo_t, which we don't use */ - errno = EINVAL; - return -1; - } - err = sigwait(set, &sig); - if (err != 0) - { - errno = err; - sig = -1; - } - return sig; -} -#else -#error Check availability of sigwaitinfo() in this API level -#endif - #endif /** ANDROID_H_ @}*/ diff --git a/src/libstrongswan/utils/utils.c b/src/libstrongswan/utils/utils.c index fca614ef4..47d72ee98 100644 --- a/src/libstrongswan/utils/utils.c +++ b/src/libstrongswan/utils/utils.c @@ -20,6 +20,7 @@ #include #include #include +#include #ifndef WIN32 # include #endif @@ -126,7 +127,26 @@ void wait_sigint() sigwaitinfo(&set, NULL); } -#endif +#ifndef HAVE_SIGWAITINFO +int sigwaitinfo(const sigset_t *set, void *info) +{ + int sig, err; + + if (info) + { /* we don't replicate siginfo_t, fail if anybody tries to use it */ + errno = EINVAL; + return -1; + } + err = sigwait(set, &sig); + if (err != 0) + { + errno = err; + sig = -1; + } + return sig; +} +#endif /* HAVE_SIGWAITINFO */ +#endif /* WIN32 */ #ifndef HAVE_CLOSEFROM /** diff --git a/src/libstrongswan/utils/utils.h b/src/libstrongswan/utils/utils.h index 44d882bab..18b17b120 100644 --- a/src/libstrongswan/utils/utils.h +++ b/src/libstrongswan/utils/utils.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2014 Tobias Brunner + * Copyright (C) 2008-2015 Tobias Brunner * Copyright (C) 2008 Martin Willi * Hochschule fuer Technik Rapperswil * @@ -38,6 +38,7 @@ # include # include # include +# include #endif #include "utils/types.h" @@ -151,6 +152,19 @@ void utils_deinit(); */ #define ignore_result(call) { if(call){}; } +#if !defined(HAVE_SIGWAITINFO) && !defined(WIN32) +/** + * Block and wait for a set of signals + * + * We don't replicate the functionality of siginfo_t. If info is not NULL + * -1 is returend and errno is set to EINVAL. + * + * @param set set of signals to wait for + * @param info must be NULL + */ +int sigwaitinfo(const sigset_t *set, void *info); +#endif + /** * Portable function to wait for SIGINT/SIGTERM (or equivalent). */