<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>