<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/ba45d6cbdada07b6b3bd1271540bfd300e668119">https://github.com/macports/macports-legacy-support/commit/ba45d6cbdada07b6b3bd1271540bfd300e668119</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit ba45d6cbdada07b6b3bd1271540bfd300e668119
</span>Author: Fred Wright <fw@fwright.net>
AuthorDate: Thu Jan 9 21:01:05 2025 -0800
<span style='display:block; white-space:pre;color:#404040;'> test_stat: Avoid broken fstatx_np() on 10.4 Rosetta.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> The fstatx_np() and fstatx64_np() functions don't work in 10.4
</span><span style='display:block; white-space:pre;color:#404040;'> Rosetta. This excludes their tests in that 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;'> Now passes on all platforms, including 10.4 Rosetta.
</span>---
test/test_stat.c | 65 ++++++++++++++++++++++++++++++++++++++++++--------------
1 file changed, 49 insertions(+), 16 deletions(-)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/test/test_stat.c b/test/test_stat.c
</span><span style='display:block; white-space:pre;color:#808080;'>index ea83366..9fd49e2 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/test/test_stat.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/test/test_stat.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -26,12 +26,17 @@
</span> #include <sys/fcntl.h>
#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>
/* Make sure we always have a "struct stat64" */
#if !__MPLS_HAVE_STAT64
struct stat64 __DARWIN_STRUCT_STAT64;
#endif
<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><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> /* Structure accommodating both struct stat sizes, with padding for check */
typedef struct safe_stat_s {
struct stat_s {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -54,6 +59,25 @@ static const char *source = __FILE__;
</span> static const char *source_link = __FILE__ "_link";
static char dir[MAXPATHLEN], rel_base[MAXPATHLEN], rel_link[MAXPATHLEN];
<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 fstatx_np(), 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 (!defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ || __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1050) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ && 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> static void
stat_init(int ino64)
{
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -446,14 +470,18 @@ main(int argc, char *argv[])
</span> assert(S_ISLNK(get_mode(0)) && "lstatx_np expected symlink");
check_copy(0, 1);
<span style='display:block; white-space:pre;background:#ffe0e0;'>- if (verbose) printf(" testing 'fstatx_np'\n");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- /* Use fopen() to steer clear of open()/close() variant issues. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- assert((fp = fopen(source_link, "r")) != NULL && "open of source failed");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- stat_init(0);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- stat_err = fstatx_np(fileno(fp), &stat_buf.s.s, fsec);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if (check_err("fstatx_np")) return 1;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- assert(S_ISREG(get_mode(0)) && "fstat expected regular file");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- check_copy(0, 0);
</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(" testing 'fstatx_np'\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Use fopen() to steer clear of open()/close() variant issues. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert((fp = fopen(source_link, "r")) != NULL && "open of source failed");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ stat_init(0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ stat_err = fstatx_np(fileno(fp), &stat_buf.s.s, fsec);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (check_err("fstatx_np")) return 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert(S_ISREG(get_mode(0)) && "fstat expected regular file");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ check_copy(0, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (verbose) printf(" avoiding 'fstatx_np' due to Rosetta bug\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span>
#if __MPLS_HAVE_STAT64
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -478,14 +506,19 @@ main(int argc, char *argv[])
</span> assert(S_ISLNK(get_mode(1)) && "lstatx64_np expected symlink");
check_copy(1, 1);
<span style='display:block; white-space:pre;background:#ffe0e0;'>- if (verbose) printf(" testing 'fstatx64_np'\n");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- /* Use fopen() to steer clear of open()/close() variant issues. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- assert((fp = fopen(source_link, "r")) != NULL && "open of source failed");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- stat_init(1);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- stat_err = fstatx64_np(fileno(fp), &stat_buf.s64.s, fsec);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if (check_err("fstatx64_np")) return 1;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- assert(S_ISREG(get_mode(1)) && "fstatx64_np expected regular file");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- check_copy(1, 0);
</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(" testing 'fstatx64_np'\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Use fopen() to steer clear of open()/close() variant issues. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert((fp = fopen(source_link, "r")) != NULL && "open of source failed");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ stat_init(1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ stat_err = fstatx64_np(fileno(fp), &stat_buf.s64.s, fsec);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (check_err("fstatx64_np")) return 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert(S_ISREG(get_mode(1)) && "fstatx64_np expected regular file");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ check_copy(1, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (verbose) printf(" avoiding 'fstatx64_np' due to Rosetta bug\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> (void) fclose(fp);
#endif /* __MPLS_HAVE_STAT64 */
</pre><pre style='margin:0'>
</pre>