<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/4e3779a046ad9cc65c82eef1b21189915d5d76c2">https://github.com/macports/macports-legacy-support/commit/4e3779a046ad9cc65c82eef1b21189915d5d76c2</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 4e3779a046ad9cc65c82eef1b21189915d5d76c2
</span>Author: Fred Wright <fw@fwright.net>
AuthorDate: Wed Jan 8 21:20:39 2025 -0800

<span style='display:block; white-space:pre;color:#404040;'>    test_copyfile: Avoid broken COPYFILE_ACL on 10.4 Rosetta.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Due to a bug in fstatx_np() in 10.4 Rosetta, COPYFILE_ACL doesn't
</span><span style='display:block; white-space:pre;color:#404040;'>    work.  In that case, we disable that particular operation to avoid a
</span><span style='display:block; white-space:pre;color:#404040;'>    test failure.  The remaining three COPYFILE_ALL operations are still
</span><span style='display:block; white-space:pre;color:#404040;'>    tested.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    There's also a bug in 10.4 Rosetta's chmodx_np(), which causes an
</span><span style='display:block; white-space:pre;color:#404040;'>    internal error when attempting to ensure that the destination is
</span><span style='display:block; white-space:pre;color:#404040;'>    writable, but that doesn't cause failures in the test case.
</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 on all platforms, including 10.4 Rosetta.
</span>---
 test/test_copyfile.c | 36 ++++++++++++++++++++++++++++++++----
 1 file changed, 32 insertions(+), 4 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/test/test_copyfile.c b/test/test_copyfile.c
</span><span style='display:block; white-space:pre;color:#808080;'>index cf1dcf0..27d779c 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/test/test_copyfile.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/test/test_copyfile.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -29,6 +29,11 @@
</span> 
 #include <sys/param.h>
 #include <sys/stat.h>
<span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sys/sysctl.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sys/types.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* sysctl to check whether we're running natively (not Rosetta) */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define SYSCTL_NATIVE "sysctl.proc_native"
</span> 
 /* Set up condition for testing the compatibility wrappers. */
 #if !defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) \
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -58,10 +63,28 @@ typedef struct dummy_ctx_s {
</span>   int dummy;
 } dummy_ctx_t;
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * 10.4 Rosetta is unable to handle COPYFILE_ACL, so we need to check.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if TEST_TIGER && defined(__ppc__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+arch_ok(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  int val = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  size_t vsiz = sizeof(val);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (sysctlbyname(SYSCTL_NATIVE, &val, &vsiz, NULL, 0) < 0) return -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  return val;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#else /* not possibly 10.4 Rosetta */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static int arch_ok(void) { return 1;}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> int
 main(int argc, char *argv[])
 {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-  int verbose = 0, debug = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  int verbose = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  copyfile_flags_t test_flags = COPYFILE_ALL;
</span>   char *debugenv;
   copyfile_state_t state, state_test;
   dummy_ctx_t ctx = {0}, *ctxp;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -74,7 +97,7 @@ main(int argc, char *argv[])
</span>   if (argc > 1 && !strcmp(argv[1], "-v")) verbose = 1;
   if (argc > 1 && !strcmp(argv[1], "-d")) {
     verbose = 1;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    debug = COPYFILE_DEBUG;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    test_flags |= COPYFILE_DEBUG;
</span>   }
 
   (void) snprintf(dest, sizeof(dest), "%s/%s-%u", TEST_TEMP, name, pid);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -83,7 +106,7 @@ main(int argc, char *argv[])
</span>     printf("%s starting.\n", name);
     printf("  %s -> %s\n", argv[0], dest);
   }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-  if (debug) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (test_flags & COPYFILE_DEBUG) {
</span>     if ((debugenv = getenv("COPYFILE_DEBUG"))) {
       printf("    Debugging enabled, level (COPYFILE_DEBUG) = %s\n", debugenv);
     } else {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -91,6 +114,11 @@ main(int argc, char *argv[])
</span>     }
   }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (!arch_ok()) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if (verbose) printf("    Avoiding COPYFILE_ACL due to Rosetta bug\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    test_flags &= ~COPYFILE_ACL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span>   if (stat(argv[0], &ourstat)) {
     perror("unable to stat() self");
     return 1;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -127,7 +155,7 @@ main(int argc, char *argv[])
</span>     return 1;
   }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-  if (copyfile(argv[0], dest, state, COPYFILE_ALL | debug)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (copyfile(argv[0], dest, state, test_flags)) {
</span>     perror("copyfile() failed");
     return 1;
   }
</pre><pre style='margin:0'>

</pre>