From 881de0ebf2cf29892bcc0597b82093252caf4e2f Mon Sep 17 00:00:00 2001 From: Karsten Blees Date: Fri, 25 Sep 2015 18:02:55 +0200 Subject: [PATCH] Win32: replace MSVCRT's fstat() with a Win32-based implementation fstat() is the only stat-related CRT function for which we don't have a full replacement yet (and thus the only reason to stick with MSVCRT's 'struct stat' definition). Fully implement fstat(), in preparation of implementing a POSIX 2013 compatible 'struct stat' with nanosecond-precision file times. Signed-off-by: Karsten Blees --- compat/mingw.c | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/compat/mingw.c b/compat/mingw.c index c057819f16e9db..fb793cd66a1d73 100644 --- a/compat/mingw.c +++ b/compat/mingw.c @@ -792,18 +792,31 @@ int mingw_stat(const char *file_name, struct stat *buf) int mingw_fstat(int fd, struct stat *buf) { HANDLE fh = (HANDLE)_get_osfhandle(fd); - if (fh == INVALID_HANDLE_VALUE) { + DWORD avail, type = GetFileType(fh) & ~FILE_TYPE_REMOTE; + + switch (type) { + case FILE_TYPE_DISK: + return get_file_info_by_handle(fh, buf); + + case FILE_TYPE_CHAR: + case FILE_TYPE_PIPE: + /* initialize stat fields */ + memset(buf, 0, sizeof(*buf)); + buf->st_nlink = 1; + + if (type == FILE_TYPE_CHAR) { + buf->st_mode = _S_IFCHR; + } else { + buf->st_mode = _S_IFIFO; + if (PeekNamedPipe(fh, NULL, 0, NULL, &avail, NULL)) + buf->st_size = avail; + } + return 0; + + default: errno = EBADF; return -1; } - /* direct non-file handles to MS's fstat() */ - if (GetFileType(fh) != FILE_TYPE_DISK) - return _fstati64(fd, buf); - - if (!get_file_info_by_handle(fh, buf)) - return 0; - errno = EBADF; - return -1; } static inline void time_t_to_filetime(time_t t, FILETIME *ft)