Commit WIP. Part 1 of ??
[reactos.git] / reactos / include / crt / sys / stat.h
index 34019d0..bababc7 100644 (file)
-/*
- * stat.h
+/**
  * This file has no copyright assigned and is placed in the Public Domain.
- * This file is a part of the mingw-runtime package.
- * No warranty is given; refer to the file DISCLAIMER within the package.
- *
- * Symbolic constants for opening and creating files, also stat, fstat and
- * chmod functions.
- *
+ * 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 _STAT_H_
-#define _STAT_H_
+#ifndef _WIN32
+#error Only Win32 target is supported!
+#endif
 
-/* All the headers include this file. */
 #include <_mingw.h>
+#include <io.h>
 
-#define __need_size_t
-#define __need_wchar_t
-#ifndef RC_INVOKED
-#include <stddef.h>
-#endif /* Not RC_INVOKED */
+#pragma pack(push,_CRT_PACKING)
 
-#include <sys/types.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
 
-/*
- * Constants for the stat st_mode member.
- */
-#define        _S_IFIFO        0x1000  /* FIFO */
-#define        _S_IFCHR        0x2000  /* Character */
-#define        _S_IFBLK        0x3000  /* Block: Is this ever set under w32? */
-#define        _S_IFDIR        0x4000  /* Directory */
-#define        _S_IFREG        0x8000  /* Regular */
+#ifndef _CRTIMP
+#define _CRTIMP __declspec(dllimport)
+#endif
 
-#define        _S_IFMT         0xF000  /* File type mask */
+#include <sys/types.h>
 
-#define        _S_IEXEC        0x0040
-#define        _S_IWRITE       0x0080
-#define        _S_IREAD        0x0100
+#ifdef _USE_32BIT_TIME_T
+#ifdef _WIN64
+#undef _USE_32BIT_TIME_T
+#endif
+#else
+#if _INTEGRAL_MAX_BITS < 64
+#define _USE_32BIT_TIME_T
+#endif
+#endif
 
-#define        _S_IRWXU        (_S_IREAD | _S_IWRITE | _S_IEXEC)
-#define        _S_IXUSR        _S_IEXEC
-#define        _S_IWUSR        _S_IWRITE
-#define        _S_IRUSR        _S_IREAD
+#ifndef _TIME32_T_DEFINED
+  typedef long __time32_t;
+#define _TIME32_T_DEFINED
+#endif
 
-#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)
+#ifndef _TIME64_T_DEFINED
+#if _INTEGRAL_MAX_BITS >= 64
+  typedef __int64 __time64_t;
+#endif
+#define _TIME64_T_DEFINED
+#endif
 
-#ifndef _NO_OLDNAMES
+#ifndef _TIME_T_DEFINED
+#ifdef _USE_32BIT_TIME_T
+  typedef __time32_t time_t;
+#else
+  typedef __time64_t time_t;
+#endif
+#define _TIME_T_DEFINED
+#endif
 
-#define        S_IFIFO         _S_IFIFO
-#define        S_IFCHR         _S_IFCHR
-#define        S_IFBLK         _S_IFBLK
-#define        S_IFDIR         _S_IFDIR
-#define        S_IFREG         _S_IFREG
-#define        S_IFMT          _S_IFMT
-#define        S_IEXEC         _S_IEXEC
-#define        S_IWRITE        _S_IWRITE
-#define        S_IREAD         _S_IREAD
-#define        S_IRWXU         _S_IRWXU
-#define        S_IXUSR         _S_IXUSR
-#define        S_IWUSR         _S_IWUSR
-#define        S_IRUSR         _S_IRUSR
+#ifndef _WCHAR_T_DEFINED
+  typedef unsigned short wchar_t;
+#define _WCHAR_T_DEFINED
+#endif
 
-#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)
+#ifndef _STAT_DEFINED
 
-#endif /* Not _NO_OLDNAMES */
+#ifdef _USE_32BIT_TIME_T
+#ifndef _WIN64
+#define _fstat32 _fstat
+#define _stat32 _stat
+#define _wstat32 _wstat
+#else
+#define _fstat _fstat32
+#define _stat _stat32
+#define _wstat _wstat32
+#endif
+#define _fstati64 _fstat32i64
+#define _stati64 _stat32i64
+#define _wstati64 _wstat32i64
+#else
+#define _fstat _fstat64i32
+#define _fstati64 _fstat64
+#define _stat _stat64i32
+#define _stati64 _stat64
+#define _wstat _wstat64i32
+#define _wstati64 _wstat64
+#endif
 
-#ifndef RC_INVOKED
+  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;
+  };
 
