#ifndef SCANNER_H #define SCANNER_H #include "chunk.h" #include "queue.h" #include #include #include #include typedef struct { Queue* directories; DIR* current_dir; char* current_path; bool use_metadata; unsigned long long chunk_size; char** exclude_patterns; int exclude_count; char** include_patterns; int include_count; unsigned long long max_size; unsigned long long min_size; int max_depth; int current_depth; bool follow_symlinks; bool copy_links; bool safe_links; bool copy_unsafe_links; bool checksum; bool failed; } DirectoryScanner; typedef struct { Queue* result_queue; mtx_t result_mutex; cnd_t result_not_empty; cnd_t result_not_full; int num_threads; int expected_threads; int created_threads; thrd_t* threads; bool done; bool failed; atomic_bool cancelled; int completed; Chunk* initial_chunk; } ParallelScanner; DirectoryScanner* directory_scanner_create(const char* root_directory, bool use_metadata, unsigned long long chunk_size, char** exclude_patterns, int exclude_count, char** include_patterns, int include_count, unsigned long long max_size, unsigned long long min_size, int max_depth, bool follow_symlinks, bool copy_links, bool safe_links, bool copy_unsafe_links, bool checksum); Chunk* directory_scanner_next(DirectoryScanner* scanner); bool directory_scanner_failed(const DirectoryScanner* scanner); void directory_scanner_destroy(DirectoryScanner* scanner); ParallelScanner* parallel_scanner_create(char* root_directory, bool use_metadata, unsigned long long chunk_size, char** exclude_patterns, int exclude_count, char** include_patterns, int include_count, unsigned long long max_size, unsigned long long min_size, int max_depth, int num_threads, bool follow_symlinks, bool copy_links, bool safe_links, bool copy_unsafe_links, bool checksum); Chunk* parallel_scanner_next(ParallelScanner* scanner); bool parallel_scanner_failed(const ParallelScanner* scanner); void parallel_scanner_destroy(ParallelScanner* scanner); #endif