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
Branches
Tags
No related merge requests found
...@@ -172,10 +172,12 @@ displayed, but not their content, and they are not counted towards the disk ...@@ -172,10 +172,12 @@ displayed, but not their content, and they are not counted towards the disk
usage statistics. usage statistics.
See http://www.brynosaurus.com/cachedir/ 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 Follow symlinks and count the size of the file they point to. As of ncdu 1.14,
they point to. Symlink loops and directories will be ignored. 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 =back
......
...@@ -185,7 +185,7 @@ static int dir_scan_recurse(const char *name) { ...@@ -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 * directory. Assumes we're chdir'ed in the directory in which this item
* resides. */ * resides. */
static int dir_scan_item(const char *name) { static int dir_scan_item(const char *name) {
struct stat st; static struct stat st, stl;
int fail = 0; int fail = 0;
#ifdef __CYGWIN__ #ifdef __CYGWIN__
...@@ -204,14 +204,12 @@ static int dir_scan_item(const char *name) { ...@@ -204,14 +204,12 @@ static int dir_scan_item(const char *name) {
dir_setlasterr(dir_curpath); dir_setlasterr(dir_curpath);
} }
if(!(buf_dir->flags & (FF_ERR|FF_EXL))) if(!(buf_dir->flags & (FF_ERR|FF_EXL))) {
stat_to_dir(&st); if(follow_symlinks && S_ISLNK(st.st_mode) && !stat(name, &stl) && !S_ISDIR(stl.st_mode))
stat_to_dir(&stl);
if (!(buf_dir->flags & (FF_ERR|FF_EXL)) && follow_symlinks && S_ISLNK(st.st_mode)) else
if (!stat(name, &st)) { stat_to_dir(&st);
if (!S_ISDIR(st.st_mode)) }
stat_to_dir(&st);
}
if(cachedir_tags && (buf_dir->flags & FF_DIR) && !(buf_dir->flags & (FF_ERR|FF_EXL|FF_OTHFS))) if(cachedir_tags && (buf_dir->flags & FF_DIR) && !(buf_dir->flags & (FF_ERR|FF_EXL|FF_OTHFS)))
if(has_cachedir_tag(buf_dir->name)) { 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