From d094e05ea596145aa4362cf957f9d99663d4a2e3 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Wed, 18 Jun 2025 13:04:12 -0700 Subject: [PATCH] diff-no-index: do not reference .d_type member of struct dirent Some platforms like AIX lack .d_type member in "struct dirent"; use the DTYPE(e) macro instead of a direct reference to e->d_type and when it yields DT_UNKNOWN, find the real type with get_dtype(). Signed-off-by: Junio C Hamano --- diff-no-index.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/diff-no-index.c b/diff-no-index.c index 4aeeb98cfa..88ae4cee56 100644 --- a/diff-no-index.c +++ b/diff-no-index.c @@ -41,12 +41,24 @@ static int read_directory_contents(const char *path, struct string_list *list, while ((e = readdir_skip_dot_and_dotdot(dir))) { if (pathspec) { + int is_dir = 0; + strbuf_setlen(&match, len); strbuf_addstr(&match, e->d_name); + if (NOT_CONSTANT(DTYPE(e)) != DT_UNKNOWN) { + is_dir = (DTYPE(e) == DT_DIR); + } else { + struct strbuf pathbuf = STRBUF_INIT; + + strbuf_addstr(&pathbuf, path); + strbuf_complete(&pathbuf, '/'); + is_dir = get_dtype(e, &pathbuf, 0) == DT_DIR; + strbuf_release(&pathbuf); + } if (!match_leading_pathspec(NULL, pathspec, match.buf, match.len, - 0, NULL, e->d_type == DT_DIR ? 1 : 0)) + 0, NULL, is_dir)) continue; } -- 2.39.5