[RFC i-g-t 2/5] lib/igt_dir_explorer: Add function to recursively read all files in a directory
Zbigniew Kempczyński
zbigniew.kempczynski at intel.com
Thu May 15 08:51:55 UTC 2025
On Wed, May 14, 2025 at 07:51:34PM +0200, Peter Senna Tschudin wrote:
> Introduces igt_dir_explorer_read_and_discard_all(), a function that
> performs a recursive scan of all files within a directory. Each file is
> read, and its content is discarded.
>
> This functionality is utilized in the following tests:
> - core_debugfs
> - core_debugfs_display_on_off
> - core_sysfs
>
> This addition enhances the ability to efficiently handle directory
> traversal and file processing in tests.
>
> Cc: marcin.bernatowicz at intel.com
> Cc: himanshu.girotra at intel.com
> Cc: aditya.chauhan at intel.com
> Cc: pravalika.gurram at intel.com
> Cc: sai.gowtham.ch at intel.com
> Cc: ramadevi.gandi at intel.com
> Cc: lucas.demarchi at intel.com
> Cc: rodrigo.vivi at intel.com
> Cc: kamil.konieczny at linux.intel.com
> Cc: katarzyna.piecielska at intel.com
> Signed-off-by: Peter Senna Tschudin <peter.senna at linux.intel.com>
> ---
> lib/igt_dir_explorer.c | 72 ++++++++++++++++++++++++++++++++++++++++++
> lib/igt_dir_explorer.h | 10 ++++++
> lib/meson.build | 1 +
> 3 files changed, 83 insertions(+)
> create mode 100644 lib/igt_dir_explorer.c
> create mode 100644 lib/igt_dir_explorer.h
>
> diff --git a/lib/igt_dir_explorer.c b/lib/igt_dir_explorer.c
> new file mode 100644
> index 000000000..d47e08535
> --- /dev/null
> +++ b/lib/igt_dir_explorer.c
> @@ -0,0 +1,72 @@
> +// SPDX-License-Identifier: MIT
> +/*
> + * Copyright © 2025 Intel Corporation
> + */
> +
> +#include <dirent.h>
> +#include <fcntl.h>
> +
> +#include "igt.h"
> +#include "igt_dir_explorer.h"
> +
> +void igt_dir_explorer_read_and_discard_all(int path_fd, int indent)
Just loose thought - if you're doing recursive directory traversal,
wouldn't be better to pass function (kind of callback) which would be
called for each file/dir entry? I mean single traversal code, and
multiple callbacks for different use cases.
--
Zbigniew
> +{
> + struct dirent *dirent;
> + DIR *dir;
> + char tabs[8];
> + int i;
> +
> + igt_assert(indent < sizeof(tabs) - 1);
> +
> + for (i = 0; i < indent; i++)
> + tabs[i] = '\t';
> + tabs[i] = '\0';
> +
> + dir = fdopendir(path_fd);
> + if (!dir)
> + return;
> +
> + while ((dirent = readdir(dir))) {
> + if (!strcmp(dirent->d_name, ".") ||
> + !strcmp(dirent->d_name, ".."))
> + continue;
> +
> + if (dirent->d_type == DT_DIR) {
> + int sub_fd;
> +
> + sub_fd = openat(path_fd, dirent->d_name,
> + O_RDONLY | O_DIRECTORY);
> + if (sub_fd < 0)
> + continue;
> +
> + igt_debug("%sEntering subdir %s\n", tabs, dirent->d_name);
> + igt_dir_explorer_read_and_discard_all(sub_fd, indent + 1);
> + close(sub_fd);
> + } else if (dirent->d_type == DT_REG) {
> + char buf[512];
> + int sub_fd;
> + ssize_t ret;
> +
> + igt_kmsg(KMSG_DEBUG "Reading file \"%s\"\n", dirent->d_name);
> + igt_debug("%sReading file \"%s\"\n", tabs, dirent->d_name);
> +
> + sub_fd = openat(path_fd, dirent->d_name, O_RDONLY | O_NONBLOCK);
> + if (sub_fd == -1) {
> + igt_debug("%sCould not open file \"%s\" with error: %m\n",
> + tabs, dirent->d_name);
> + continue;
> + }
> +
> + do {
> + ret = read(sub_fd, buf, sizeof(buf));
> + } while (ret == sizeof(buf));
> +
> + if (ret == -1)
> + igt_debug("%sCould not read file \"%s\" with error: %m\n",
> + tabs, dirent->d_name);
> +
> + close(sub_fd);
> + }
> + }
> + closedir(dir);
> +}
> diff --git a/lib/igt_dir_explorer.h b/lib/igt_dir_explorer.h
> new file mode 100644
> index 000000000..b767928a5
> --- /dev/null
> +++ b/lib/igt_dir_explorer.h
> @@ -0,0 +1,10 @@
> +/* SPDX-License-Identifier: MIT
> + * Copyright © 2024 Intel Corporation
> + */
> +
> +#ifndef IGT_DIR_EXPLORER_H
> +#define IGT_DIR_EXPLORER_H
> +
> +void igt_dir_explorer_read_and_discard_all(int path_fd, int indent);
> +
> +#endif /* IGT_DIR_EXPLORER_H */
> diff --git a/lib/meson.build b/lib/meson.build
> index b58976a43..f98265100 100644
> --- a/lib/meson.build
> +++ b/lib/meson.build
> @@ -90,6 +90,7 @@ lib_sources = [
> 'igt_kms.c',
> 'igt_fb.c',
> 'igt_core.c',
> + 'igt_dir_explorer.c',
> 'igt_draw.c',
> 'igt_list.c',
> 'igt_map.c',
> --
> 2.43.0
>
More information about the igt-dev
mailing list