@@ -715,9 +715,9 @@ int mingw_lstat(const char *file_name, struct stat *buf)
715715 buf -> st_size = S_ISLNK (buf -> st_mode ) ? MAX_LONG_PATH :
716716 fdata .nFileSizeLow | (((off_t ) fdata .nFileSizeHigh ) << 32 );
717717 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 ));
721721 return 0 ;
722722 }
723723error :
@@ -762,9 +762,9 @@ static int get_file_info_by_handle(HANDLE hnd, struct stat *buf)
762762 buf -> st_nlink = 1 ;
763763 buf -> st_mode = file_attr_to_st_mode (fdata .dwFileAttributes , 0 );
764764 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 ));
768768 return 0 ;
769769}
770770
@@ -792,18 +792,31 @@ int mingw_stat(const char *file_name, struct stat *buf)
792792int mingw_fstat (int fd , struct stat * buf )
793793{
794794 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 :
796817 errno = EBADF ;
797818 return -1 ;
798819 }
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 ;
807820}
808821
809822static inline void time_t_to_filetime (time_t t , FILETIME * ft )
0 commit comments