@@ -857,9 +857,9 @@ int mingw_lstat(const char *file_name, struct stat *buf)
857857 buf -> st_size = S_ISLNK (buf -> st_mode ) ? MAX_LONG_PATH :
858858 fdata .nFileSizeLow | (((off_t ) fdata .nFileSizeHigh ) << 32 );
859859 buf -> st_dev = buf -> st_rdev = 0 ; /* not used by Git */
860- buf -> st_atime = filetime_to_time_t (& (fdata .ftLastAccessTime ));
861- buf -> st_mtime = filetime_to_time_t (& (fdata .ftLastWriteTime ));
862- buf -> st_ctime = filetime_to_time_t (& (fdata .ftCreationTime ));
860+ filetime_to_timespec (& (fdata .ftLastAccessTime ), & ( buf -> st_atim ));
861+ filetime_to_timespec (& (fdata .ftLastWriteTime ), & ( buf -> st_mtim ));
862+ filetime_to_timespec (& (fdata .ftCreationTime ), & ( buf -> st_ctim ));
863863 return 0 ;
864864 }
865865error :
@@ -904,9 +904,9 @@ static int get_file_info_by_handle(HANDLE hnd, struct stat *buf)
904904 buf -> st_nlink = 1 ;
905905 buf -> st_mode = file_attr_to_st_mode (fdata .dwFileAttributes , 0 );
906906 buf -> st_size = fdata .nFileSizeLow | (((off_t ) fdata .nFileSizeHigh ) << 32 );
907- buf -> st_atime = filetime_to_time_t (& (fdata .ftLastAccessTime ));
908- buf -> st_mtime = filetime_to_time_t (& (fdata .ftLastWriteTime ));
909- buf -> st_ctime = filetime_to_time_t (& (fdata .ftCreationTime ));
907+ filetime_to_timespec (& (fdata .ftLastAccessTime ), & ( buf -> st_atim ));
908+ filetime_to_timespec (& (fdata .ftLastWriteTime ), & ( buf -> st_mtim ));
909+ filetime_to_timespec (& (fdata .ftCreationTime ), & ( buf -> st_ctim ));
910910 return 0 ;
911911}
912912
@@ -934,18 +934,31 @@ int mingw_stat(const char *file_name, struct stat *buf)
934934int mingw_fstat (int fd , struct stat * buf )
935935{
936936 HANDLE fh = (HANDLE )_get_osfhandle (fd );
937- if (fh == INVALID_HANDLE_VALUE ) {
937+ DWORD avail , type = GetFileType (fh ) & ~FILE_TYPE_REMOTE ;
938+
939+ switch (type ) {
940+ case FILE_TYPE_DISK :
941+ return get_file_info_by_handle (fh , buf );
942+
943+ case FILE_TYPE_CHAR :
944+ case FILE_TYPE_PIPE :
945+ /* initialize stat fields */
946+ memset (buf , 0 , sizeof (* buf ));
947+ buf -> st_nlink = 1 ;
948+
949+ if (type == FILE_TYPE_CHAR ) {
950+ buf -> st_mode = _S_IFCHR ;
951+ } else {
952+ buf -> st_mode = _S_IFIFO ;
953+ if (PeekNamedPipe (fh , NULL , 0 , NULL , & avail , NULL ))
954+ buf -> st_size = avail ;
955+ }
956+ return 0 ;
957+
958+ default :
938959 errno = EBADF ;
939960 return -1 ;
940961 }
941- /* direct non-file handles to MS's fstat() */
942- if (GetFileType (fh ) != FILE_TYPE_DISK )
943- return _fstati64 (fd , buf );
944-
945- if (!get_file_info_by_handle (fh , buf ))
946- return 0 ;
947- errno = EBADF ;
948- return -1 ;
949962}
950963
951964static inline void time_t_to_filetime (time_t t , FILETIME * ft )
0 commit comments