@@ -734,9 +734,9 @@ int mingw_lstat(const char *file_name, struct stat *buf)
734734 buf -> st_size = S_ISLNK (buf -> st_mode ) ? MAX_LONG_PATH :
735735 fdata .nFileSizeLow | (((off_t ) fdata .nFileSizeHigh ) << 32 );
736736 buf -> st_dev = buf -> st_rdev = 0 ; /* not used by Git */
737- buf -> st_atime = filetime_to_time_t (& (fdata .ftLastAccessTime ));
738- buf -> st_mtime = filetime_to_time_t (& (fdata .ftLastWriteTime ));
739- buf -> st_ctime = filetime_to_time_t (& (fdata .ftCreationTime ));
737+ filetime_to_timespec (& (fdata .ftLastAccessTime ), & ( buf -> st_atim ));
738+ filetime_to_timespec (& (fdata .ftLastWriteTime ), & ( buf -> st_mtim ));
739+ filetime_to_timespec (& (fdata .ftCreationTime ), & ( buf -> st_ctim ));
740740 return 0 ;
741741 }
742742error :
@@ -781,9 +781,9 @@ static int get_file_info_by_handle(HANDLE hnd, struct stat *buf)
781781 buf -> st_nlink = 1 ;
782782 buf -> st_mode = file_attr_to_st_mode (fdata .dwFileAttributes , 0 );
783783 buf -> st_size = fdata .nFileSizeLow | (((off_t ) fdata .nFileSizeHigh ) << 32 );
784- buf -> st_atime = filetime_to_time_t (& (fdata .ftLastAccessTime ));
785- buf -> st_mtime = filetime_to_time_t (& (fdata .ftLastWriteTime ));
786- buf -> st_ctime = filetime_to_time_t (& (fdata .ftCreationTime ));
784+ filetime_to_timespec (& (fdata .ftLastAccessTime ), & ( buf -> st_atim ));
785+ filetime_to_timespec (& (fdata .ftLastWriteTime ), & ( buf -> st_mtim ));
786+ filetime_to_timespec (& (fdata .ftCreationTime ), & ( buf -> st_ctim ));
787787 return 0 ;
788788}
789789
@@ -811,18 +811,31 @@ int mingw_stat(const char *file_name, struct stat *buf)
811811int mingw_fstat (int fd , struct stat * buf )
812812{
813813 HANDLE fh = (HANDLE )_get_osfhandle (fd );
814- if (fh == INVALID_HANDLE_VALUE ) {
814+ DWORD avail , type = GetFileType (fh ) & ~FILE_TYPE_REMOTE ;
815+
816+ switch (type ) {
817+ case FILE_TYPE_DISK :
818+ return get_file_info_by_handle (fh , buf );
819+
820+ case FILE_TYPE_CHAR :
821+ case FILE_TYPE_PIPE :
822+ /* initialize stat fields */
823+ memset (buf , 0 , sizeof (* buf ));
824+ buf -> st_nlink = 1 ;
825+
826+ if (type == FILE_TYPE_CHAR ) {
827+ buf -> st_mode = _S_IFCHR ;
828+ } else {
829+ buf -> st_mode = _S_IFIFO ;
830+ if (PeekNamedPipe (fh , NULL , 0 , NULL , & avail , NULL ))
831+ buf -> st_size = avail ;
832+ }
833+ return 0 ;
834+
835+ default :
815836 errno = EBADF ;
816837 return -1 ;
817838 }
818- /* direct non-file handles to MS's fstat() */
819- if (GetFileType (fh ) != FILE_TYPE_DISK )
820- return _fstati64 (fd , buf );
821-
822- if (!get_file_info_by_handle (fh , buf ))
823- return 0 ;
824- errno = EBADF ;
825- return -1 ;
826839}
827840
828841static inline void time_t_to_filetime (time_t t , FILETIME * ft )
0 commit comments