xref: /openbsd-src/gnu/llvm/lldb/source/Host/macosx/objcxx/PosixSpawnResponsible.h (revision be691f3bb6417f04a68938fadbcaee2d5795e764)
1*be691f3bSpatrick //===-- PosixSpawnResponsible.h ---------------------------------*- C++ -*-===//
2*be691f3bSpatrick //
3*be691f3bSpatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*be691f3bSpatrick // See https://llvm.org/LICENSE.txt for license information.
5*be691f3bSpatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*be691f3bSpatrick //
7*be691f3bSpatrick //===----------------------------------------------------------------------===//
8*be691f3bSpatrick 
9*be691f3bSpatrick #ifndef LLDB_HOST_POSIXSPAWNRESPONSIBLE_H
10*be691f3bSpatrick #define LLDB_HOST_POSIXSPAWNRESPONSIBLE_H
11*be691f3bSpatrick 
12*be691f3bSpatrick #include <spawn.h>
13*be691f3bSpatrick 
14*be691f3bSpatrick #if __has_include(<responsibility.h>)
15*be691f3bSpatrick #include <dispatch/dispatch.h>
16*be691f3bSpatrick #include <dlfcn.h>
17*be691f3bSpatrick #include <responsibility.h>
18*be691f3bSpatrick 
19*be691f3bSpatrick // Older SDKs  have responsibility.h but not this particular function. Let's
20*be691f3bSpatrick // include the prototype here.
21*be691f3bSpatrick errno_t responsibility_spawnattrs_setdisclaim(posix_spawnattr_t *attrs,
22*be691f3bSpatrick                                               bool disclaim);
23*be691f3bSpatrick 
24*be691f3bSpatrick #endif
25*be691f3bSpatrick 
setup_posix_spawn_responsible_flag(posix_spawnattr_t * attr)26*be691f3bSpatrick static inline int setup_posix_spawn_responsible_flag(posix_spawnattr_t *attr) {
27*be691f3bSpatrick   if (@available(macOS 10.14, *)) {
28*be691f3bSpatrick #if __has_include(<responsibility.h>)
29*be691f3bSpatrick     static __typeof__(responsibility_spawnattrs_setdisclaim)
30*be691f3bSpatrick         *responsibility_spawnattrs_setdisclaim_ptr;
31*be691f3bSpatrick     static dispatch_once_t pred;
32*be691f3bSpatrick     dispatch_once(&pred, ^{
33*be691f3bSpatrick       responsibility_spawnattrs_setdisclaim_ptr =
34*be691f3bSpatrick #ifdef __cplusplus
35*be691f3bSpatrick           reinterpret_cast<__typeof__(&responsibility_spawnattrs_setdisclaim)>
36*be691f3bSpatrick #endif
37*be691f3bSpatrick           (dlsym(RTLD_DEFAULT, "responsibility_spawnattrs_setdisclaim"));
38*be691f3bSpatrick     });
39*be691f3bSpatrick     if (responsibility_spawnattrs_setdisclaim_ptr)
40*be691f3bSpatrick       return responsibility_spawnattrs_setdisclaim_ptr(attr, true);
41*be691f3bSpatrick #endif
42*be691f3bSpatrick   }
43*be691f3bSpatrick   return 0;
44*be691f3bSpatrick }
45*be691f3bSpatrick 
46*be691f3bSpatrick #endif // LLDB_HOST_POSIXSPAWNRESPONSIBLE_H
47