From d532a817b3e08cda6000828b6587fa860afb74c3 Mon Sep 17 00:00:00 2001 From: seabaylea Date: Wed, 23 Dec 2015 18:14:49 +0000 Subject: [PATCH] Add clean failure for EVFILT_PROC usage --- configure.ac | 25 ++++++++++++++++++++++++- src/source.c | 7 +++++++ tests/Makefile.am | 2 +- tests/dispatch_proc.c | 8 ++++++-- 4 files changed, 38 insertions(+), 4 deletions(-) diff --git a/configure.ac b/configure.ac index acd440704..2d10b2885 100644 --- a/configure.ac +++ b/configure.ac @@ -139,10 +139,33 @@ AC_SEARCH_LIBS(pthread_create, pthread) # # Prefer native kqueue(2); otherwise use libkqueue if present. # -AC_CHECK_HEADER(sys/event.h, [], +AC_CHECK_HEADER(kqueue/sys/event.h, + [kqueue_include="#include " + kqueue_lib="-lkqueue"] +) + +AC_CHECK_HEADER(sys/event.h, + [kqueue_include="#include "], [PKG_CHECK_MODULES(KQUEUE, libkqueue)] ) +AC_SUBST([LIBS],["${LIBS} $kqueue_lib"]) +AC_RUN_IFELSE( + [AC_LANG_PROGRAM([ + $kqueue_include + #include ], [ + int kq, i; + struct kevent ke; + kq = kqueue(); + if (kq == -1) return(1); + EV_SET(&ke, 1, EVFILT_PROC, EV_ADD, NOTE_EXIT | NOTE_FORK | NOTE_EXEC, 0, NULL); + i = kevent(kq, &ke, 1, NULL, 0, NULL); + if (i == -1) return(1); + return(0);])], + [AC_DEFINE(HAVE_EVFILT_PROC, 1, [Define if EVFILT_PROC available])], + [AC_DEFINE(HAVE_EVFILT_PROC, 0, [Define if EVFILT_PROC available])] +) + AC_CHECK_FUNCS([strlcpy getprogname], [], [PKG_CHECK_MODULES(BSD_OVERLAY, libbsd-overlay,[ AC_DEFINE(HAVE_STRLCPY, 1, []) diff --git a/src/source.c b/src/source.c index f149254e2..21e992307 100644 --- a/src/source.c +++ b/src/source.c @@ -106,6 +106,13 @@ dispatch_source_create(dispatch_source_type_t type, } switch (type->ke.filter) { +#if !HAVE_EVFILT_PROC + // return null if not supported + case EVFILT_PROC: + return NULL; + break; +#endif + case EVFILT_SIGNAL: if (handle >= NSIG) { return NULL; diff --git a/tests/Makefile.am b/tests/Makefile.am index 062ecdfd4..d82040d3d 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -21,12 +21,12 @@ noinst_SCRIPTS=leaks-wrapper.sh UNPORTED_TESTS= \ dispatch_deadname \ - dispatch_proc \ dispatch_vm \ dispatch_vnode \ dispatch_select PORTED_TESTS_FAILED= \ + dispatch_proc \ dispatch_group \ dispatch_priority \ dispatch_priority2 \ diff --git a/tests/dispatch_proc.c b/tests/dispatch_proc.c index 6c3b70167..65c40e9cd 100644 --- a/tests/dispatch_proc.c +++ b/tests/dispatch_proc.c @@ -50,8 +50,12 @@ test_proc(pid_t bad_pid) posix_spawnattr_t attr; res = posix_spawnattr_init(&attr); assert(res == 0); - res = posix_spawnattr_setflags(&attr, POSIX_SPAWN_START_SUSPENDED); - assert(res == 0); + +#if HAVE_POSIX_SPAWN_START_SUSPENDED + short spawnflags = POSIX_SPAWN_START_SUSPENDED; + res = posix_spawnattr_setflags(&attr, spawnflags); + assert(res == 0); +#endif char* args[] = { "/bin/sleep", "2", NULL