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

<span style='display:block; white-space:pre;color:#404040;'>    Fix sysctl()/sysctlbyname() for boottime on 64-bit <10.6.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    This fixes the struct timeval mismatch in these cases - see the
</span><span style='display:block; white-space:pre;color:#404040;'>    comments for more details.
</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 tests on all platforms.
</span>---
 include/MacportsLegacySupport.h |   4 ++
 src/sysctl.c                    | 140 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 144 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 d87e6e5..089addd 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;'>@@ -172,6 +172,10 @@
</span> #define __MPLS_SDK_SUPPORT_TIMESPEC_GET__     (__MPLS_SDK_MAJOR < 101500)
 #define __MPLS_LIB_SUPPORT_TIMESPEC_GET__     (__MPLS_TARGET_OSVER < 101500)
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Fix bugs in sysctl() and sysctlbyname() for boottime */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define __MPLS_LIB_FIX_64BIT_BOOTTIME__       (__MPLS_TARGET_OSVER < 1060 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                               && __MPLS_64BIT)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> /* "at" calls, including fdopendir */
 #define __MPLS_SDK_SUPPORT_ATCALLS__          (__MPLS_SDK_MAJOR < 101000)
 #define __MPLS_LIB_SUPPORT_ATCALLS__          (__MPLS_TARGET_OSVER < 101000)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/sysctl.c b/src/sysctl.c
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 0000000..0f012c4
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/sysctl.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,140 @@
</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_64BIT_BOOTTIME__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <dlfcn.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stddef.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stdlib.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <string.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><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/time.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "compiler.h"
</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;'>+ * Under OS <10.6, the returned struct timeval for boottime is always based on
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * the kernel's 32-bit time_t, even with a 64-bit userspace that expects
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * the 64-bit time_t version of struct timeval.  This error happens to be
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * somewhat benign on little-endian machines, but results in complete garbage
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * on big-endian machines (ppc64).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * To fix this, we detect the misbehavior by observing the incorrect
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * length, and reformat the data appropriately.
</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;'>+typedef struct timeval timeval_t;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+typedef struct tv32_s {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  uint32_t tv_sec;  /* Unsigned to get past 2038 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  int32_t  tv_usec;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} tv32_t;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* See if we got the wrong boottime format, and fix it if so */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+fix_boottime(timeval_t *oldp, size_t *oldlenp, size_t origlen)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  tv32_t tv32;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  /* If we wanted a timeval and got a tv32 ... */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (oldp && origlen >= sizeof(*oldp) 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      && *oldlenp == sizeof(tv32_t) && sizeof(tv32_t) < sizeof(*oldp)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    tv32 = *((tv32_t *) oldp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    oldp->tv_sec = tv32.tv_sec;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    oldp->tv_usec = tv32.tv_usec;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    *oldlenp = sizeof(*oldp);
</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;'>+typedef int (sysctl_fn_t)(int *name, u_int namelen, void *oldp, size_t *oldlenp,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             void *newp, size_t newlen);
</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;'>+sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       void *newp, size_t newlen)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  int ret;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  size_t origlen;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  static sysctl_fn_t *os_sysctl = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (MPLS_SLOWPATH(!os_sysctl)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    os_sysctl = dlsym(RTLD_NEXT, "sysctl");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    /* Something's badly broken if this fails */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if (!os_sysctl) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        abort();
</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;'>+  /* Capture originally specified length */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  origlen = oldlenp ? *oldlenp : 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  /* Do the call; return error on failure */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  ret = (*os_sysctl)(name, namelen, oldp, oldlenp, newp, newlen);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (ret) return ret;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  /* If we just obtained boottime, possibly correct it */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (namelen >=2 && name[0] == CTL_KERN && name[1] == KERN_BOOTTIME) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    fix_boottime(oldp, oldlenp, origlen);
</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;'>+  return 0;
</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;'>+ * The same boottime issue also applies to sysctlbyname().  We apply
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * the same fix to that call.  This does not correct the absence of
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * this item on 10.4.
</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;'>+typedef int (sysctlbyname_fn_t)(const char *name, void *oldp, size_t *oldlenp,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             void *newp, size_t newlen);
</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;'>+sysctlbyname(const char *name, void *oldp, size_t *oldlenp,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       void *newp, size_t newlen)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  int ret;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  size_t origlen;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  static sysctlbyname_fn_t *os_sysctlbyname = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (MPLS_SLOWPATH(!os_sysctlbyname)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    os_sysctlbyname = dlsym(RTLD_NEXT, "sysctlbyname");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    /* Something's badly broken if this fails */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if (!os_sysctlbyname) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        abort();
</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;'>+  /* Capture originally specified length */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  origlen = oldlenp ? *oldlenp : 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  /* Do the call; return error on failure */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  ret = (*os_sysctlbyname)(name, oldp, oldlenp, newp, newlen);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (ret) return ret;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  /* If we just obtained boottime, possibly correct it */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (!strcmp(name, "kern.boottime")) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    fix_boottime(oldp, oldlenp, origlen);
</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;'>+  return 0;
</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_FIX_64BIT_BOOTTIME__ */
</span></pre><pre style='margin:0'>

</pre>