filelight: avoid stat()-ing if dirent::d_type is available

Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
This commit is contained in:
Ivailo Monev 2021-06-29 19:25:01 +03:00
parent ec0dce85df
commit 812b922836
3 changed files with 27 additions and 1 deletions

View file

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

View file

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

View file

@ -19,6 +19,8 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
***********************************************************************/
#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));