git: ee213339f4b2 - main - fts: address post-merge feedback on fts_set_test.c

From: Alan Somers <asomers_at_FreeBSD.org>
Date: Fri, 05 Jun 2026 15:09:48 UTC
The branch main has been updated by asomers:

URL: https://cgit.FreeBSD.org/src/commit/?id=ee213339f4b21782cd1b44086ff9b7fe1fd682c5

commit ee213339f4b21782cd1b44086ff9b7fe1fd682c5
Author:     Jitendra Bhati <bhatijitendra2022@gmail.com>
AuthorDate: 2026-06-03 22:39:45 +0000
Commit:     Alan Somers <asomers@FreeBSD.org>
CommitDate: 2026-06-05 15:06:33 +0000

    fts: address post-merge feedback on fts_set_test.c
    
    Per review by des@:
    
    - Remove fts_check_debug() which has no effect in fts_set_test.c, and
      remove unused #include "fts_test.h"
    - Add errno = 0 before fts_read() so errno check is meaningful
    - Remove fts_lexical_compar where traversal order does not matter
    - Change int boolean flags to bool throughout
    - Use !saw_inside instead of saw_inside == false
    - Move fts_set_clientptr/fts_get_clientptr test inside fts_read()
      loop so the pointer is exercised during active traversal
    
    Fixes:          940142d6103 ("lib/libc/tests/gen: add fts_set() tests")
    Sponsored by:   Google LLC (GSoC 2026)
    Reviewed by:    des, asomers
    MFC after:      2 weeks
    Pull Request:   https://github.com/freebsd/freebsd-src/pull/2258
---
 lib/libc/tests/gen/fts_set_test.c | 61 ++++++++++++++++++++++-----------------
 1 file changed, 34 insertions(+), 27 deletions(-)

diff --git a/lib/libc/tests/gen/fts_set_test.c b/lib/libc/tests/gen/fts_set_test.c
index 340af648c472..26cca82101a6 100644
--- a/lib/libc/tests/gen/fts_set_test.c
+++ b/lib/libc/tests/gen/fts_set_test.c
@@ -22,8 +22,6 @@
 
 #include <atf-c.h>
 
