mingw: 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. This allows us also to implement some clever code to handle pipes and character devices in our own way. Signed-off-by: Karsten Blees <blees@dcon.de> Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
parent
7bf1983886
commit
d75e697353
|
@ -771,20 +771,31 @@ int mingw_stat(const char *file_name, struct stat *buf)
|
||||||
int mingw_fstat(int fd, struct stat *buf)
|
int mingw_fstat(int fd, struct stat *buf)
|
||||||
{
|
{
|
||||||
HANDLE fh = (HANDLE)_get_osfhandle(fd);
|
HANDLE fh = (HANDLE)_get_osfhandle(fd);
|
||||||
|
DWORD avail, type = GetFileType(fh) & ~FILE_TYPE_REMOTE;
|
||||||
|
|
||||||
if (fh == INVALID_HANDLE_VALUE) {
|
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;
|
errno = EBADF;
|
||||||
return -1;
|
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)
|
static inline void time_t_to_filetime(time_t t, FILETIME *ft)
|
||||||
|
|
Loading…
Reference in New Issue