/* 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; /* TODO: don't call strlen on filename every time we call filename_filter() */ size_t filename_len = strlen(filename); 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 size_t base_path_len = scandir_baton->base_path_len; 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; } if (is_named_pipe(path, dir)) { log_debug("%s ignored because it's a named pipe", path); 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 < base_path_len; i++) { /* base_path always ends with "/\0" while path doesn't, so this is safe */ path_start = path + i + 2; } log_debug("path_start %s filename %s", path_start, filename); while (ig != NULL) { if (path_ignore_search(ig, path_start, filename)) { return 0; } if (is_directory(path, dir) && filename[filename_len - 1] != '/') { ag_asprintf(&temp, "%s/", filename); int rv = path_ignore_search(ig, path_start, temp); free(temp); if (rv) { return 0; } } ig = ig->parent; } 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; if (!opts.search_hidden_files && filename[0] == '.') { return 0; } size_t i; for (i = 0; evil_hardcoded_ignore_files[i] != NULL; i++) { if (strcmp(filename, evil_hardcoded_ignore_files[i]) == 0) { return 0; } } if (!opts.follow_symlinks && is_symlink(path, dir)) { log_debug("File %s ignored becaused it's a symlink", dir->d_name); return 0; } if (is_named_pipe(path, dir)) { log_debug("%s ignored because it's a named pipe or socket", path); return 0; } if (opts.search_all_files && !opts.path_to_ignore) { return 1; } scandir_baton_t *scandir_baton = (scandir_baton_t *)baton; const char *base_path = scandir_baton->base_path; const size_t base_path_len = scandir_baton->base_path_len; const char *path_start = path; for (i = 0; base_path[i] == path[i] && i < base_path_len; i++) { /* base_path always ends with "/\0" while path doesn't, so this is safe */ path_start = path + i + 2; } log_debug("path_start %s filename %s", path_start, filename); const char *extension = strchr(filename, '.'); if (extension) { if (extension[1]) { // The dot is not the last character, extension starts at the next one ++extension; } else { // No extension extension = NULL; } } #ifdef HAVE_DIRENT_DNAMLEN size_t filename_len = dir->d_namlen; #else size_t filename_len = 0; #endif if (strncmp(filename, "./", 2) == 0) { #ifndef HAVE_DIRENT_DNAMLEN filename_len = strlen(filename); #endif filename++; filename_len--; } const ignores *ig = scandir_baton->ig; while (ig != NULL) { if (extension) { int match_pos = binary_search(extension, ig->extensions, 0, ig->extensions_len); if (match_pos >= 0) { log_debug("file %s ignored because name matches extension %s", filename, ig->extensions[match_pos]); return 0; } } if (path_ignore_search(ig, path_start, filename)) { return 0; } if (is_directory(path, dir)) { #ifndef HAVE_DIRENT_DNAMLEN if (!filename_len) { filename_len = strlen(filename); } #endif if (filename[filename_len - 1] != '/') { char *temp; ag_asprintf(&temp, "%s/", filename); int rv = path_ignore_search(ig, path_start, temp); free(temp); if (rv) { return 0; } } } ig = ig->parent; } log_debug("%s not ignored", filename); 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; 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; } if (is_named_pipe(path, dir)) { log_debug("%s ignored because it's a named pipe", path); 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; } } /* TODO: copy-pasted from above */ if (scandir_baton->level == 0) { char *temp2; /* horrible variable name, I know */ ag_asprintf(&temp, "/%s", filename); if (path_ignore_search(ig, path_start, temp)) { return 0; } if (is_directory(path, dir) && temp[strlen(filename) - 1] != '/') { ag_asprintf(&temp2, "%s/", temp); int rv = path_ignore_search(ig, path_start, temp2); free(temp2); if (rv) { return 0; } } free(temp); } scandir_baton->level++; if (ig->parent != NULL) { scandir_baton->ig = ig->parent; return filename_filter(path, dir, (void *)scandir_baton); } return 1; }