dentfill(char *path, struct entry **dents,
int (*filter)(regex_t *, char *), regex_t *re)
{
- static char newpath[PATH_MAX];
static DIR *dirp;
static struct dirent *dp;
static struct stat sb;
- static int n;
+ static int fd, n;
n = 0;
if (dirp == NULL)
return 0;
+ fd = dirfd(dirp);
+
while ((dp = readdir(dirp)) != NULL) {
/* Skip self and parent */
if ((dp->d_name[0] == '.' && (dp->d_name[1] == '\0' ||
if (!cfg.blkorder)
continue;
- mkpath(path, dp->d_name, newpath, PATH_MAX);
- if (lstat(newpath, &sb) == -1)
+ if (fstatat(fd, dp->d_name, &sb, AT_SYMLINK_NOFOLLOW) == -1)
continue;
if (S_ISDIR(sb.st_mode)) {
ent_blocks = 0;
- if (nftw(newpath, sum_bsizes, open_max,
+ mkpath(path, dp->d_name, g_buf, PATH_MAX);
+
+ if (nftw(g_buf, sum_bsizes, open_max,
FTW_MOUNT | FTW_PHYS) == -1) {
printmsg("nftw(3) failed");
dir_blocks += sb.st_blocks;
continue;
}
- mkpath(path, dp->d_name, newpath, PATH_MAX);
- if (lstat(newpath, &sb) == -1) {
+ if (fstatat(fd, dp->d_name, &sb, AT_SYMLINK_NOFOLLOW) == -1) {
if (*dents)
free(*dents);
- printerr(1, "lstat");
+ printerr(1, "fstatat");
}
if (n == total_dents) {
if (cfg.blkorder) {
if (S_ISDIR(sb.st_mode)) {
ent_blocks = 0;
- if (nftw(newpath, sum_bsizes, open_max,
+ mkpath(path, dp->d_name, g_buf, PATH_MAX);
+
+ if (nftw(g_buf, sum_bsizes, open_max,
FTW_MOUNT | FTW_PHYS) == -1) {
printmsg("nftw(3) failed");
(*dents)[n].blocks = sb.st_blocks;