Branch data Line data Source code
1 : : /* SPDX-License-Identifier: LGPL-2.1+ */ 2 : : 3 : : #include <fcntl.h> 4 : : #include <sys/stat.h> 5 : : 6 : : #include "dirent-util.h" 7 : : #include "path-util.h" 8 : : #include "string-util.h" 9 : : 10 : 2317760 : int dirent_ensure_type(DIR *d, struct dirent *de) { 11 : : struct stat st; 12 : : 13 [ - + ]: 2317760 : assert(d); 14 [ - + ]: 2317760 : assert(de); 15 : : 16 [ + - ]: 2317760 : if (de->d_type != DT_UNKNOWN) 17 : 2317760 : return 0; 18 : : 19 [ # # ]: 0 : if (fstatat(dirfd(d), de->d_name, &st, AT_SYMLINK_NOFOLLOW) < 0) 20 : 0 : return -errno; 21 : : 22 : 0 : de->d_type = 23 [ # # ]: 0 : S_ISREG(st.st_mode) ? DT_REG : 24 [ # # ]: 0 : S_ISDIR(st.st_mode) ? DT_DIR : 25 [ # # ]: 0 : S_ISLNK(st.st_mode) ? DT_LNK : 26 [ # # ]: 0 : S_ISFIFO(st.st_mode) ? DT_FIFO : 27 [ # # ]: 0 : S_ISSOCK(st.st_mode) ? DT_SOCK : 28 [ # # ]: 0 : S_ISCHR(st.st_mode) ? DT_CHR : 29 [ # # ]: 0 : S_ISBLK(st.st_mode) ? DT_BLK : 30 : : DT_UNKNOWN; 31 : : 32 : 0 : return 0; 33 : : } 34 : : 35 : 6944 : bool dirent_is_file(const struct dirent *de) { 36 [ - + ]: 6944 : assert(de); 37 : : 38 [ + + + + ]: 6944 : if (!IN_SET(de->d_type, DT_REG, DT_LNK, DT_UNKNOWN)) 39 : 3297 : return false; 40 : : 41 [ + + ]: 3647 : if (hidden_or_backup_file(de->d_name)) 42 : 16 : return false; 43 : : 44 : 3631 : return true; 45 : : } 46 : : 47 : 0 : bool dirent_is_file_with_suffix(const struct dirent *de, const char *suffix) { 48 [ # # ]: 0 : assert(de); 49 : : 50 [ # # # # ]: 0 : if (!IN_SET(de->d_type, DT_REG, DT_LNK, DT_UNKNOWN)) 51 : 0 : return false; 52 : : 53 [ # # ]: 0 : if (de->d_name[0] == '.') 54 : 0 : return false; 55 : : 56 [ # # ]: 0 : if (!suffix) 57 : 0 : return true; 58 : : 59 : 0 : return endswith(de->d_name, suffix); 60 : : } 61 : : 62 : 41891 : struct dirent* readdir_no_dot(DIR *dirp) { 63 : : struct dirent* d; 64 : : 65 : : for (;;) { 66 : 41891 : d = readdir(dirp); 67 [ + + + + ]: 41891 : if (d && dot_or_dot_dot(d->d_name)) 68 : 104 : continue; 69 : 41787 : return d; 70 : : } 71 : : }