summary refs log tree commit diff
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2023-09-12 12:11:06 +0000
committerLaurent Bercot <ska@appnovation.com>2023-09-12 12:11:06 +0000
commit78ba749bcb8e63cbe69b59831436d28562d27b88 (patch)
tree48aebac55eb58b941311591dd190d04dd3e29dfc
parent32544468e5db6a2635b6c0f9e261a288fe7179e9 (diff)
downloadskalibs-78ba749bcb8e63cbe69b59831436d28562d27b88.tar.gz
skalibs-78ba749bcb8e63cbe69b59831436d28562d27b88.tar.xz
skalibs-78ba749bcb8e63cbe69b59831436d28562d27b88.zip
Add waitid() sysdep, and fuck OpenBSD
Signed-off-by: Laurent Bercot <ska@appnovation.com>
-rwxr-xr-xconfigure1
-rw-r--r--src/libstddjb/cspawn.c7
-rw-r--r--src/sysdeps/trywaitid.c12
3 files changed, 19 insertions, 1 deletions
diff --git a/configure b/configure
index a04de8f..12e76fe 100755
--- a/configure
+++ b/configure
@@ -630,6 +630,7 @@ choose cl splice 'splice()'
 choose cl strcasestr 'strcasestr()'
 choose c strnlen 'strnlen()'
 choose c uint64t 'uint64_t'
+choose cl waitid 'waitid()'
 choose cl futimens 'futimens()'
 choose cl futimes 'futimes()'
 choose cl arc4random 'arc4random()'
diff --git a/src/libstddjb/cspawn.c b/src/libstddjb/cspawn.c
index cb89481..ea0da90 100644
--- a/src/libstddjb/cspawn.c
+++ b/src/libstddjb/cspawn.c
@@ -96,7 +96,12 @@ static inline pid_t cspawn_fork (char const *prog, char const *const *argv, char
   return pid ;
 }
 
-#ifdef SKALIBS_HASPOSIXSPAWN
+ /*
+    guess who has a buggy posix_spawn() *and* doesn't have waitid() to work around it?
+    if you guessed OpenBSD, you're right!
+ */
+
+#if defined(SKALIBS_HASPOSIXSPAWN) && (!defined(SKALIBS_HASPOSIXSPAWNEARLYRETURN) || defined(SKALIBS_HASWAITID))
 
 #include <signal.h>
 #include <stdlib.h>
diff --git a/src/sysdeps/trywaitid.c b/src/sysdeps/trywaitid.c
new file mode 100644
index 0000000..76ceeea
--- /dev/null
+++ b/src/sysdeps/trywaitid.c
@@ -0,0 +1,12 @@
+/* ISC license. */
+
+#include <sys/types.h>
+#include <signal.h>
+#include <sys/wait.h>
+
+int main (void)
+{
+  siginfo_t info ;
+  waitid(P_PID, 0, &info, WEXITED) ;
+  return 0 ;
+}