@@ -715,9 +715,9 @@ int mingw_lstat(const char *file_name, struct stat *buf)
715
715
buf -> st_size = S_ISLNK (buf -> st_mode ) ? MAX_LONG_PATH :
716
716
fdata .nFileSizeLow | (((off_t ) fdata .nFileSizeHigh ) << 32 );
717
717
buf -> st_dev = buf -> st_rdev = 0 ; /* not used by Git */
718
- buf -> st_atime = filetime_to_time_t (& (fdata .ftLastAccessTime ));
719
- buf -> st_mtime = filetime_to_time_t (& (fdata .ftLastWriteTime ));
720
- buf -> st_ctime = filetime_to_time_t (& (fdata .ftCreationTime ));
718
+ filetime_to_timespec (& (fdata .ftLastAccessTime ), & ( buf -> st_atim ));
719
+ filetime_to_timespec (& (fdata .ftLastWriteTime ), & ( buf -> st_mtim ));
720
+ filetime_to_timespec (& (fdata .ftCreationTime ), & ( buf -> st_ctim ));
721
721
return 0 ;
722
722
}
723
723
error :
@@ -762,9 +762,9 @@ static int get_file_info_by_handle(HANDLE hnd, struct stat *buf)
762
762
buf -> st_nlink = 1 ;
763
763
buf -> st_mode = file_attr_to_st_mode (fdata .dwFileAttributes , 0 );
764
764
buf -> st_size = fdata .nFileSizeLow | (((off_t ) fdata .nFileSizeHigh ) << 32 );
765
- buf -> st_atime = filetime_to_time_t (& (fdata .ftLastAccessTime ));
766
- buf -> st_mtime = filetime_to_time_t (& (fdata .ftLastWriteTime ));
767
- buf -> st_ctime = filetime_to_time_t (& (fdata .ftCreationTime ));
765
+ filetime_to_timespec (& (fdata .ftLastAccessTime ), & ( buf -> st_atim ));
766
+ filetime_to_timespec (& (fdata .ftLastWriteTime ), & ( buf -> st_mtim ));
767
+ filetime_to_timespec (& (fdata .ftCreationTime ), & ( buf -> st_ctim ));
768
768
return 0 ;
769
769
}
770
770
@@ -792,18 +792,31 @@ int mingw_stat(const char *file_name, struct stat *buf)
792
792
int mingw_fstat (int fd , struct stat * buf )
793
793
{
794
794
HANDLE fh = (HANDLE )_get_osfhandle (fd );
795
- if (fh == INVALID_HANDLE_VALUE ) {
795
+ DWORD avail , type = GetFileType (fh ) & ~FILE_TYPE_REMOTE ;
796
+
797
+ switch (type ) {
798
+ case FILE_TYPE_DISK :
799
+ return get_file_info_by_handle (fh , buf );
800
+
801
+ case FILE_TYPE_CHAR :
802
+ case FILE_TYPE_PIPE :
803
+ /* initialize stat fields */
804
+ memset (buf , 0 , sizeof (* buf ));
805
+ buf -> st_nlink = 1 ;
806
+
807
+ if (type == FILE_TYPE_CHAR ) {
808
+ buf -> st_mode = _S_IFCHR ;
809
+ } else {
810
+ buf -> st_mode = _S_IFIFO ;
811
+ if (PeekNamedPipe (fh , NULL , 0 , NULL , & avail , NULL ))
812
+ buf -> st_size = avail ;
813
+ }
814
+ return 0 ;
815
+
816
+ default :
796
817
errno = EBADF ;
797
818
return -1 ;
798
819
}
799
- /* direct non-file handles to MS's fstat() */
800
- if (GetFileType (fh ) != FILE_TYPE_DISK )
801
- return _fstati64 (fd , buf );
802
-
803
- if (!get_file_info_by_handle (fh , buf ))
804
- return 0 ;
805
- errno = EBADF ;
806
- return -1 ;
807
820
}
808
821
809
822
static inline void time_t_to_filetime (time_t t , FILETIME * ft )
0 commit comments