3b661427936e8345d923aba4a444068779f1a4e6
[reactos.git] / lib / crtdll / sys_stat / fstat.c
1 /* $Id$
2  *
3  * COPYRIGHT:   See COPYING in the top level directory
4  * PROJECT:     ReactOS system libraries
5  * FILE:        lib/crtdll/sys/fstat.c
6  * PURPOSE:     Gather file information
7  * PROGRAMER:   Boudewijn Dekker
8  * UPDATE HISTORY:
9  *              28/12/98: Created
10  */
11 #include <windows.h>
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>
18
19
20 /*
21  * @implemented
22  */
23 int _fstat(int fd, struct stat* statbuf)
24 {
25     BY_HANDLE_FILE_INFORMATION FileInformation;
26
27     if (!statbuf) {
28         __set_errno(EINVAL);
29         return -1;
30     }
31
32     if (!GetFileInformationByHandle(_get_osfhandle(fd),&FileInformation)) {
33         __set_errno (EBADF);
34         return -1;
35     }
36     statbuf->st_ctime = FileTimeToUnixTime(&FileInformation.ftCreationTime,NULL);
37     statbuf->st_atime = FileTimeToUnixTime(&FileInformation.ftLastAccessTime,NULL);
38     statbuf->st_mtime = FileTimeToUnixTime(&FileInformation.ftLastWriteTime,NULL);
39     if (statbuf->st_atime ==0)
40         statbuf->st_atime = statbuf->st_mtime;
41     if (statbuf->st_ctime ==0)
42         statbuf->st_ctime = statbuf->st_mtime;
43
44     statbuf->st_dev = FileInformation.dwVolumeSerialNumber;
45     statbuf->st_size = FileInformation.nFileSizeLow;
46     statbuf->st_nlink = FileInformation.nNumberOfLinks;
47     statbuf->st_mode = S_IREAD;
48     if (FileInformation.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
49         statbuf->st_mode |= S_IFDIR | S_IEXEC;
50     else
51         statbuf->st_mode |= S_IFREG;
52     if (!(FileInformation.dwFileAttributes & FILE_ATTRIBUTE_READONLY))
53         statbuf->st_mode |= S_IWRITE;
54     return 0;
55 }