1 /* 2 * Public domain 3 * sys/stat.h compatibility shim 4 */ 5 6 #ifndef LIBCRYPTOCOMPAT_SYS_STAT_H 7 #define LIBCRYPTOCOMPAT_SYS_STAT_H 8 9 #ifndef _MSC_VER 10 #include_next <sys/stat.h> 11 12 /* for old MinGW */ 13 #ifndef S_IRWXU 14 #define S_IRWXU 0 15 #endif 16 #ifndef S_IRWXG 17 #define S_IRWXG 0 18 #endif 19 #ifndef S_IRGRP 20 #define S_IRGRP 0 21 #endif 22 #ifndef S_IRWXO 23 #define S_IRWXO 0 24 #endif 25 #ifndef S_IROTH 26 #define S_IROTH 0 27 #endif 28 29 #else 30 31 #include <windows.h> 32 #if _MSC_VER >= 1900 33 #include <../ucrt/sys/stat.h> 34 #else 35 #include <../include/sys/stat.h> 36 #endif 37 38 /* File type and permission flags for stat() */ 39 #if !defined(S_IFMT) 40 # define S_IFMT _S_IFMT /* File type mask */ 41 #endif 42 #if !defined(S_IFDIR) 43 # define S_IFDIR _S_IFDIR /* Directory */ 44 #endif 45 #if !defined(S_IFCHR) 46 # define S_IFCHR _S_IFCHR /* Character device */ 47 #endif 48 #if !defined(S_IFFIFO) 49 # define S_IFFIFO _S_IFFIFO /* Pipe */ 50 #endif 51 #if !defined(S_IFREG) 52 # define S_IFREG _S_IFREG /* Regular file */ 53 #endif 54 #if !defined(S_IREAD) 55 # define S_IREAD _S_IREAD /* Read permission */ 56 #endif 57 #if !defined(S_IWRITE) 58 # define S_IWRITE _S_IWRITE /* Write permission */ 59 #endif 60 #if !defined(S_IEXEC) 61 # define S_IEXEC _S_IEXEC /* Execute permission */ 62 #endif 63 #if !defined(S_IFIFO) 64 # define S_IFIFO _S_IFIFO /* Pipe */ 65 #endif 66 #if !defined(S_IFBLK) 67 # define S_IFBLK 0 /* Block device */ 68 #endif 69 #if !defined(S_IFLNK) 70 # define S_IFLNK 0 /* Link */ 71 #endif 72 #if !defined(S_IFSOCK) 73 # define S_IFSOCK 0 /* Socket */ 74 #endif 75 76 #if defined(_MSC_VER) 77 # define S_IRWXU 0 /* RWX user */ 78 # define S_IRUSR S_IREAD /* Read user */ 79 # define S_IWUSR S_IWRITE /* Write user */ 80 # define S_IXUSR 0 /* Execute user */ 81 # define S_IRWXG 0 /* RWX group */ 82 # define S_IRGRP 0 /* Read group */ 83 # define S_IWGRP 0 /* Write group */ 84 # define S_IXGRP 0 /* Execute group */ 85 # define S_IRWXO 0 /* RWX others */ 86 # define S_IROTH 0 /* Read others */ 87 # define S_IWOTH 0 /* Write others */ 88 # define S_IXOTH 0 /* Execute others */ 89 #endif 90 91 /* File type flags for d_type */ 92 #define DT_UNKNOWN 0 93 #define DT_REG S_IFREG 94 #define DT_DIR S_IFDIR 95 #define DT_FIFO S_IFIFO 96 #define DT_SOCK S_IFSOCK 97 #define DT_CHR S_IFCHR 98 #define DT_BLK S_IFBLK 99 #define DT_LNK S_IFLNK 100 101 /* Macros for converting between st_mode and d_type */ 102 #define IFTODT(mode) ((mode) & S_IFMT) 103 #define DTTOIF(type) (type) 104 105 /* 106 * File type macros. Note that block devices, sockets and links cannot be 107 * distinguished on Windows and the macros S_ISBLK, S_ISSOCK and S_ISLNK are 108 * only defined for compatibility. These macros should always return false 109 * on Windows. 110 */ 111 #define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO) 112 #define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) 113 #define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG) 114 #define S_ISLNK(mode) (((mode) & S_IFMT) == S_IFLNK) 115 #define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK) 116 #define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR) 117 #define S_ISBLK(mode) (((mode) & S_IFMT) == S_IFBLK) 118 119 #endif 120 121 #endif 122