1
1

symlinks: Only call stat_to_dir() once, impove manual

stat_to_dir() assumes that buf_dir is clean; calling it twice breaks
that asumption.
Этот коммит содержится в:
Yorhel 2019-01-24 08:56:19 +01:00
родитель 74efdfaf97
Коммит 882a32613d
2 изменённых файлов: 12 добавлений и 12 удалений

Просмотреть файл

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