diff --git a/doc/ncdu.pod b/doc/ncdu.pod index eaa0ddc83643834a2c2258e5c71c45c24278c1c6..784500f3a20d5dd39a950e96ce3e76b537b1ace4 100644 --- a/doc/ncdu.pod +++ b/doc/ncdu.pod @@ -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 diff --git a/src/dir_scan.c b/src/dir_scan.c index 3ec508c68d0c143b33a56ead21de1e9c1950c2aa..38068f1efbc9bfb5e1e728aaa0aaa01f0b2d3a9f 100644 --- a/src/dir_scan.c +++ b/src/dir_scan.c @@ -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)) {