From 812b92283685810d15e90519d870b0679e333d57 Mon Sep 17 00:00:00 2001 From: Ivailo Monev Date: Tue, 29 Jun 2021 19:25:01 +0300 Subject: [PATCH] filelight: avoid stat()-ing if dirent::d_type is available Signed-off-by: Ivailo Monev --- filelight/CMakeLists.txt | 14 +++++++++++++- filelight/config-filelight.h.cmake | 4 ++++ filelight/src/part/localLister.cpp | 10 ++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 filelight/config-filelight.h.cmake diff --git a/filelight/CMakeLists.txt b/filelight/CMakeLists.txt index 40c20820..58fb1752 100644 --- a/filelight/CMakeLists.txt +++ b/filelight/CMakeLists.txt @@ -29,7 +29,19 @@ endif() add_definitions(-DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII) -include_directories(src) +include(CheckStructHasMember) + +check_struct_has_member("struct dirent" d_type dirent.h HAVE_DIRENT_D_TYPE) + +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/config-filelight.h.cmake + ${CMAKE_CURRENT_BINARY_DIR}/config-filelight.h +) + +include_directories( + ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/src +) add_subdirectory(src) add_subdirectory(misc) diff --git a/filelight/config-filelight.h.cmake b/filelight/config-filelight.h.cmake new file mode 100644 index 00000000..004c8a5f --- /dev/null +++ b/filelight/config-filelight.h.cmake @@ -0,0 +1,4 @@ +/* config.h. Generated by cmake from config.h.cmake */ + +/* Defined to 1 if you have a d_type member in struct dirent */ +#cmakedefine HAVE_DIRENT_D_TYPE 1 diff --git a/filelight/src/part/localLister.cpp b/filelight/src/part/localLister.cpp index b9e74b4e..ef454774 100644 --- a/filelight/src/part/localLister.cpp +++ b/filelight/src/part/localLister.cpp @@ -19,6 +19,8 @@ * along with this program. If not, see . ***********************************************************************/ +#include "config-filelight.h" + #include "localLister.h" #include "Config.h" @@ -148,12 +150,19 @@ LocalLister::scan(const QByteArray &path, const QByteArray &dirname) QByteArray new_path = path; new_path += ent->d_name; +#ifdef HAVE_DIRENT_D_TYPE + if (ent->d_type != DT_DIR && ent->d_type != DT_REG) { + continue; + } +#endif + //get file information if (KDE_lstat(new_path, &statbuf) == -1) { outputError(new_path); continue; } +#ifndef HAVE_DIRENT_D_TYPE // anything that is not file/directory is filtered above if (S_ISLNK(statbuf.st_mode) || S_ISCHR(statbuf.st_mode) || S_ISBLK(statbuf.st_mode) || @@ -162,6 +171,7 @@ LocalLister::scan(const QByteArray &path, const QByteArray &dirname) { continue; } +#endif if (S_ISREG(statbuf.st_mode)) //file cwd->append(ent->d_name, (statbuf.st_blocks * S_BLKSIZE));