utils: Provide a fallback for sigwaitinfo() if needed
authorTobias Brunner <tobias@strongswan.org>
Fri, 13 Nov 2015 14:46:27 +0000 (15:46 +0100)
committerTobias Brunner <tobias@strongswan.org>
Fri, 13 Nov 2015 17:24:45 +0000 (18:24 +0100)
Apparently, not available on Mac OS X 10.10 Yosemite. We don't provide
this on Windows.

configure.ac
src/libstrongswan/utils/compat/android.h
src/libstrongswan/utils/utils.c
src/libstrongswan/utils/utils.h

index 73953d4..a0e48f3 100644 (file)
@@ -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])
index a9a1b13..b3ea9c4 100644 (file)
@@ -21,8 +21,6 @@
 #ifndef ANDROID_H_
 #define ANDROID_H_
 
-#include <android/api-level.h>
-
 /* 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
  * actually defined. */
 #undef HAVE_BACKTRACE
 
-/* sigwaitinfo() is not defined up to this API level, provide a fallback */
-#if __ANDROID_API__ <= 21
-#include <errno.h>
-#include <signal.h>
-
-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_ @}*/
index fca614e..47d72ee 100644 (file)
@@ -20,6 +20,7 @@
 #include <unistd.h>
 #include <limits.h>
 #include <ctype.h>
+#include <errno.h>
 #ifndef WIN32
 # include <signal.h>
 #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
 /**
index 44d882b..18b17b1 100644 (file)
@@ -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 <netinet/in.h>
 # include <sched.h>
 # include <poll.h>
+# include <signal.h>
 #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).
  */