1 /* sys/stat.h supplied with MSVCRT uses too narrow data types for 2 inode and user/group id, so we replace them with our own. 3 4 Copyright (C) 2008-2021 Free Software Foundation, Inc. 5 6 This file is part of GNU Emacs. 7 8 GNU Emacs is free software: you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation, either version 3 of the License, or (at 11 your option) any later version. 12 13 GNU Emacs is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ 20 21 #ifndef INC_SYS_STAT_H_ 22 #define INC_SYS_STAT_H_ 23 24 #ifdef __MINGW32__ 25 # include <_mingw.h> 26 #endif 27 28 /* Only MinGW 3.13 and later has __MINGW_NOTHROW. */ 29 #ifndef __MINGW_NOTHROW 30 # define __MINGW_NOTHROW 31 #endif 32 33 /* Prevent the MinGW stat.h header from being included, ever. */ 34 #ifndef _SYS_STAT_H 35 # define _SYS_STAT_H 36 #endif 37 #ifndef _INC_STAT_H 38 # define _INC_STAT_H 39 #endif 40 41 #include <sys/types.h> 42 #include <time.h> 43 44 #define S_IFMT 0xF800 45 46 #define S_IFREG 0x8000 47 #define S_IFDIR 0x4000 48 #define S_IFBLK 0x3000 49 #define S_IFCHR 0x2000 50 #define S_IFIFO 0x1000 51 #define S_IFLNK 0x0800 52 53 #define S_IREAD 0x0100 54 #define S_IWRITE 0x0080 55 #define S_IEXEC 0x0040 56 57 #define S_IRUSR S_IREAD 58 #define S_IWUSR S_IWRITE 59 #define S_IXUSR S_IEXEC 60 #define S_IRWXU (S_IREAD | S_IWRITE | S_IEXEC) 61 62 #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) 63 #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) 64 #define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) 65 #define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) 66 #define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) 67 #define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) 68 69 /* These don't exist on Windows, but lib/filemode.c wants them. */ 70 #define S_ISUID 0 71 #define S_ISGID 0 72 #define S_ISVTX 0 73 #define S_IRGRP (S_IRUSR >> 3) 74 #define S_IROTH (S_IRUSR >> 6) 75 #define S_IWGRP (S_IWUSR >> 3) 76 #define S_IWOTH (S_IWUSR >> 6) 77 #define S_IXGRP (S_IXUSR >> 3) 78 #define S_IXOTH (S_IXUSR >> 6) 79 80 #define S_ISSOCK(m) 0 81 #define S_ISCTG(p) 0 82 #define S_ISDOOR(m) 0 83 #define S_ISMPB(m) 0 84 #define S_ISMPC(m) 0 85 #define S_ISMPX(m) 0 86 #define S_ISNWK(m) 0 87 #define S_ISPORT(m) 0 88 #define S_ISWHT(m) 0 89 #define S_TYPEISMQ(p) 0 90 #define S_TYPEISSEM(p) 0 91 #define S_TYPEISSHM(p) 0 92 #define S_TYPEISTMO(p) 0 93 94 #define UTIME_NOW (-1) 95 #define UTIME_OMIT (-2) 96 97 struct stat { 98 unsigned __int64 st_ino; /* ino_t in sys/types.h is too narrow */ 99 dev_t st_dev; 100 unsigned short st_mode; 101 short st_nlink; 102 unsigned st_uid; /* Vista's TrustedInstaller has a very large RID */ 103 unsigned st_gid; 104 unsigned __int64 st_size; 105 dev_t st_rdev; 106 time_t st_atime; 107 time_t st_mtime; 108 time_t st_ctime; 109 char st_uname[260]; 110 char st_gname[260]; 111 }; 112 113 /* These are here to avoid compiler warnings when using wchar.h. */ 114 struct _stat 115 { 116 _dev_t st_dev; /* Equivalent to drive number 0=A 1=B ... */ 117 _ino_t st_ino; /* Always zero ? */ 118 _mode_t st_mode; /* See above constants */ 119 short st_nlink; /* Number of links. */ 120 short st_uid; /* User: Maybe significant on NT ? */ 121 short st_gid; /* Group: Ditto */ 122 _dev_t st_rdev; /* Seems useless (not even filled in) */ 123 _off_t st_size; /* File size in bytes */ 124 time_t st_atime; /* Accessed date (always 00:00 hrs local 125 * on FAT) */ 126 time_t st_mtime; /* Modified time */ 127 time_t st_ctime; /* Creation time */ 128 }; 129 130 #if defined (__MSVCRT__) 131 struct _stati64 { 132 _dev_t st_dev; 133 _ino_t st_ino; 134 _mode_t st_mode; 135 short st_nlink; 136 short st_uid; 137 short st_gid; 138 _dev_t st_rdev; 139 __int64 st_size; 140 time_t st_atime; 141 time_t st_mtime; 142 time_t st_ctime; 143 }; 144 #endif 145 146 /* Internal variable for asking 'stat'/'lstat' to produce accurate 147 info about owner and group of files. */ 148 extern int w32_stat_get_owner_group; 149 150 /* Prevent redefinition by other headers, e.g. wchar.h. */ 151 #define _STAT_DEFINED 152 /* This prevents definition in MinGW's wchar.h of inline functions 153 that use struct _stat64i32 etc., which we don't define and don't 154 support in our implementation of 'stat' and 'fstat'. If we don't 155 prevent definition of those inline functions, any program (e.g., 156 test programs run by configure) that includes both wchar.h and 157 sys/stat.h will fail to compile. */ 158 #define _WSTAT_DEFINED 159 160 int __cdecl __MINGW_NOTHROW fstat (int, struct stat*); 161 int __cdecl __MINGW_NOTHROW stat (const char*, struct stat*); 162 int __cdecl __MINGW_NOTHROW lstat (const char*, struct stat*); 163 int __cdecl __MINGW_NOTHROW fstatat (int, char const *, 164 struct stat *, int); 165 int __cdecl __MINGW_NOTHROW chmod (const char*, int); 166 167 /* Provide prototypes of library functions that are emulated on w32 168 and whose prototypes are usually found in sys/stat.h on POSIX 169 platforms. */ 170 extern int utimensat (int, const char *, struct timespec const[2], int); 171 172 #endif /* INC_SYS_STAT_H_ */ 173