3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: lib/msvcrt/sys/fstat.c
6 * PURPOSE: Gather file information
7 * PROGRAMER: Boudewijn Dekker
12 #include <msvcrt/sys/types.h>
13 #include <msvcrt/sys/stat.h>
14 #include <msvcrt/fcntl.h>
15 #include <msvcrt/string.h>
16 #include <msvcrt/errno.h>
17 #include <msvcrt/internal/file.h>
19 int _fstat(int fd, struct stat *statbuf)
21 BY_HANDLE_FILE_INFORMATION FileInformation;
31 if ((void*)-1 == (handle = _get_osfhandle(fd)))
39 memset (statbuf, 0, sizeof(struct stat));
41 dwFileType = GetFileType(handle);
43 if (dwFileType == FILE_TYPE_DISK)
45 if (!GetFileInformationByHandle(handle,&FileInformation))
50 statbuf->st_ctime = FileTimeToUnixTime(&FileInformation.ftCreationTime,NULL);
51 statbuf->st_atime = FileTimeToUnixTime(&FileInformation.ftLastAccessTime,NULL);
52 statbuf->st_mtime = FileTimeToUnixTime(&FileInformation.ftLastWriteTime,NULL);
55 statbuf->st_size = FileInformation.nFileSizeLow;
56 statbuf->st_mode = S_IREAD;
57 if (FileInformation.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
58 statbuf->st_mode |= S_IFDIR;
60 statbuf->st_mode |= S_IFREG;
61 if (!(FileInformation.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) statbuf->st_mode |= S_IWRITE;
63 else if (dwFileType == FILE_TYPE_CHAR)
66 statbuf->st_mode = S_IFCHR;
68 else if (dwFileType == FILE_TYPE_PIPE)
71 statbuf->st_mode = S_IFIFO;
75 // dwFileType is FILE_TYPE_UNKNOWN or has a bad value
82 __int64 _fstati64 (int fd, struct _stati64* statbuf)
84 BY_HANDLE_FILE_INFORMATION FileInformation;
94 if ((void*)-1 == (handle = _get_osfhandle(fd)))
102 memset(statbuf, 0, sizeof(struct _stati64));
104 dwFileType = GetFileType(handle);
106 if (dwFileType == FILE_TYPE_DISK)
108 if (!GetFileInformationByHandle(handle,&FileInformation))
113 statbuf->st_ctime = FileTimeToUnixTime(&FileInformation.ftCreationTime,NULL);
114 statbuf->st_atime = FileTimeToUnixTime(&FileInformation.ftLastAccessTime,NULL);
115 statbuf->st_mtime = FileTimeToUnixTime(&FileInformation.ftLastWriteTime,NULL);
117 statbuf->st_dev = fd;
118 statbuf->st_size = (((__int64)FileInformation.nFileSizeHigh) << 32) +
119 FileInformation.nFileSizeLow;
120 statbuf->st_mode = S_IREAD;
121 if (FileInformation.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
122 statbuf->st_mode |= S_IFDIR;
124 statbuf->st_mode |= S_IFREG;
125 if (!(FileInformation.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) statbuf->st_mode |= S_IWRITE;
127 else if (dwFileType == FILE_TYPE_CHAR)
129 statbuf->st_dev = fd;
130 statbuf->st_mode = S_IFCHR;
132 else if (dwFileType == FILE_TYPE_PIPE)
134 statbuf->st_dev = fd;
135 statbuf->st_mode = S_IFIFO;
139 // dwFileType is FILE_TYPE_UNKNOWN or has a bad value