<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/b170e1e02efaf0920d2d2a9271ea6f3efda56624">https://github.com/macports/macports-legacy-support/commit/b170e1e02efaf0920d2d2a9271ea6f3efda56624</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit b170e1e02efaf0920d2d2a9271ea6f3efda56624
</span>Author: Fred Wright <fw@fwright.net>
AuthorDate: Sat Jul 5 13:19:07 2025 -0700

<span style='display:block; white-space:pre;color:#404040;'>    test_packet: Tolerate expected errors when fixes suppressed.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    When the option to suppress the packet timestamp fixes is used, don't
</span><span style='display:block; white-space:pre;color:#404040;'>    treat the expected failures as errors.  This allows the 'nofix' tests
</span><span style='display:block; white-space:pre;color:#404040;'>    to be included in the automatic tests.
</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;'>    Tests pass on all platforms.
</span>---
 manual_tests/libtest_packet_nofix.c |   2 -
 test/test_packet.c                  | 127 ++++++++++++++++++++++++++++++------
 2 files changed, 107 insertions(+), 22 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/manual_tests/libtest_packet_nofix.c b/manual_tests/libtest_packet_nofix.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 40f2252..8b5c8f3 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/manual_tests/libtest_packet_nofix.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/manual_tests/libtest_packet_nofix.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2,8 +2,6 @@
</span>  * Version of test_packet with CMSG fixes disabled.
  *
  * This provides a way to test the feature for disabling the fixes.