-#ifndef _STAT_DEFINED
-/*
- * The structure manipulated and returned by stat and fstat.
- *
- * NOTE: If called on a directory the values in the time fields are not only
- * invalid, they will cause localtime et. al. to return NULL. And calling
- * asctime with a NULL pointer causes an Invalid Page Fault. So watch it!
- */
-struct _stat
-{
-       _dev_t  st_dev;         /* Equivalent to drive number 0=A 1=B ... */
-       _ino_t  st_ino;         /* Always zero ? */
-       _mode_t st_mode;        /* See above constants */
-       short   st_nlink;       /* Number of links. */
-       short   st_uid;         /* User: Maybe significant on NT ? */
-       short   st_gid;         /* Group: Ditto */
-       _dev_t  st_rdev;        /* Seems useless (not even filled in) */
-       _off_t  st_size;        /* File size in bytes */
-       time_t  st_atime;       /* Accessed date (always 00:00 hrs local
-                                * on FAT) */
-       time_t  st_mtime;       /* Modified time */
-       time_t  st_ctime;       /* Creation time */
-};
-
-#ifndef        _NO_OLDNAMES
-/* NOTE: Must be the same as _stat above. */
-struct stat
-{
-       _dev_t  st_dev;         /* Equivalent to drive number 0=A 1=B ... */
-       _ino_t  st_ino;         /* Always zero ? */
-       _mode_t st_mode;        /* See above constants */
-       short   st_nlink;       /* Number of links. */
-       short   st_uid;         /* User: Maybe significant on NT ? */
-       short   st_gid;         /* Group: Ditto */
-       _dev_t  st_rdev;        /* Seems useless (not even filled in) */
-       _off_t  st_size;        /* File size in bytes */
-       time_t  st_atime;       /* Accessed date (always 00:00 hrs local
-                                * on FAT) */
-       time_t  st_mtime;       /* Modified time */
-       time_t  st_ctime;       /* Creation time */
-};
-#endif /* _NO_OLDNAMES */
-
-#if defined (__MSVCRT__)
-struct _stati64 {
+#ifndef        NO_OLDNAMES
+  struct stat {
     _dev_t st_dev;
     _ino_t st_ino;
     unsigned short st_mode;
@@ -127,17 +108,45 @@ struct _stati64 {
     short st_uid;
     short st_gid;
     _dev_t st_rdev;
-    __int64 st_size;
+    _off_t st_size;
     time_t st_atime;
     time_t st_mtime;
     time_t st_ctime;
-};
+  };
+#endif
+
+  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
-{
+  struct _stat64 {
     _dev_t st_dev;
     _ino_t st_ino;
-    _mode_t st_mode;
+    unsigned short st_mode;
     short st_nlink;
     short st_uid;
     short st_gid;
@@ -146,50 +155,132 @@ struct __stat64
     __time64_t st_atime;
     __time64_t st_mtime;
     __time64_t st_ctime;
-};
-#endif /* __MSVCRT__ */
+  };
+
+#define __stat64 _stat64
+
 #define _STAT_DEFINED
-#endif /* _STAT_DEFINED */
+#endif
 
-#ifdef __cplusplus
-extern "C" {
+#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 _fstat32(int _FileDes,struct _stat32 *_Stat);
+  _CRTIMP int __cdecl _stat32(const char *_Name,struct _stat32 *_Stat);
+#if _INTEGRAL_MAX_BITS >= 64
+  _CRTIMP int __cdecl _fstat64(int _FileDes,struct _stat64 *_Stat);
+  _CRTIMP int __cdecl _fstat32i64(int _FileDes,struct _stat32i64 *_Stat);
+  int __cdecl _fstat64i32(int _FileDes,struct _stat64i32 *_Stat);
+  __CRT_INLINE int __cdecl _fstat64i32(int _FileDes,struct _stat64i32 *_Stat)
+  {
+    struct _stat64 st;
+    int ret=_fstat64(_FileDes,&st);
+    _Stat->st_dev=st.st_dev;
+    _Stat->st_ino=st.st_ino;
+    _Stat->st_mode=st.st_mode;
+    _Stat->st_nlink=st.st_nlink;
+    _Stat->st_uid=st.st_uid;
+    _Stat->st_gid=st.st_gid;
+    _Stat->st_rdev=st.st_rdev;
+    _Stat->st_size=(_off_t) st.st_size;
+    _Stat->st_atime=st.st_atime;
+    _Stat->st_mtime=st.st_mtime;
+    _Stat->st_ctime=st.st_ctime;
+    return ret;
+  }
+  _CRTIMP int __cdecl _stat64(const char *_Name,struct _stat64 *_Stat);
+  _CRTIMP int __cdecl _stat32i64(const char *_Name,struct _stat32i64 *_Stat);
+  int __cdecl _stat64i32(const char *_Name,struct _stat64i32 *_Stat);
+  __CRT_INLINE int __cdecl _stat64i32(const char *_Name,struct _stat64i32 *_Stat)
+  {
+    struct _stat64 st;
+    int ret=_stat64(_Name,&st);
+    _Stat->st_dev=st.st_dev;
+    _Stat->st_ino=st.st_ino;
+    _Stat->st_mode=st.st_mode;
+    _Stat->st_nlink=st.st_nlink;
+    _Stat->st_uid=st.st_uid;
+    _Stat->st_gid=st.st_gid;
+    _Stat->st_rdev=st.st_rdev;
+    _Stat->st_size=(_off_t) st.st_size;
+    _Stat->st_atime=st.st_atime;
+    _Stat->st_mtime=st.st_mtime;
+    _Stat->st_ctime=st.st_ctime;
+    return ret;
+  }
 #endif
 
-_CRTIMP int __cdecl __MINGW_NOTHROW    _fstat (int, struct _stat*);
-_CRTIMP int __cdecl __MINGW_NOTHROW    _chmod (const char*, int);
-_CRTIMP int __cdecl __MINGW_NOTHROW    _stat (const char*, struct _stat*);
-
-#ifndef        _NO_OLDNAMES
-
-/* These functions live in liboldnames.a. */
-_CRTIMP int __cdecl __MINGW_NOTHROW    fstat (int, struct stat*);
-_CRTIMP int __cdecl __MINGW_NOTHROW    chmod (const char*, int);
-_CRTIMP int __cdecl __MINGW_NOTHROW    stat (const char*, struct stat*);
-
-#endif /* Not _NO_OLDNAMES */
-
-#if defined (__MSVCRT__)
-_CRTIMP int __cdecl __MINGW_NOTHROW  _fstati64(int, struct _stati64 *);
-_CRTIMP int __cdecl __MINGW_NOTHROW  _stati64(const char *, struct _stati64 *);
-/* These require newer versions of msvcrt.dll (6.10 or higher).  */
-#if __MSVCRT_VERSION__ >= 0x0601
-_CRTIMP int __cdecl __MINGW_NOTHROW _fstat64 (int, struct __stat64*);
-_CRTIMP int __cdecl __MINGW_NOTHROW _stat64 (const char*, struct __stat64*);
-#endif /* __MSVCRT_VERSION__ >= 0x0601 */
-#if !defined ( _WSTAT_DEFINED) /* also declared in wchar.h */
-_CRTIMP int __cdecl __MINGW_NOTHROW    _wstat(const wchar_t*, struct _stat*);
-_CRTIMP int __cdecl __MINGW_NOTHROW    _wstati64 (const wchar_t*, struct _stati64*);
-#if __MSVCRT_VERSION__ >= 0x0601
-_CRTIMP int __cdecl __MINGW_NOTHROW _wstat64 (const wchar_t*, struct __stat64*);
-#endif /* __MSVCRT_VERSION__ >= 0x0601 */
+#ifndef _WSTAT_DEFINED
 #define _WSTAT_DEFINED
-#endif /* _WSTAT_DEFIND */
-#endif /* __MSVCRT__ */
+  _CRTIMP int __cdecl _wstat32(const wchar_t *_Name,struct _stat32 *_Stat);
+#if _INTEGRAL_MAX_BITS >= 64
+  _CRTIMP int __cdecl _wstat32i64(const wchar_t *_Name,struct _stat32i64 *_Stat);
+  int __cdecl _wstat64i32(const wchar_t *_Name,struct _stat64i32 *_Stat);
+  _CRTIMP int __cdecl _wstat64(const wchar_t *_Name,struct _stat64 *_Stat);
+#endif
+#endif
+
+#ifndef        NO_OLDNAMES
+#define        _S_IFBLK        0x3000  /* 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)
 
-#ifdef __cplusplus
+#endif
+
+#if !defined (RC_INVOKED) && !defined (NO_OLDNAMES)
+int __cdecl stat(const char *_Filename,struct stat *_Stat);
+int __cdecl fstat(int _Desc,struct stat *_Stat);
+int __cdecl wstat(const wchar_t *_Filename,struct stat *_Stat);
+#ifdef _USE_32BIT_TIME_T
+__CRT_INLINE int __cdecl fstat(int _Desc,struct stat *_Stat) {
+  return _fstat32(_Desc,(struct _stat32 *)_Stat);
+}
+__CRT_INLINE int __cdecl stat(const char *_Filename,struct stat *_Stat) {
+  return _stat32(_Filename,(struct _stat32 *)_Stat);
 }
+#else
+__CRT_INLINE int __cdecl fstat(int _Desc,struct stat *_Stat) {
+  return _fstat64i32(_Desc,(struct _stat64i32 *)_Stat);
+}
+__CRT_INLINE int __cdecl stat(const char *_Filename,struct stat *_Stat) {
+  return _stat64i32(_Filename,(struct _stat64i32 *)_Stat);
+}
+#endif
 #endif
 
-#endif /* Not RC_INVOKED */
+#ifdef __cplusplus
+}
+#endif
 
-#endif /* Not _STAT_H_ */
+#pragma pack(pop)
+#endif