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