<pre style='margin:0'>
Christopher Nielsen (mascguy) pushed a commit to branch master
in repository macports-legacy-support.
</pre>
<p><a href="https://github.com/macports/macports-legacy-support/commit/bc334c521d2ab159429fba4587d2152297f10cb5">https://github.com/macports/macports-legacy-support/commit/bc334c521d2ab159429fba4587d2152297f10cb5</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit bc334c521d2ab159429fba4587d2152297f10cb5
</span>Author: Fred Wright <fw@fwright.net>
AuthorDate: Sat Jan 18 17:31:47 2025 -0800
<span style='display:block; white-space:pre;color:#404040;'> Provide pthread_[f]chdir_np() functions for 10.5+.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> This provides both missing prototypes and missing function wrappers
</span><span style='display:block; white-space:pre;color:#404040;'> for the pthread_[f]chdir_np() functions, which were introduced as
</span><span style='display:block; white-space:pre;color:#404040;'> syscalls in 10.5, but not provided as functions until 10.12, and
</span><span style='display:block; white-space:pre;color:#404040;'> not provided as prototypes at all in any SDK.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> At present, no SDK for any OS version provides prototypes for these
</span><span style='display:block; white-space:pre;color:#404040;'> functions, even when the functions themselves are included in
</span><span style='display:block; white-space:pre;color:#404040;'> libSystem. For that reason, we condition the addition of the
</span><span style='display:block; white-space:pre;color:#404040;'> prototypes on the flag _MACPORTS_LEGACY_PTHREAD_CHDIR. This is
</span><span style='display:block; white-space:pre;color:#404040;'> ignored in the 10.4 SDK, since the functions themselves are not
</span><span style='display:block; white-space:pre;color:#404040;'> available in 10.4.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> The missing function wrappers are provided for 10.5-10.11. For 10.4,
</span><span style='display:block; white-space:pre;color:#404040;'> dummy functions that always fail are provided, though no SDK
</span><span style='display:block; white-space:pre;color:#404040;'> declarations are present in the 10.4 SDK, even with the enabling flag.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> Closes: https://trac.macports.org/ticket/71265
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> TESTED:
</span><span style='display:block; white-space:pre;color:#404040;'> Passes all tests on all platforms, including the new test.
</span>---
include/MacportsLegacySupport.h | 11 ++++
include/pthread.h | 12 ++++-
src/best_fchdir.c | 46 -----------------
src/pthread_chdir.c | 110 ++++++++++++++++++++++++++++++++++++++++
4 files changed, 131 insertions(+), 48 deletions(-)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/include/MacportsLegacySupport.h b/include/MacportsLegacySupport.h
</span><span style='display:block; white-space:pre;color:#808080;'>index 155ea3a..d728dd6 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/include/MacportsLegacySupport.h
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/include/MacportsLegacySupport.h
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -332,6 +332,17 @@
</span> #define __MPLS_LIB_FIX_TIGER_ROSETTA__ (__MPLS_TARGET_OSVER < 1050 \
&& __MPLS_APPLE_PPC__)
<span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * pthread_[f]chdir_np(), avail as syscalls but not functions in 10.5-10.11
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * No SDK provides prototypes for these functions, so the SDK flag here
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * just indicates that it's plausible.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define __MPLS_SDK_ALLOW_PTHREAD_CHDIR__ (__MPLS_SDK_MAJOR >= 1050)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define __MPLS_LIB_SUPPORT_PTHREAD_CHDIR__ (__MPLS_TARGET_OSVER < 101200 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ && __MPLS_TARGET_OSVER >= 1050)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Also provide dummy (failing) versions for 10.4 and 10.5+ SDK */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define __MPLS_LIB_DUMMY_PTHREAD_CHDIR__ (__MPLS_TARGET_OSVER < 1050)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> /* Compound macros, bundling functionality needed by multiple single features. */
#define __MPLS_LIB_NEED_BEST_FCHDIR__ (__MPLS_LIB_SUPPORT_ATCALLS__ \
|| __MPLS_LIB_SUPPORT_SETATTRLISTAT__)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/include/pthread.h b/include/pthread.h
</span><span style='display:block; white-space:pre;color:#808080;'>index 6b3ad9e..fc5bca5 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/include/pthread.h
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/include/pthread.h
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,5 +1,5 @@
</span> /*
<span style='display:block; white-space:pre;background:#ffe0e0;'>- * Copyright (c) 2018
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 2025
</span> *
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -31,13 +31,21 @@
</span> #define PTHREAD_RWLOCK_INITIALIZER {_PTHREAD_RWLOCK_SIG_init, {0}}
#endif
<span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span> __MP__BEGIN_DECLS
#if __MPLS_SDK_SUPPORT_PTHREAD_SETNAME_NP__
int pthread_setname_np(const char *);
#endif /* __MPLS_SDK_SUPPORT_PTHREAD_SETNAME_NP__ */
<span style='display:block; white-space:pre;background:#e0ffe0;'>+#if __MPLS_SDK_ALLOW_PTHREAD_CHDIR__ \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ && defined(_MACPORTS_LEGACY_PTHREAD_CHDIR) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ && _MACPORTS_LEGACY_PTHREAD_CHDIR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int pthread_chdir_np(const char* path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int pthread_fchdir_np(int fd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif /* __MPLS_SDK_ALLOW_PTHREAD_CHDIR__ && ... */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> __MP__END_DECLS
#endif /* _MACPORTS_PTHREAD_H_ */
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/best_fchdir.c b/src/best_fchdir.c
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 4327c47..0000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/best_fchdir.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,46 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-/*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- * Copyright (c) 2019
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- * Copyright (c) 2023 raf <raf@raf.org>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- *
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- *
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- * SUCH DAMAGE.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-/* MP support header */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#include "MacportsLegacySupport.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#if __MPLS_LIB_NEED_BEST_FCHDIR__
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#include <unistd.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#include <sys/syscall.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#ifndef SYS___pthread_fchdir
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#define SYS___pthread_fchdir 349
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-int best_fchdir(int dirfd)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#if __MPLS_TARGET_OSVER >= 1050
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- return syscall(SYS___pthread_fchdir, dirfd);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-/* Tiger does not have kernel support for __pthread_fchdir, so we have to fall back to fchdir */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-/* unless we can come up with a per-thread compatible implementation that works on Tiger. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-/* Accept dirfd == -1 (which is meaningful for __pthread_fchdir) but do nothing with it. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if (dirfd == -1)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- return 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- return syscall(SYS_fchdir, dirfd);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#endif /* __MPLS_LIB_NEED_BEST_FCHDIR__ */
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/pthread_chdir.c b/src/pthread_chdir.c
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 0000000..4986917
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/pthread_chdir.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,110 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 2025 Frederick H. G. Wright II <fw@fwright.net>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * SUCH DAMAGE.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* MP support header */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "MacportsLegacySupport.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if __MPLS_LIB_SUPPORT_PTHREAD_CHDIR__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * The pthread_[f]chdir_np() functions are available as syscalls starting
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * in 10.5, but not as functions until 10.12. This provides the missing
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * function wrappers where needed.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define _MACPORTS_LEGACY_PTHREAD_CHDIR 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <pthread.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <unistd.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sys/syscall.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+pthread_chdir_np(const char* path)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return syscall(SYS___pthread_chdir, path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+pthread_fchdir_np(int fd)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return syscall(SYS___pthread_fchdir, fd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif /* __MPLS_LIB_SUPPORT_PTHREAD_CHDIR__ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if __MPLS_LIB_DUMMY_PTHREAD_CHDIR__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Dummy versions of the functions, in case the client builds with a 10.5+ SDK
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * but runs on 10.4. There's no truly appropriate choice for errno, so we
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * pick ENXIO as one that's somewhat mnemonic and not likely to occur with
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * the real functions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <errno.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+pthread_chdir_np(const char* path)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (void) path;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errno = ENXIO;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+pthread_fchdir_np(int fd)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (void) fd;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errno = ENXIO;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif /* __MPLS_LIB_DUMMY_PTHREAD_CHDIR__ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if __MPLS_LIB_NEED_BEST_FCHDIR__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Provide a per-thread fchdir() for the ATCALL code if possible, but
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * fall back to the (thread-unsafe) process-level version if not (10.4).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if !__MPLS_LIB_DUMMY_PTHREAD_CHDIR__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define _MACPORTS_LEGACY_PTHREAD_CHDIR 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <pthread.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+best_fchdir(int dirfd)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return pthread_fchdir_np(dirfd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#else /* __MPLS_LIB_DUMMY_PTHREAD_CHDIR__ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <unistd.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+best_fchdir(int dirfd)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Accept dirfd == -1 (return to process cwd in __pthread_fchdir),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * but do nothing with it.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (dirfd == -1) return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return fchdir(dirfd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif /* __MPLS_LIB_DUMMY_PTHREAD_CHDIR__ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif /* __MPLS_LIB_NEED_BEST_FCHDIR__ */
</span></pre><pre style='margin:0'>
</pre>