@@ -732,9 +732,9 @@ int mingw_lstat(const char *file_name, struct stat *buf)
732732 buf -> st_size = S_ISLNK (buf -> st_mode ) ? MAX_LONG_PATH :
733733 fdata .nFileSizeLow | (((off_t ) fdata .nFileSizeHigh ) << 32 );
734734 buf -> st_dev = buf -> st_rdev = 0 ; /* not used by Git */
735- buf -> st_atime = filetime_to_time_t (& (fdata .ftLastAccessTime ));
736- buf -> st_mtime = filetime_to_time_t (& (fdata .ftLastWriteTime ));
737- buf -> st_ctime = filetime_to_time_t (& (fdata .ftCreationTime ));
735+ filetime_to_timespec (& (fdata .ftLastAccessTime ), & ( buf -> st_atim ));
736+ filetime_to_timespec (& (fdata .ftLastWriteTime ), & ( buf -> st_mtim ));
737+ filetime_to_timespec (& (fdata .ftCreationTime ), & ( buf -> st_ctim ));
738738 return 0 ;
739739 }
740740error :
@@ -779,9 +779,9 @@ static int get_file_info_by_handle(HANDLE hnd, struct stat *buf)
779779 buf -> st_nlink = 1 ;
780780 buf -> st_mode = file_attr_to_st_mode (fdata .dwFileAttributes , 0 );
781781 buf -> st_size = fdata .nFileSizeLow | (((off_t ) fdata .nFileSizeHigh ) << 32 );
782- buf -> st_atime = filetime_to_time_t (& (fdata .ftLastAccessTime ));
783- buf -> st_mtime = filetime_to_time_t (& (fdata .ftLastWriteTime ));
784- buf -> st_ctime = filetime_to_time_t (& (fdata .ftCreationTime ));
782+ filetime_to_timespec (& (fdata .ftLastAccessTime ), & ( buf -> st_atim ));
783+ filetime_to_timespec (& (fdata .ftLastWriteTime ), & ( buf -> st_mtim ));
784+ filetime_to_timespec (& (fdata .ftCreationTime ), & ( buf -> st_ctim ));
785785 return 0 ;
786786}
787787
@@ -809,18 +809,31 @@ int mingw_stat(const char *file_name, struct stat *buf)
809809int mingw_fstat (int fd , struct stat * buf )
810810{
811811 HANDLE fh = (HANDLE )_get_osfhandle (fd );
812- if (fh == INVALID_HANDLE_VALUE ) {
812+ DWORD avail , type = GetFileType (fh ) & ~FILE_TYPE_REMOTE ;
813+
814+ switch (type ) {
815+ case FILE_TYPE_DISK :
816+ return get_file_info_by_handle (fh , buf );
817+
818+ case FILE_TYPE_CHAR :
819+ case FILE_TYPE_PIPE :
820+ /* initialize stat fields */
821+ memset (buf , 0 , sizeof (* buf ));
822+ buf -> st_nlink = 1 ;
823+
824+ if (type == FILE_TYPE_CHAR ) {
825+ buf -> st_mode = _S_IFCHR ;
826+ } else {
827+ buf -> st_mode = _S_IFIFO ;
828+ if (PeekNamedPipe (fh , NULL , 0 , NULL , & avail , NULL ))
829+ buf -> st_size = avail ;
830+ }
831+ return 0 ;
832+
833+ default :
813834 errno = EBADF ;
814835 return -1 ;
815836 }
816- /* direct non-file handles to MS's fstat() */
817- if (GetFileType (fh ) != FILE_TYPE_DISK )
818- return _fstati64 (fd , buf );
819-
820- if (!get_file_info_by_handle (fh , buf ))
821- return 0 ;
822- errno = EBADF ;
823- return -1 ;
824837}
825838
826839static inline void time_t_to_filetime (time_t t , FILETIME * ft )
0 commit comments