*/
static char *
choose_random_file_matching(const char *dir_path,
- bool (*predicate)(struct dirent *))
+ bool (*predicate)(struct dirent *,
+ const char *dir_path))
{
DIR *dir;
struct dirent *entry;
entry = readdir(dir);
if (entry == NULL)
break;
- if (! predicate(entry))
+ if (!predicate(entry, dir_path))
continue;
count++;
entry = readdir(dir);
if (entry == NULL)
break;
- if (! predicate(entry))
+ if (!predicate(entry, dir_path))
continue;
if (count == victim)
break;
* ".tmp"
*/
static bool
-is_regular_non_tmp_file(struct dirent *entry)
+is_regular_non_tmp_file(struct dirent *entry, const char *path)
{
- size_t len;
+ char *filename;
+ if (asprintf(&filename, "%s/%s", path, entry->d_name) == -1)
+ return false;
+
+ struct stat sb;
+ stat(filename, &sb);
+ free(filename);
- if (entry->d_type != DT_REG)
+ if (!S_ISREG(sb.st_mode))
return false;
- len = strlen (entry->d_name);
+ size_t len = strlen (entry->d_name);
if (len >= 4 && strcmp(&entry->d_name[len-4], ".tmp") == 0)
return false;
* special name of "..")
*/
static bool
-is_two_character_sub_directory(struct dirent *entry)
+is_two_character_sub_directory(struct dirent *entry, const char *path)
{
- if (entry->d_type != DT_DIR)
+ char *subdir;
+ if (asprintf(&subdir, "%s/%s", path, entry->d_name) == -1)
+ return false;
+
+ struct stat sb;
+ stat(path, &sb);
+ free(subdir);
+
+ if (!S_ISDIR(sb.st_mode))
return false;
if (strlen(entry->d_name) != 2)