-#include "fts_test.h"
-
 /*
  * fts_set with invalid options must return non-zero with EINVAL.
  * Note: fts_set returns 1 (not -1) on error.
@@ -68,11 +66,10 @@ ATF_TC_BODY(again, tc)
 	ATF_REQUIRE_EQ(0, mkdir("dir", 0755));
 	ATF_REQUIRE_EQ(0, close(creat("dir/file", 0644)));
 
-	ATF_REQUIRE((fts = fts_open(paths, FTS_PHYSICAL,
-	    fts_lexical_compar)) != NULL);
+	ATF_REQUIRE((fts = fts_open(paths, FTS_PHYSICAL, NULL)) != NULL);
 
 	revisit_count = 0;
-	while ((ent = fts_read(fts)) != NULL) {
+	for (errno = 0; (ent = fts_read(fts)) != NULL; errno = 0) {
 		if (ent->fts_info == FTS_F && revisit_count == 0) {
 			ATF_REQUIRE_EQ_MSG(0,
 			    fts_set(fts, ent, FTS_AGAIN),
@@ -142,25 +139,24 @@ ATF_TC_BODY(follow_symlink_to_file, tc)
 	char *paths[] = { "dir", NULL };
 	FTS *fts;
 	FTSENT *ent;
-	int followed;
+	bool followed;
 
 	ATF_REQUIRE_EQ(0, mkdir("dir", 0755));
 	ATF_REQUIRE_EQ(0, close(creat("dir/target", 0644)));
 	ATF_REQUIRE_EQ(0, symlink("target", "dir/link"));
 
-	ATF_REQUIRE((fts = fts_open(paths, FTS_PHYSICAL,
-	    fts_lexical_compar)) != NULL);
+	ATF_REQUIRE((fts = fts_open(paths, FTS_PHYSICAL, NULL)) != NULL);
 
-	followed = 0;
+	followed = false;
 	while ((ent = fts_read(fts)) != NULL) {
 		if (ent->fts_info == FTS_SL &&
 		    strcmp(ent->fts_name, "link") == 0)
 			ATF_REQUIRE_EQ(0, fts_set(fts, ent, FTS_FOLLOW));
 		else if (ent->fts_info == FTS_F &&
 		    strcmp(ent->fts_name, "link") == 0)
-			followed = 1;
+			followed = true;
 	}
-	ATF_CHECK_MSG(followed != 0,
+	ATF_CHECK_MSG(followed,
 	    "FTS_FOLLOW on symlink-to-file must yield FTS_F");
 
 	ATF_REQUIRE_EQ_MSG(0, fts_close(fts), "fts_close(): %m");
@@ -181,17 +177,16 @@ ATF_TC_BODY(follow_symlink_to_dir, tc)
 	char *paths[] = { "dir", NULL };
 	FTS *fts;
 	FTSENT *ent;
-	int saw_inside;
+	bool saw_inside;
 
 	ATF_REQUIRE_EQ(0, mkdir("dir", 0755));
 	ATF_REQUIRE_EQ(0, mkdir("dir/real", 0755));
 	ATF_REQUIRE_EQ(0, close(creat("dir/real/inside", 0644)));
 	ATF_REQUIRE_EQ(0, symlink("real", "dir/link"));
 
-	ATF_REQUIRE((fts = fts_open(paths, FTS_PHYSICAL,
-	    fts_lexical_compar)) != NULL);
+	ATF_REQUIRE((fts = fts_open(paths, FTS_PHYSICAL, NULL)) != NULL);
 
-	saw_inside = 0;
+	saw_inside = false;
 	while ((ent = fts_read(fts)) != NULL) {
 		if (ent->fts_info == FTS_SL &&
 		    strcmp(ent->fts_name, "link") == 0)
@@ -199,9 +194,9 @@ ATF_TC_BODY(follow_symlink_to_dir, tc)
 		if (ent->fts_info == FTS_F &&
 		    strcmp(ent->fts_name, "inside") == 0 &&
 		    strcmp(ent->fts_path, "dir/link/inside") == 0)
-		    saw_inside = 1;
+		    saw_inside = true;
 	}
-	ATF_CHECK_MSG(saw_inside != 0,
+	ATF_CHECK_MSG(saw_inside,
 	    "FTS_FOLLOW on symlink-to-dir should descend and visit 'inside'");
 
 	ATF_REQUIRE_EQ_MSG(0, fts_close(fts), "fts_close(): %m");
@@ -259,25 +254,24 @@ ATF_TC_BODY(skip, tc)
 	char *paths[] = { "dir", NULL };
 	FTS *fts;
 	FTSENT *ent;
-	int saw_inside;
+	bool saw_inside;
 
 	ATF_REQUIRE_EQ(0, mkdir("dir", 0755));
 	ATF_REQUIRE_EQ(0, mkdir("dir/skip_me", 0755));
 	ATF_REQUIRE_EQ(0, close(creat("dir/skip_me/inside", 0644)));
 	ATF_REQUIRE_EQ(0, close(creat("dir/sibling", 0644)));
 
-	ATF_REQUIRE((fts = fts_open(paths, FTS_PHYSICAL,
-	    fts_lexical_compar)) != NULL);
+	ATF_REQUIRE((fts = fts_open(paths, FTS_PHYSICAL, NULL)) != NULL);
 
-	saw_inside = 0;
+	saw_inside = false;
 	while ((ent = fts_read(fts)) != NULL) {
 		if (ent->fts_info == FTS_D &&
 		    strcmp(ent->fts_name, "skip_me") == 0)
 			ATF_REQUIRE_EQ(0, fts_set(fts, ent, FTS_SKIP));
 		if (strcmp(ent->fts_name, "inside") == 0)
-			saw_inside = 1;
+			saw_inside = true;
 	}
-	ATF_CHECK_MSG(saw_inside == 0,
+	ATF_CHECK_MSG(!saw_inside,
 	    "FTS_SKIP: 'inside' must not have been visited");
 
 	ATF_REQUIRE_EQ_MSG(0, fts_close(fts), "fts_close(): %m");
@@ -295,18 +289,32 @@ ATF_TC_HEAD(clientptr_roundtrip, tc)
 }
 ATF_TC_BODY(clientptr_roundtrip, tc)
 {
-	char *paths[] = { ".", NULL };
+	char *paths[] = { "dir", NULL };
 	FTS *fts;
+	FTSENT *ent;
 	int value = 42;
 
+	ATF_REQUIRE_EQ(0, mkdir("dir", 0755));
+	ATF_REQUIRE_EQ(0, close(creat("dir/file", 0644)));
+
 	ATF_REQUIRE((fts = fts_open(paths, FTS_PHYSICAL, NULL)) != NULL);
 
+	/* Initially NULL. */
 	ATF_CHECK_EQ(NULL, fts_get_clientptr(fts));
 
 	fts_set_clientptr(fts, &value);
-	ATF_CHECK_EQ_MSG(&value, fts_get_clientptr(fts),
-	    "fts_get_clientptr did not return the stored pointer");
 
+	while ((ent = fts_read(fts)) != NULL) {
+		/*
+		 * Verify the pointer is accessible and correct
+		 * while traversal is active.
+		 */
+		ATF_CHECK_EQ_MSG(&value, fts_get_clientptr(fts),
+		    "fts_get_clientptr did not return the stored pointer "
+		    "for entry '%s'", ent->fts_name);
+	}
+
+	/* Overwrite with NULL, verify. */
 	fts_set_clientptr(fts, NULL);
 	ATF_CHECK_EQ(NULL, fts_get_clientptr(fts));
 
@@ -346,7 +354,6 @@ ATF_TC_BODY(get_stream_backpointer, tc)
 
 ATF_TP_ADD_TCS(tp)
 {
-	fts_check_debug();
 	ATF_TP_ADD_TC(tp, invalid_options);
 	ATF_TP_ADD_TC(tp, again);
 	ATF_TP_ADD_TC(tp, again_consecutive);