<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/5ab3936815167768fe42f848618e67d637b5e895">https://github.com/macports/macports-legacy-support/commit/5ab3936815167768fe42f848618e67d637b5e895</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 5ab3936815167768fe42f848618e67d637b5e895
</span>Author: Fred Wright <fw@fwright.net>
AuthorDate: Thu Nov 28 18:36:48 2024 -0800
<span style='display:block; white-space:pre;color:#404040;'> Add support for 64-bit-inode *stat*() on 10.4.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> This adds support for some 64-bit-inode function variants on 10.4.
</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;'> Builds and passes tests on all platforms.
</span>---
src/statxx.c | 131 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 131 insertions(+)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/statxx.c b/src/statxx.c
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 0000000..e588209
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/statxx.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,131 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 2024 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_SUPPORT_STAT64__
</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 provides definitions for some 64-bit-inode function variants on 10.4.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * For the *stat() functions, this simply involves translating the result of
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * the 32-bit-inode variant.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Providing a similar capability for directory-related functions would be
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * much more difficult, since the differently-formatted dirent struct is
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * provided via a pointer to an internal buffer, rather than one provided
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * by the caller. Hence we don't do anything about those, for now.
</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;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Cause our own refs to always use the 32-bit-inode variants. This
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * wouldn't work on arm64, but is known to work on all platforms where
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * our implementations are needed. It means that the referenced function
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * names are always the "unadorned" versions, except when we explicitly
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * add a suffix.
</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 _DARWIN_NO_64_BIT_INODE 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sys/stat.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Make sure we have "struct sta64" */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if !__MPLS_HAVE_STAT64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+struct stat64 __DARWIN_STRUCT_STAT64;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif /* !__MPLS_HAVE_STAT64 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Do a field-by-field copy from ino32 stat to ino64 stat. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Also provide passthrough for return value. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+convert_stat(const struct stat *in, struct stat64 *out, int status)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ out->st_dev = in->st_dev;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ out->st_mode = in->st_mode;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ out->st_nlink = in->st_nlink;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ out->st_ino = in->st_ino; /* Possible but unlikely overflow here */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ out->st_uid = in->st_uid;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ out->st_gid = in->st_gid;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ out->st_rdev = in->st_rdev;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ out->st_atimespec = in->st_atimespec;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ out->st_mtimespec = in->st_mtimespec;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ out->st_ctimespec = in->st_ctimespec;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* The ino32 stat doesn't have birthtime, so use MIN(ctime, mtime) */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (in->st_ctimespec.tv_sec < in->st_mtimespec.tv_sec
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ || (in->st_ctimespec.tv_sec == in->st_mtimespec.tv_sec
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ && in->st_ctimespec.tv_nsec < in->st_mtimespec.tv_nsec)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ out->st_birthtimespec = in->st_ctimespec;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ out->st_birthtimespec = in->st_mtimespec;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ out->st_size = in->st_size;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ out->st_blocks = in->st_blocks;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ out->st_blksize = in->st_blksize;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ out->st_flags = in->st_flags;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ out->st_gen = in->st_gen;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ out->st_lspare = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ out->st_qspare[0] = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ out->st_qspare[1] = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return status;
</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;'>+stat$INODE64(const char *__restrict path, struct stat64 *buf)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct stat stbuf;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return convert_stat(&stbuf, buf, stat(path, &stbuf));
</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;'>+lstat$INODE64(const char *__restrict path, struct stat64 *buf)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct stat stbuf;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return convert_stat(&stbuf, buf, lstat(path, &stbuf));
</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;'>+fstat$INODE64(int fildes, struct stat64 *buf)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct stat stbuf;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return convert_stat(&stbuf, buf, fstat(fildes, &stbuf));
</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_HAVE_STAT64
</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;'>+stat64(const char *__restrict path, struct stat64 *buf)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct stat stbuf;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return convert_stat(&stbuf, buf, stat(path, &stbuf));
</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;'>+lstat64(const char *__restrict path, struct stat64 *buf)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct stat stbuf;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return convert_stat(&stbuf, buf, lstat(path, &stbuf));
</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;'>+fstat64(int fildes, struct stat64 *buf)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct stat stbuf;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return convert_stat(&stbuf, buf, fstat(fildes, &stbuf));
</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_HAVE_STAT64 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif /* __MPLS_LIB_SUPPORT_STAT64__*/
</span></pre><pre style='margin:0'>
</pre>