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

<span style='display:block; white-space:pre;color:#404040;'>    test_attrlist: Add nobuf test cases.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    This adds additional test cases where the length of the attribute
</span><span style='display:block; white-space:pre;color:#404040;'>    buffer is zero, with and without requested attributes.  This illustrated
</span><span style='display:block; white-space:pre;color:#404040;'>    a bug in [f]setattrlist() in 10.5-10.7 (prior to its fix).
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Also adds a nonposix variant.
</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 on all platforms, with fix present.
</span>---
 Makefile                      |  11 +++-
 test/test_attrlist.c          | 145 ++++++++++++++++++++++++++++++++++++++----
 test/test_attrlist_nonposix.c |  25 ++++++++
 3 files changed, 166 insertions(+), 15 deletions(-)

<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 f4c674f..297bfe6 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;'>@@ -197,7 +197,10 @@ PACKETRUNS      := $(patsubst \
</span>                      $(TESTNAMEPREFIX)%.c,$(TESTRUNPREFIX)%,$(PACKETSRCS_C))
 STPNCHKSRCS_C    := $(wildcard $(TESTNAMEPREFIX)stpncpy_chk*.c)
 STPNCHKRUNS      := $(patsubst \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                     $(TESTNAMEPREFIX)%.c,$(TESTRUNPREFIX)%,$(STPNCHKSRCS_C))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                      $(TESTNAMEPREFIX)%.c,$(TESTRUNPREFIX)%,$(STPNCHKSRCS_C))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ATTRLISTSRCS_C   := $(wildcard $(TESTNAMEPREFIX)attrlist*.c)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ATTRLISTRUNS     := $(patsubst \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                      $(TESTNAMEPREFIX)%.c,$(TESTRUNPREFIX)%,$(ATTRLISTSRCS_C))
</span> 
 # Tests that are only run manually
 MANTESTDIR       = manual_tests
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -483,6 +486,9 @@ $(XTESTBINPREFIX)allheaders_199309_ds.o: $(XTESTNAMEPREFIX)allheaders.c
</span> $(XTESTBINPREFIX)allheaders_200809_ds.o: $(XTESTNAMEPREFIX)allheaders.c
 $(XTESTBINPREFIX)allheaders_full_ds.o: $(XTESTNAMEPREFIX)allheaders.c
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+# The "attrlist_nonposix" test includes the attrlist test source
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+$(TESTNAMEPREFIX)attrlist_nonposix.o: $(TESTNAMEPREFIX)attrlist.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;background:#e0e0e0;'>@@ -510,6 +516,9 @@ $(TESTRUNPREFIX)packet_all: $(PACKETRUNS)
</span> # Provide a target for all "allheaders" tests
 $(XTESTRUNPREFIX)allheaders_all: $(ALLHDRRUNS)
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+# Provide a target for all "attrlist" tests
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+$(TESTRUNPREFIX)attrlist_all: $(ATTRLISTRUNS)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> install: install-headers install-lib
 
 install-headers:
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/test/test_attrlist.c b/test/test_attrlist.c
</span><span style='display:block; white-space:pre;color:#808080;'>index a669eb9..1c1e7ca 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/test/test_attrlist.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/test/test_attrlist.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -17,9 +17,8 @@
</span> /*
  * This provides some simple tests of the attrlist functions, both the
  * traditional set/get flavor, and the newer fget/fset flavor.  Tests of
<span style='display:block; white-space:pre;background:#ffe0e0;'>- * "null" cases (no bits set) are included, since an older implementation
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- * seemed to think that special handling was needed for them, though these
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- * tests indicate otherwise.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * "null" cases (no bits set) and "nobuf" cases (zero-length buffer) are
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * included, since those sometimes cause trouble.
</span>  */
 
 #include <errno.h>
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -68,7 +67,7 @@ set_tc(FInfoAttrBuf_t *ab)
</span> int
 main(int argc, char *argv[])
 {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-  int verbose = 0, ret = 0, fd = -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  int verbose = 0, ret = 0, fd = -1, err;
</span>   char *progname = basename(argv[0]);
   pid_t pid = getpid();
   char tpath[MAXPATHLEN];
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -90,7 +89,8 @@ main(int argc, char *argv[])
</span>     }
 
     if (verbose) printf("  testing 'getattrlist'\n");
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    al.commonattr  = ATTR_CMN_OBJTYPE | ATTR_CMN_FNDRINFO;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    al.commonattr = ATTR_CMN_OBJTYPE | ATTR_CMN_FNDRINFO;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    ab.length = -1;
</span>     if (getattrlist(tpath, &al, &ab, sizeof(ab), 0)) {
       printf("  *** getattrlist() for '%s' failed: %s\n",
              tpath, strerror(errno));
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -107,7 +107,7 @@ main(int argc, char *argv[])
</span>       }
 
       if (verbose) printf("  testing 'setattrlist'\n");
