<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/d546d8ad537ed152740566caa8fc2d303940d2c9">https://github.com/macports/macports-legacy-support/commit/d546d8ad537ed152740566caa8fc2d303940d2c9</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit d546d8ad537ed152740566caa8fc2d303940d2c9
</span>Author: Fred Wright <fw@fwright.net>
AuthorDate: Wed Sep 25 15:19:12 2024 -0700

<span style='display:block; white-space:pre;color:#404040;'>    Add test for scandir() 'compar' type.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    This tests for the pointer-type mismatch issue with the scandir()
</span><span style='display:block; white-space:pre;color:#404040;'>    'compar' arg.  There are two versions, one verifying the expected old
</span><span style='display:block; white-space:pre;color:#404040;'>    behavior, and another verifying the fix.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    See: https://trac.macports.org/ticket/70702
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Also adds alphasort() and scandir() to the darwin_c 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;'>    Fails or gets warning on <10.8 without fix.  Passes with fix.
</span>---
 Makefile                 |  3 ++
 xtest/test_darwin_c.c    |  2 ++
 xtest/test_scandir.c     | 92 ++++++++++++++++++++++++++++++++++++++++++++++++
 xtest/test_scandir_old.c |  7 ++++
 4 files changed, 104 insertions(+)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/Makefile b/Makefile
</span><span style='display:block; white-space:pre;color:#808080;'>index 4da1aa1..caa7bc1 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/Makefile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/Makefile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -380,6 +380,9 @@ $(XTESTNAMEPREFIX)darwin_c_199309.o: $(XTESTNAMEPREFIX)darwin_c.c
</span> $(XTESTNAMEPREFIX)darwin_c_200809.o: $(XTESTNAMEPREFIX)darwin_c.c
 $(XTESTNAMEPREFIX)darwin_c_full.o: $(XTESTNAMEPREFIX)darwin_c.c
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+# The scandir_old test includes the basic "scandir" source
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+$(XTESTNAMEPREFIX)scandir_old.o: $(XTESTNAMEPREFIX)scandir.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> # Provide a target for all "darwin_c" tests
 $(XTESTRUNPREFIX)darwin_c_all: $(DARWINRUNS)
 
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/xtest/test_darwin_c.c b/xtest/test_darwin_c.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 70aca67..b2b228d 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/xtest/test_darwin_c.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/xtest/test_darwin_c.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -51,6 +51,8 @@
</span> #include <dirent.h>
 #if __DARWIN_C_LEVEL < 200809L
 int fdopendir = 0;
<span style='display:block; white-space:pre;background:#e0ffe0;'>+int alphasort = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int scandir = 0;
</span> #endif /* __DARWIN_C_LEVEL < 200809L */
 
 /* stdio.h */
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/xtest/test_scandir.c b/xtest/test_scandir.c
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 0000000..7197fd5
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/xtest/test_scandir.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,92 @@
</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;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * This tests type-related issues with scandir().  It does not perform
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * any functional tests, since the real function is never provided by
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * legacy-support.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Any errors are in the form of compiler warnings about type mismatches.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * These only cause actual errors with -Werror or a picky compiler.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * The nominal runtime test here is just a dummy which always succeeds.
</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;'>+/* Get the SDK version, since it's relevant to the issue being tested. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <_macports_extras/sdkversion.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Enable the compatibility wrapper by default. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#ifndef _MACPORTS_LEGACY_COMPATIBLE_SCANDIR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define _MACPORTS_LEGACY_COMPATIBLE_SCANDIR 1
</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;'>+#include <dirent.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <libgen.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 <stdio.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Determine whether the old or new type of the 'compar' func is in effect. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if !_MACPORTS_LEGACY_COMPATIBLE_SCANDIR && __MPLS_SDK_MAJOR < 1080
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define OLD_COMPAR 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define OLD_COMPAR 0
</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;'>+/* Dummy 'compar' function of expected type */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if OLD_COMPAR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+mysort(const void *d1, const void *d2)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  (void) d1; (void) d2;
</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;'>+#else /* !OLD_COMPAR */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+mysort(const struct dirent **d1, const struct dirent **d2)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  (void) d1; (void) d2;
</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;'>+#endif /* !OLD_COMPAR */
</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;'>+ * Function to theoretically call scandir() (not actually invoked).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * This is extern to avoid being optimized out, and tests the return
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * values to avoid the calls being optimized out.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int test_scandir(void);  /* Avoid missing-prototype warning. */
</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;'>+test_scandir(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  struct dirent **names;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (scandir(".", &names, NULL, alphasort)) return -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (scandir(".", &names, NULL, mysort)) return -1;
</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;'>+/* Also make sure we can take pointers to the possibly wrapped functions. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void *scandir_p = &scandir;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void *alphasort_p = &alphasort;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Dummy runtime test */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+main(int argc, char *argv[])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  (void) argc;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  printf("%s passed.\n", basename(argv[0]));
</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;color:#808080;'>diff --git a/xtest/test_scandir_old.c b/xtest/test_scandir_old.c
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 0000000..94f41ec
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/xtest/test_scandir_old.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Version of test_scandir with _MACPORTS_LEGACY_COMPATIBLE_SCANDIR disabled.
</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 _MACPORTS_LEGACY_COMPATIBLE_SCANDIR 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "test_scandir.c"
</span></pre><pre style='margin:0'>

</pre>