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