<span style='display:block; white-space:pre;background:#ffe0e0;'>-      al.commonattr  = ATTR_CMN_FNDRINFO;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      al.commonattr = ATTR_CMN_FNDRINFO;
</span>       if (set_tc(&ab)) {
         ret = 1;
         break;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -117,10 +117,31 @@ main(int argc, char *argv[])
</span>                tpath, strerror(errno));
         ret = 1;
       } 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      if (verbose) printf("  testing nobuf 'setattrlist'\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      al.commonattr = ATTR_CMN_FNDRINFO;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      if (set_tc(&ab)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ret = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      err = setattrlist(tpath, &al, &ab, 0, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      if (err) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if (errno == ENOMEM || errno == EINVAL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+          if (verbose) printf("    failed as expected: %s\n", strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+          printf("  *** nobuf setattrlist() for '%s' failed: %s\n",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 tpath, strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+          ret = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        printf("  *** nobuf setattrlist() unexpectedly succeeded\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ret = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      }
</span>     }
 
     if (verbose) printf("  testing null 'getattrlist'\n");
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    al.commonattr  = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    al.commonattr = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    ab.length = -1;
</span>     if (getattrlist(tpath, &al, &ab, sizeof(ab), 0)) {
       printf("  *** null getattrlist() for '%s' failed: %s\n",
              tpath, strerror(errno));
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -134,8 +155,37 @@ main(int argc, char *argv[])
</span>       }
     }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    if (verbose) printf("  testing nobuf 'getattrlist'\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    al.commonattr = ATTR_CMN_OBJTYPE | ATTR_CMN_FNDRINFO;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    ab.length = -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    /* Silent truncation means "success" */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    err = getattrlist(tpath, &al, &ab, 0, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if (err) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      if (errno == EINVAL || errno == ERANGE) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if (verbose) printf("    failed as expected: %s\n", strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        printf("  *** nobuf getattrlist() for '%s' failed: %s\n",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               tpath, strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ret = 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;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if (verbose) printf("  testing null/nobuf 'getattrlist'\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    al.commonattr = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    ab.length = -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    err = getattrlist(tpath, &al, &ab, 0, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if (err) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      if (errno == EINVAL || errno == ERANGE) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if (verbose) printf("    failed as expected: %s\n", strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        printf("  *** null/nobuf getattrlist() for '%s' failed: %s\n",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               tpath, strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ret = 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;'>+
</span>     if (verbose) printf("  testing null 'setattrlist'\n");
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    al.commonattr  = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    al.commonattr = 0;
</span>     ab.length = sizeof(ab.length);
     if (setattrlist(tpath, &al, &ab, sizeof(ab), 0)) {
       printf("  *** null setattrlist() for '%s' failed: %s\n",
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -144,7 +194,7 @@ main(int argc, char *argv[])
</span>     }
 
     if (verbose) printf("  testing null/zero 'setattrlist'\n");
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    al.commonattr  = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    al.commonattr = 0;
</span>     ab.length = 0;
     if (setattrlist(tpath, &al, &ab, sizeof(ab), 0)) {
       printf("  *** null/zero setattrlist() for '%s' failed: %s\n",
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -152,8 +202,17 @@ main(int argc, char *argv[])
</span>       ret = 1;
     }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    if (verbose) printf("  testing null/nobuf 'setattrlist'\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    al.commonattr = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if (setattrlist(tpath, &al, &ab, 0, 0)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      printf("  *** null/nobuf setattrlist() for '%s' failed: %s\n",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             tpath, strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      ret = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span>     if (verbose) printf("  testing 'fgetattrlist'\n");
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    al.commonattr  = ATTR_CMN_OBJTYPE | ATTR_CMN_FNDRINFO;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    al.commonattr = ATTR_CMN_OBJTYPE | ATTR_CMN_FNDRINFO;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    ab.length = -1;
</span>     if (fgetattrlist(fd, &al, &ab, sizeof(ab), 0)) {
       printf("  *** fgetattrlist() for '%s' failed: %s\n",
              tpath, strerror(errno));
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -170,7 +229,7 @@ main(int argc, char *argv[])
</span>       }
 
       if (verbose) printf("  testing 'fsetattrlist'\n");
<span style='display:block; white-space:pre;background:#ffe0e0;'>-      al.commonattr  = ATTR_CMN_FNDRINFO;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      al.commonattr = ATTR_CMN_FNDRINFO;
</span>       if (set_tc(&ab)) {
         ret = 1;
         break;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -180,10 +239,31 @@ main(int argc, char *argv[])
</span>                tpath, strerror(errno));
         ret = 1;
       } 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      if (verbose) printf("  testing nobuf 'fsetattrlist'\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      al.commonattr = ATTR_CMN_FNDRINFO;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      if (set_tc(&ab)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ret = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      err = fsetattrlist(fd, &al, &ab, 0, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      if (err) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if (errno == ENOMEM || errno == EINVAL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+          if (verbose) printf("    failed as expected: %s\n", strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+          printf("  *** nobuf fsetattrlist() for '%s' failed: %s\n",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 tpath, strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+          ret = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        printf("  *** nobuf fsetattrlist() unexpectedly succeeded\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ret = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      }
</span>     }
 
     if (verbose) printf("  testing null 'fgetattrlist'\n");
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    al.commonattr  = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    al.commonattr = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    ab.length = -1;
</span>     if (fgetattrlist(fd, &al, &ab, sizeof(ab), 0)) {
       printf("  *** null fgetattrlist() for '%s' failed: %s\n",
              tpath, strerror(errno));
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -197,8 +277,37 @@ main(int argc, char *argv[])
</span>       }
     }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    if (verbose) printf("  testing nobuf 'fgetattrlist'\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    al.commonattr = ATTR_CMN_OBJTYPE | ATTR_CMN_FNDRINFO;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    ab.length = -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    /* Silent truncation means "success" */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    err = fgetattrlist(fd, &al, &ab, 0, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if (err) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      if (errno == EINVAL || errno == ERANGE) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if (verbose) printf("    failed as expected: %s\n", strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        printf("  *** nobuf fgetattrlist() for '%s' failed: %s\n",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               tpath, strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ret = 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;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if (verbose) printf("  testing null/nobuf 'fgetattrlist'\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    al.commonattr = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    ab.length = -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    err = fgetattrlist(fd, &al, &ab, 0, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if (err) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      if (errno == EINVAL || errno == ERANGE) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if (verbose) printf("    failed as expected: %s\n", strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        printf("  *** null/nobuf fgetattrlist() for '%s' failed: %s\n",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               tpath, strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ret = 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;'>+
</span>     if (verbose) printf("  testing null 'fsetattrlist'\n");
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    al.commonattr  = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    al.commonattr = 0;
</span>     ab.length = sizeof(ab.length);
     if (fsetattrlist(fd, &al, &ab, sizeof(ab), 0)) {
       printf("  *** null fsetattrlist() for '%s' failed: %s\n",
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -207,13 +316,21 @@ main(int argc, char *argv[])
</span>     }
 
     if (verbose) printf("  testing null/zero 'fsetattrlist'\n");
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    al.commonattr  = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    al.commonattr = 0;
</span>     ab.length = 0;
     if (fsetattrlist(fd, &al, &ab, sizeof(ab), 0)) {
       printf("  *** null/zero fsetattrlist() for '%s' failed: %s\n",
              tpath, strerror(errno));
       ret = 1;
     }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if (verbose) printf("  testing null/nobuf 'fsetattrlist'\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    al.commonattr = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if (fsetattrlist(fd, &al, &ab, 0, 0)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      printf("  *** null/nobuf fsetattrlist() for '%s' failed: %s\n",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             tpath, strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      ret = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span>   } while (0);
 
   if (fd >= 0) (void) close(fd);
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/test/test_attrlist_nonposix.c b/test/test_attrlist_nonposix.c
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 0000000..ac45e2e
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/test/test_attrlist_nonposix.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,25 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Version of test_realpath with non-POSIX semantics (32-bit only).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Attempting a 64-bit build with _NONSTD_SOURCE results in an error.
</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 defined(__LP64__) && __LP64__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <libgen.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;'>+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 is inapplicable.\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;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#else /* 32-bit */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define _NONSTD_SOURCE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "test_attrlist.c"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif /* 32-bit */
</span></pre><pre style='margin:0'>

</pre>