Skip to content
Snippets Groups Projects
Commit 882a3261 authored by Yorhel's avatar Yorhel
Browse files

symlinks: Only call stat_to_dir() once, impove manual

stat_to_dir() assumes that buf_dir is clean; calling it twice breaks
that asumption.
parent 74efdfaf
No related branches found
No related tags found
No related merge requests found
......@@ -172,10 +172,12 @@ displayed, but not their content, and they are not counted towards the disk
usage statistics.
See http://www.brynosaurus.com/cachedir/
=item -L,--follow-symlinks
=item -L, --follow-symlinks
Follow symlinks (except to directories) 00and count the size of the file
they point to. Symlink loops and directories will be ignored.
Follow symlinks and count the size of the file they point to. As of ncdu 1.14,
this option will not follow symlinks to directories and will count each
symlinked file as a unique file (i.e. unlike how hard links are handled). This
is subject to change in later versions.
=back
......
......@@ -185,7 +185,7 @@ static int dir_scan_recurse(const char *name) {
* directory. Assumes we're chdir'ed in the directory in which this item
* resides. */
static int dir_scan_item(const char *name) {
struct stat st;
static struct stat st, stl;
int fail = 0;
#ifdef __CYGWIN__
......@@ -204,14 +204,12 @@ static int dir_scan_item(const char *name) {
dir_setlasterr(dir_curpath);
}
if(!(buf_dir->flags & (FF_ERR|FF_EXL)))
stat_to_dir(&st);
if (!(buf_dir->flags & (FF_ERR|FF_EXL)) && follow_symlinks && S_ISLNK(st.st_mode))
if (!stat(name, &st)) {
if (!S_ISDIR(st.st_mode))
stat_to_dir(&st);
}
if(!(buf_dir->flags & (FF_ERR|FF_EXL))) {
if(follow_symlinks && S_ISLNK(st.st_mode) && !stat(name, &stl) && !S_ISDIR(stl.st_mode))
stat_to_dir(&stl);
else
stat_to_dir(&st);
}
if(cachedir_tags && (buf_dir->flags & FF_DIR) && !(buf_dir->flags & (FF_ERR|FF_EXL|FF_OTHFS)))
if(has_cachedir_tag(buf_dir->name)) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment