symlinks: Only call stat_to_dir() once, impove manual

stat_to_dir() assumes that buf_dir is clean; calling it twice breaks
that asumption.
This commit is contained in:
Yorhel 2019-01-24 08:56:19 +01:00
parent 74efdfaf97
commit 882a32613d
2 changed files with 12 additions and 12 deletions

View file

@ -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

View file

@ -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)) {