<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/54e1032dd74f8b65a8db578b3f695ad1d3bc2140">https://github.com/macports/macports-legacy-support/commit/54e1032dd74f8b65a8db578b3f695ad1d3bc2140</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 54e1032dd74f8b65a8db578b3f695ad1d3bc2140
</span>Author: Fred Wright <fw@fwright.net>
AuthorDate: Mon Jul 7 18:59:30 2025 -0700

<span style='display:block; white-space:pre;color:#404040;'>    setattrlist: New source with fix for setattrlist() bug.
</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;'>    Updated test passes on all platforms.
</span>---
 include/MacportsLegacySupport.h |   4 ++
 src/fxetattrlist.c              |   6 ++
 src/setattrlist.c               | 128 ++++++++++++++++++++++++++++++++++++++++
 3 files changed, 138 insertions(+)

<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 f124577..26abf12 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;'>@@ -279,6 +279,10 @@
</span> #define __MPLS_SDK_SUPPORT_FXETATTRLIST__     (__MPLS_SDK_MAJOR < 1060)
 #define __MPLS_LIB_SUPPORT_FXETATTRLIST__     (__MPLS_TARGET_OSVER < 1060)
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Bugfix for [f]setattrlist() */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define __MPLS_LIB_FIX_SETATTRLIST__          (__MPLS_TARGET_OSVER < 1080 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                               && __MPLS_TARGET_OSVER >= 1050)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> /* localtime_r, gmtime_r, etc only declared on Tiger when _ANSI_SOURCE and _POSIX_C_SOURCE are undefined */
 #define __MPLS_SDK_SUPPORT_TIME_THREAD_SAFE_FUNCTIONS__  (__MPLS_SDK_MAJOR < 1050)
 
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/fxetattrlist.c b/src/fxetattrlist.c
</span><span style='display:block; white-space:pre;color:#808080;'>index e834618..1c0054d 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/fxetattrlist.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/fxetattrlist.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -38,6 +38,12 @@
</span>  * that such handling wouldn't be worthwhile.  Hence, we just use the
  * normally appropriate stack-based buffers, and let the fcntl() wrapper
  * fix the 10.4 ppc64 case.
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * NOTE: This needs to be a separate source from setattrlist, due to
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * the handling of the variant suffixes.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Also note that, if we're not supplying missing functions here, then
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * a wrapper for fsetattrlist() may be provided by setattrlist.
</span>  */
 
 #include <fcntl.h>
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/setattrlist.c b/src/setattrlist.c
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 0000000..9567518
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/setattrlist.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,128 @@
</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;'>+ * Permission to use, copy, modify, and distribute this software for any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * purpose with or without fee is hereby granted, provided that the above
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * copyright notice and this permission notice appear in all copies.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
</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_FIX_SETATTRLIST__
</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;'>+ * Versions of [f]setattrlist() on 10.5-10.7 have a bug where if no
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * attributes are requested to be set and the attribute buffer has zero
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * length, then it fails with ENOMEM instead of being a successful NOP.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * This provides a fix for that.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * NOTE: This needs to be a separate source from fxetattrlist, due to
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * the handling of the variant suffixes.
</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;'>+/* Keep unistd from defining any version of setattrlist directly */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define setattrlist __os_setattrlist
</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;'>+#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/attr.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Now undo our macro kludge */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#undef setattrlist
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "util.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifdef __LP64__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+typedef unsigned int attrlist_opts_t;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#else /* !__LP64__ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+typedef unsigned long attrlist_opts_t;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif /* !__LP64__ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* In relevant case, turn error into success */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+fix_ret(int ret, int saverr, struct attrlist *al, size_t bufsiz)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (bufsiz == 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      && al->commonattr == 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      && (al->volattr & ~ATTR_VOL_INFO) == 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      && al->dirattr == 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      && al->fileattr == 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      && al->forkattr == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    errno = saverr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  return ret;
</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;'>+setattrlist(const char *path, void *attrList, void *attrBuf,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            size_t attrBufSize, attrlist_opts_t options)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  int ret, saverr = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  GET_OS_FUNC(setattrlist)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  /* Try the call - if it's not the possible bug, just pass the result. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  ret = (*os_setattrlist)(path, attrList, attrBuf, attrBufSize, options);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (!ret || errno != ENOMEM) return ret;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  /* Else apply the fix if appropriate. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  return fix_ret(ret, saverr, attrList, attrBufSize);
</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;'>+#ifndef __LP64__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * 32-bit builds may have two variants.  Since this code doesn't apply to
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * 10.4, we don't need the fallback to the "unadorned" variant.
</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;'>+setattrlist$UNIX2003(const char *path, void *attrList, void *attrBuf,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     size_t attrBufSize, attrlist_opts_t options)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  int ret, saverr = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  GET_OS_ALT_FUNC(setattrlist$UNIX2003, setattrlist)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  /* Try the call - if it's not the possible bug, just pass the result. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  ret = (*os_setattrlist)(path, attrList, attrBuf, attrBufSize, options);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (!ret || errno != ENOMEM) return ret;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  /* Else apply the fix if appropriate. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  return fix_ret(ret, saverr, attrList, attrBufSize);
</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  /* !__LP64__ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if !__MPLS_LIB_SUPPORT_FXETATTRLIST__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * If we're not providing a missing fsetattrlist(), then we need to
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * wrap it here to apply the same fix.
</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;'>+fsetattrlist(int fd, void *attrList, void *attrBuf,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            size_t attrBufSize, attrlist_opts_t options)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  int ret, saverr = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  GET_OS_FUNC(fsetattrlist)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  /* Try the call - if it's not the possible bug, just pass the result. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  ret = (*os_fsetattrlist)(fd, attrList, attrBuf, attrBufSize, options);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (!ret || errno != ENOMEM) return ret;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  /* Else apply the fix if appropriate. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  return fix_ret(ret, saverr, attrList, attrBufSize);
</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_FXETATTRLIST__ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif  /* __MPLS_LIB_FIX_SETATTRLIST__ */
</span></pre><pre style='margin:0'>

</pre>