<span style='display:block; white-space:pre;background:#ffe0e0;'>- * Since it's only a manual test, we don't bother allowing the known
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- * failures to pass.
</span>  */
 
 #define _MACPORTS_LEGACY_DISABLE_CMSG_FIXES 1
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/test/test_packet.c b/test/test_packet.c
</span><span style='display:block; white-space:pre;color:#808080;'>index d46de5e..6d176ce 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/test/test_packet.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/test/test_packet.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -38,6 +38,88 @@
</span> 
 #include <mach/mach_time.h>
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+#define SYSCTL_OSVER_CLASS CTL_KERN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define SYSCTL_OSVER_ITEM  KERN_OSRELEASE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifdef __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define TARGET_OSVER __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define TARGET_OSVER 1040
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</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 we're disabling the packet timestamp fixes, arrange to let the expected
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * failures through.  This allows those tests to be included in the automatic
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * tests.
</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;'>+/* Cases of badness */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+typedef enum {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  ts_bad_noallow,  /* Not allowable error */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  ts_bad_tv,       /* Bad timestamp value */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  ts_bad_len,      /* Bad timestamp length */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  ts_bad_padding,  /* Unexpected timestamp padding */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} ts_bad_t;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if defined(_MACPORTS_LEGACY_DISABLE_CMSG_FIXES) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    && _MACPORTS_LEGACY_DISABLE_CMSG_FIXES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if TARGET_OSVER < 1060 && (defined(__x86_64__) || defined(__ppc64__))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+allow_error(ts_bad_t errtype)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  /* Bad padding is 10.5 only */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (TARGET_OSVER < 1050 && errtype == ts_bad_padding) return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  return 1;
</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;'>+#elif defined(__ppc__) /* Possibly Rosetta */
</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 (non-ppc only) */
</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><span style='display:block; white-space:pre;background:#e0ffe0;'>+static int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+allow_error(ts_bad_t errtype)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  int native;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  size_t native_sz = sizeof(native);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (errtype != ts_bad_tv) return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (sysctlbyname(SYSCTL_NATIVE, &native, &native_sz, NULL, 0) < 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    /* If sysctl failed, must be real ppc. */
</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;'>+  if (native) return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  return 1;
</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;'>+#else /* Nothing allowable */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+allow_error(ts_bad_t errtype)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  (void) errtype;
</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 /* Nothing allowable */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#else /* !_MACPORTS_LEGACY_DISABLE_CMSG_FIXES */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+allow_error(ts_bad_t errtype)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  (void) errtype;
</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 /* !_MACPORTS_LEGACY_DISABLE_CMSG_FIXES */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if TARGET_OSVER < 1050
</span> /*
  * If we're building for 10.4 with a later SDK, and testing an alternate
  * variant of recvmsg(), we may reference that variant of various other
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -47,8 +129,6 @@
</span>  * using the __asm() mechanism to point it to the basic version of the
  * function, and then defining a macro to substitute it for the local use.
  */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1050
</span> 
 int    __connect(int, const struct sockaddr *, socklen_t) __asm("_connect");
 #define connect __connect
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -59,10 +139,7 @@ ssize_t      __send(int, const void *, size_t, int) __asm("_send");
</span> int __close(int) __asm("_close");
 #define close __close
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-#endif /* 10.4 */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#define SYSCTL_OSVER_CLASS CTL_KERN
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#define SYSCTL_OSVER_ITEM  KERN_OSRELEASE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif /* TARGET_OSVER < 1050 */
</span> 
 #define CMSG_DATALEN(cmsg) ((uint8_t *) (cmsg) + (cmsg)->cmsg_len \
                            - (uint8_t *) CMSG_DATA(cmsg))
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -173,9 +250,7 @@ mach2ns(uint64_t mach_time)
</span>  * Rosetta 2.
  */
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 110000 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    && defined(__x86_64__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if TARGET_OSVER >= 110000 && defined(__x86_64__)
</span> 
 #include <sys/sysctl.h>
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -392,7 +467,7 @@ static int
</span> test_timestamp(const char *name, ts_type_t tstype, int sockopt, int scmtype,
                int verbose)
 {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-  int ret = 0, rret = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  int ret = 0, qret = 0, rret = 0;
</span>   const char *tsname = ts_type_names[tstype];
   const char *err = NULL;
   times_t times;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -467,17 +542,23 @@ test_timestamp(const char *name, ts_type_t tstype, int sockopt, int scmtype,
</span>   if (verbose) printf("    cmsg length = %d (%d+%d), level = %d, type = %d\n",
                       (int) cmsglen, hdrlen, datalen, cmsglvl, cmsgtype);
   if (ts_sizes[tstype] && datalen != ts_sizes[tstype]) {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    printf("    %s payload length %d != expected sizeof(%s) = %d\n",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           name, datalen, tsname, ts_sizes[tstype]);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    ret = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    qret |= allow_error(ts_bad_len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if (!qret || verbose) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      printf("    %s payload length %d != expected sizeof(%s) = %d\n",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             name, datalen, tsname, ts_sizes[tstype]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if (!qret) ret = 1;
</span>   }
   if (hdrlen > (int) sizeof(*cmsg)) {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    xdatap = (uint32_t *) (cbuf + sizeof(*cmsg));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    printf("    %s header padding:\n", name);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    while (xdatap < datap) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-      printf("     (%10u)\n", *xdatap++);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    qret |= allow_error(ts_bad_padding);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if (!qret || verbose) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      xdatap = (uint32_t *) (cbuf + sizeof(*cmsg));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      printf("    %s header padding:\n", name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      while (xdatap < datap) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        printf("     (%10u)\n", *xdatap++);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      }
</span>     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    ret = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if (!qret) ret = 1;
</span>   }
   if (verbose) {
     printf("    %s%spayload longwords:\n", tsname, tsname[0] ? " " : "");
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -505,8 +586,11 @@ test_timestamp(const char *name, ts_type_t tstype, int sockopt, int scmtype,
</span>   if (ts_getters[tstype]) {
     tsval = (*ts_getters[tstype])(cmsg);
     if (!tsval) {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-      printf("    %s provided invalid %s\n", name, tsname);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-      ret = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      qret |= allow_error(tstype == ts_tv ? ts_bad_tv : ts_bad_noallow);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      if (!qret || verbose) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        printf("    %s provided invalid %s\n", name, tsname);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      if (!qret) ret = 1;
</span>     } else {
       switch (tstype) {
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -538,6 +622,9 @@ test_timestamp(const char *name, ts_type_t tstype, int sockopt, int scmtype,
</span>   if (rret && !ret) {
     printf("      Ignoring errors caused by Rosetta 2 bug\n");
   }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (qret && !ret && verbose) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    printf("      Ignoring errors with suppressed fixes\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  }
</span> 
   return ret;
 }
</pre><pre style='margin:0'>

</pre>