mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-08-27 03:43:36 +00:00
Mingw-w64 commit id 850703ae46e1971c5789fa1bdd802fb9692c41c9 by Daniel Starke via Mingw-w64-public <[email protected]> headers: Change _S_IFBLK from 0x3000 to 0x6000 The _S_IFBLK macro, used to identify block special files in file systems, is being updated from 0x3000 to 0x6000. This change aligns mingw-w64 with the more commonly used value across Unix-like systems and other C libraries. The old value of 0x3000 may have caused compatibility issues when working with code that assumes the standard 0x6000 value for S_IFBLK. This update improves cross-platform compatibility and consistency with other systems, making it easier to write portable code that deals with file type identification. It also reduces potential confusion and errors that might arise from the non-standard value. One of these is for example python. This is only an example. It does not change the fact that python should be more careful about actual value implementation. Note that the current value implies character device + FIFO instead of character device + directory. Link: https://github.com/python/cpython/blob/f81990024554a75e2ab31133a72d9f0954690435/Python/fileutils.c#L1197 Link: https://github.com/torvalds/linux/blob/81e4f8d68c66da301bb881862735bd74c6241a19/include/uapi/linux/stat.h#L13 Signed-off-by: Daniel Starke <[email protected]> Signed-off-by: LIU Hao <[email protected]>
364 lines
7.2 KiB
C
364 lines
7.2 KiB
C
/**
|
|
* This file has no copyright assigned and is placed in the Public Domain.
|
|
* This file is part of the w64 mingw-runtime package.
|
|
* No warranty is given; refer to the file DISCLAIMER within this package.
|
|
*/
|
|
#ifndef _INC_STAT
|
|
#define _INC_STAT
|
|
|
|
#ifndef _WIN32
|
|
#error Only Win32 target is supported!
|
|
#endif
|
|
|
|
#include <crtdefs.h>
|
|
|
|
#pragma pack(push,_CRT_PACKING)
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include <sys/types.h>
|
|
|
|
#ifndef _STAT_DEFINED
|
|
#define _STAT_DEFINED
|
|
|
|
struct _stat32 {
|
|
_dev_t st_dev;
|
|
_ino_t st_ino;
|
|
unsigned short st_mode;
|
|
short st_nlink;
|
|
short st_uid;
|
|
short st_gid;
|
|
_dev_t st_rdev;
|
|
_off_t st_size;
|
|
__time32_t st_atime;
|
|
__time32_t st_mtime;
|
|
__time32_t st_ctime;
|
|
};
|
|
|
|
struct _stat {
|
|
_dev_t st_dev;
|
|
_ino_t st_ino;
|
|
unsigned short st_mode;
|
|
short st_nlink;
|
|
short st_uid;
|
|
short st_gid;
|
|
_dev_t st_rdev;
|
|
_off_t st_size;
|
|
time_t st_atime;
|
|
time_t st_mtime;
|
|
time_t st_ctime;
|
|
};
|
|
|
|
#ifndef NO_OLDNAMES
|
|
struct stat {
|
|
_dev_t st_dev;
|
|
_ino_t st_ino;
|
|
unsigned short st_mode;
|
|
short st_nlink;
|
|
short st_uid;
|
|
short st_gid;
|
|
_dev_t st_rdev;
|
|
_off_t st_size;
|
|
time_t st_atime;
|
|
time_t st_mtime;
|
|
time_t st_ctime;
|
|
};
|
|
#endif
|
|
|
|
#if _INTEGRAL_MAX_BITS >= 64
|
|
struct _stat32i64 {
|
|
_dev_t st_dev;
|
|
_ino_t st_ino;
|
|
unsigned short st_mode;
|
|
short st_nlink;
|
|
short st_uid;
|
|
short st_gid;
|
|
_dev_t st_rdev;
|
|
__int64 st_size;
|
|
__time32_t st_atime;
|
|
__time32_t st_mtime;
|
|
__time32_t st_ctime;
|
|
};
|
|
|
|
struct _stat64i32 {
|
|
_dev_t st_dev;
|
|
_ino_t st_ino;
|
|
unsigned short st_mode;
|
|
short st_nlink;
|
|
short st_uid;
|
|
short st_gid;
|
|
_dev_t st_rdev;
|
|
_off_t st_size;
|
|
__time64_t st_atime;
|
|
__time64_t st_mtime;
|
|
__time64_t st_ctime;
|
|
};
|
|
|
|
struct _stat64 {
|
|
_dev_t st_dev;
|
|
_ino_t st_ino;
|
|
unsigned short st_mode;
|
|
short st_nlink;
|
|
short st_uid;
|
|
short st_gid;
|
|
_dev_t st_rdev;
|
|
__int64 st_size;
|
|
__time64_t st_atime;
|
|
__time64_t st_mtime;
|
|
__time64_t st_ctime;
|
|
};
|
|
|
|
struct _stati64 {
|
|
_dev_t st_dev;
|
|
_ino_t st_ino;
|
|
unsigned short st_mode;
|
|
short st_nlink;
|
|
short st_uid;
|
|
short st_gid;
|
|
_dev_t st_rdev;
|
|
__int64 st_size;
|
|
time_t st_atime;
|
|
time_t st_mtime;
|
|
time_t st_ctime;
|
|
};
|
|
|
|
#endif /* _INTEGRAL_MAX_BITS >= 64 */
|
|
|
|
#define __stat64 _stat64
|
|
|
|
#endif /* !_STAT_DEFINED */
|
|
|
|
#define _S_IFMT 0xF000
|
|
#define _S_IFDIR 0x4000
|
|
#define _S_IFCHR 0x2000
|
|
#define _S_IFIFO 0x1000
|
|
#define _S_IFREG 0x8000
|
|
#define _S_IREAD 0x0100
|
|
#define _S_IWRITE 0x0080
|
|
#define _S_IEXEC 0x0040
|
|
|
|
_CRTIMP
|
|
int
|
|
__cdecl
|
|
_fstat(
|
|
_In_ int _FileDes,
|
|
_Out_ struct _stat *_Stat);
|
|
|
|
_CRTIMP
|
|
int
|
|
__cdecl
|
|
_fstat32(
|
|
_In_ int _FileDes,
|
|
_Out_ struct _stat32 *_Stat);
|
|
|
|
_CRTIMP
|
|
int
|
|
__cdecl
|
|
_stat(
|
|
_In_z_ const char *_Name,
|
|
_Out_ struct _stat *_Stat);
|
|
|
|
_CRTIMP
|
|
int
|
|
__cdecl
|
|
_stat32(
|
|
_In_z_ const char *_Name,
|
|
_Out_ struct _stat32 *_Stat);
|
|
|
|
#if _INTEGRAL_MAX_BITS >= 64
|
|
|
|
_CRTIMP
|
|
int
|
|
__cdecl
|
|
_fstat64(
|
|
_In_ int _FileDes,
|
|
_Out_ struct _stat64 *_Stat);
|
|
|
|
_CRTIMP
|
|
int
|
|
__cdecl
|
|
_fstat32i64(
|
|
_In_ int _FileDes,
|
|
_Out_ struct _stat32i64 *_Stat);
|
|
|
|
_CRTIMP
|
|
int
|
|
__cdecl
|
|
_fstat64i32(
|
|
_In_ int _FileDes,
|
|
_Out_ struct _stat64i32 *_Stat);
|
|
|
|
_CRTIMP
|
|
int
|
|
__cdecl
|
|
_stat64(
|
|
_In_z_ const char *_Name,
|
|
_Out_ struct _stat64 *_Stat);
|
|
|
|
_CRTIMP
|
|
int
|
|
__cdecl
|
|
_stat32i64(
|
|
_In_z_ const char *_Name,
|
|
_Out_ struct _stat32i64 *_Stat);
|
|
|
|
_CRTIMP
|
|
int
|
|
__cdecl
|
|
_stat64i32(
|
|
_In_z_ const char *_Name,
|
|
_Out_ struct _stat64i32 *_Stat);
|
|
|
|
#endif /* _INTEGRAL_MAX_BITS >= 64 */
|
|
|
|
#ifndef _WSTAT_DEFINED
|
|
#define _WSTAT_DEFINED
|
|
|
|
_CRTIMP
|
|
int
|
|
__cdecl
|
|
_wstat(
|
|
_In_z_ const wchar_t *_Name,
|
|
_Out_ struct _stat *_Stat);
|
|
|
|
_CRTIMP
|
|
int
|
|
__cdecl
|
|
_wstat32(
|
|
_In_z_ const wchar_t *_Name,
|
|
_Out_ struct _stat32 *_Stat);
|
|
|
|
#if _INTEGRAL_MAX_BITS >= 64
|
|
_CRTIMP
|
|
int
|
|
__cdecl
|
|
_wstat32i64(
|
|
_In_z_ const wchar_t *_Name,
|
|
_Out_ struct _stat32i64 *_Stat);
|
|
|
|
_CRTIMP
|
|
int
|
|
__cdecl
|
|
_wstat64i32(
|
|
_In_z_ const wchar_t *_Name,
|
|
_Out_ struct _stat64i32 *_Stat);
|
|
|
|
_CRTIMP
|
|
int
|
|
__cdecl
|
|
_wstat64(
|
|
_In_z_ const wchar_t *_Name,
|
|
_Out_ struct _stat64 *_Stat);
|
|
|
|
#endif /* _INTEGRAL_MAX_BITS >= 64 */
|
|
|
|
#endif /* _WSTAT_DEFINED */
|
|
|
|
|
|
/** Compatibility definitons *************************************************/
|
|
|
|
#if !defined(RC_INVOKED)
|
|
|
|
#ifdef _USE_32BIT_TIME_T
|
|
#define _fstat32 _fstat
|
|
#define _fstat32i64 _fstati64
|
|
#define _fstat64i32 _fstat64
|
|
#else
|
|
#define _fstat64i32 _fstat
|
|
__CRT_INLINE int __cdecl _fstat32(int _FileDes, struct _stat32 *_Stat)
|
|
{
|
|
struct _stat _Stat64;
|
|
int ret = _fstat(_FileDes, &_Stat64);
|
|
_Stat->st_dev = _Stat64.st_dev;
|
|
_Stat->st_ino = _Stat64.st_ino;
|
|
_Stat->st_mode = _Stat64.st_mode;
|
|
_Stat->st_nlink = _Stat64.st_nlink;
|
|
_Stat->st_uid = _Stat64.st_uid;
|
|
_Stat->st_gid = _Stat64.st_gid;
|
|
_Stat->st_rdev = _Stat64.st_rdev;
|
|
_Stat->st_size = _Stat64.st_size;
|
|
_Stat->st_atime = (__time32_t)_Stat64.st_atime;
|
|
_Stat->st_mtime = (__time32_t)_Stat64.st_mtime;
|
|
_Stat->st_ctime = (__time32_t)_Stat64.st_ctime;
|
|
return ret;
|
|
}
|
|
__CRT_INLINE int __cdecl _fstat32i64(int _FileDes, struct _stat32i64 *_Stat)
|
|
{
|
|
struct _stat64 _Stat64;
|
|
int ret = _fstat64(_FileDes, &_Stat64);
|
|
_Stat->st_dev = _Stat64.st_dev;
|
|
_Stat->st_ino = _Stat64.st_ino;
|
|
_Stat->st_mode = _Stat64.st_mode;
|
|
_Stat->st_nlink = _Stat64.st_nlink;
|
|
_Stat->st_uid = _Stat64.st_uid;
|
|
_Stat->st_gid = _Stat64.st_gid;
|
|
_Stat->st_rdev = _Stat64.st_rdev;
|
|
_Stat->st_size = _Stat64.st_size;
|
|
_Stat->st_atime = (__time32_t)_Stat64.st_atime;
|
|
_Stat->st_mtime = (__time32_t)_Stat64.st_mtime;
|
|
_Stat->st_ctime = (__time32_t)_Stat64.st_ctime;
|
|
return ret;
|
|
}
|
|
#endif /* _USE_32BIT_TIME_T */
|
|
|
|
#endif /* !defined(RC_INVOKED) */
|
|
|
|
#ifndef NO_OLDNAMES
|
|
#define _S_IFBLK 0x6000 /* Block: Is this ever set under w32? */
|
|
|
|
#define S_IFMT _S_IFMT
|
|
#define S_IFDIR _S_IFDIR
|
|
#define S_IFCHR _S_IFCHR
|
|
#define S_IFREG _S_IFREG
|
|
#define S_IREAD _S_IREAD
|
|
#define S_IWRITE _S_IWRITE
|
|
#define S_IEXEC _S_IEXEC
|
|
#define S_IFIFO _S_IFIFO
|
|
#define S_IFBLK _S_IFBLK
|
|
|
|
#define _S_IRWXU (_S_IREAD | _S_IWRITE | _S_IEXEC)
|
|
#define _S_IXUSR _S_IEXEC
|
|
#define _S_IWUSR _S_IWRITE
|
|
|
|
#define S_IRWXU _S_IRWXU
|
|
#define S_IXUSR _S_IXUSR
|
|
#define S_IWUSR _S_IWUSR
|
|
#define S_IRUSR _S_IRUSR
|
|
#define _S_IRUSR _S_IREAD
|
|
|
|
#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
|
|
#define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
|
|
#define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
|
|
#define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
|
|
#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
|
|
|
|
#if !defined (RC_INVOKED)
|
|
_CRTIMP int __cdecl stat(const char *_Filename,struct stat *_Stat);
|
|
_CRTIMP int __cdecl fstat(int _Desc,struct stat *_Stat);
|
|
_CRTIMP int __cdecl wstat(const wchar_t *_Filename,struct stat *_Stat);
|
|
__CRT_INLINE int __cdecl fstat(int _Desc,struct stat *_Stat) {
|
|
return _fstat(_Desc,(struct _stat *)_Stat);
|
|
}
|
|
|
|
__CRT_INLINE int __cdecl stat(const char *_Filename,struct stat *_Stat) {
|
|
return _stat(_Filename,(struct _stat *)_Stat);
|
|
}
|
|
|
|
__CRT_INLINE int __cdecl wstat(const wchar_t *_Filename,struct stat *_Stat) {
|
|
return _wstat(_Filename,(struct _stat *)_Stat);
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif /* !NO_OLDNAMES */
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#pragma pack(pop)
|
|
#endif
|