/* This function is REALLY HOT. It gets called for every file */ int filename_filter(const char *path, const struct dirent *dir, void *baton) { const char *filename = dir->d_name; size_t i; scandir_baton_t *scandir_baton = (scandir_baton_t*) baton; const ignores *ig = scandir_baton->ig; const char *base_path = scandir_baton->base_path; const char *path_start = path; char *temp; if (!opts.follow_symlinks && is_symlink(path, dir)) { log_debug("File %s ignored becaused it's a symlink", dir->d_name); return 0; } for (i = 0; evil_hardcoded_ignore_files[i] != NULL; i++) { if (strcmp(filename, evil_hardcoded_ignore_files[i]) == 0) { return 0; } } if (!opts.search_hidden_files && filename[0] == '.') { return 0; } if (opts.search_all_files && !opts.path_to_agignore) { return 1; } for (i = 0; base_path[i] == path[i] && i < strlen(base_path); i++) { /* base_path always ends with "/\0" while path doesn't, so this is safe */ path_start = path + i + 2; } log_debug("path_start is %s", path_start); if (path_ignore_search(ig, path_start, filename)) { return 0; } if (is_directory(path, dir) && filename[strlen(filename) - 1] != '/') { ag_asprintf(&temp, "%s/", filename); int rv = path_ignore_search(ig, path_start, temp); free(temp); if (rv) { return 0; } } if (ig->parent != NULL) { scandir_baton->ig = ig->parent; return filename_filter(path, dir, (void *)scandir_baton); } return 1; }
/* This function is REALLY HOT. It gets called for every file */ int filename_filter(const char *path, const struct dirent *dir, void *baton) { const char *filename = dir->d_name; size_t i; ignores *ig = (ignores*) baton; if (!opts.follow_symlinks && is_symlink(path, dir)) { log_debug("File %s ignored becaused it's a symlink", dir->d_name); return 0; } for (i = 0; evil_hardcoded_ignore_files[i] != NULL; i++) { if (strcmp(filename, evil_hardcoded_ignore_files[i]) == 0) { return 0; } } if (!opts.search_hidden_files && filename[0] == '.') { return 0; } if (opts.search_all_files && !opts.path_to_agignore) { return 1; } if (filename_ignore_search(ig, filename)) { return 0; } if (is_directory(path, dir) && filename[strlen(filename) - 1] != '/') { char *temp; asprintf(&temp, "%s/", filename); int rv = filename_ignore_search(ig, temp); free(temp); if (rv) { return 0; } } if (ig->parent != NULL) { return filename_filter(path, dir, (void *)(ig->parent)); } return 1; }