[RFC i-g-t 2/5] lib/igt_dir_explorer: Add function to recursively read all files in a directory

Peter Senna Tschudin peter.senna at linux.intel.com
Thu May 15 16:40:09 UTC 2025



On 5/15/2025 10:51 AM, Zbigniew Kempczyński wrote:
> 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.
What about?

/* Callback function type for processing files. I guess we should make
 * it blocking. Wait for the function to return before starting the next
 * file.
 */
typedef int (*igt_dir_exp_file_callback)(int filefd);

/* reading order */
typedef enum {
    SCAN_ORDER_SEQUENTIAL,
    SCAN_ORDER_RANDOM
} igt_dir_exp_scan_order_t;

/* Struct to hold the library interface */
typedef struct {
    int dirfd;                          /* File descriptor of the directory to scan */
    igt_dir_exp_file_callback callback; /* Callback function for file operations. If null defaults
                                         * to read and discard */
    const char *include_pattern;        /* Pattern to match files to include (glob or regex) */
    const char *exclude_pattern;        /* Pattern to match files to exclude (glob or regex) */
    uint32_t concurrency;               /* Number of threads, default is 1 */
    size_t max_depth;                   /* Maximum directory depth to scan. -1 no limit */
    size_t max_files;                   /* Maximum number of files to process.  -1 no limit */
    size_t max_bytes;                   /* Maximum bytes to read on each file. -1 no limit */
    scan_order_t reading_order;         /* Reading order (sequential or random) */
} igt_dir_exp_file_scan_config_t;

/* Function prototype for the library function */
int igt_dir_exp_scan_directory(const igt_dir_exp_file_scan_config_t *config);



More information about the igt-dev mailing list