Re: [PATCH] Add a fast version of fstat to cygwin port
From: Johannes Sixt <hidden>
Date: 2016-06-15 22:46:25
Alex Riesen schrieb:
Besides, the output of the fast stat and lstat is not compatible with cygwin's fstat with regard to uid, gid and ctime fields.
Why do you need this? I don't think that fstat() is used in a critical path. Do you see problems with the incompatible fields?
This is not strictly related to the other stat patches. The fstat code is shamelessly stolen from the mingw port, sorry.
I wouldn't call it "stolen", but "copied". Because if you copy it, it becomes your responsibility and all copied bugs are yours ;)
BTW, why do we have to #undef fstat, but not stat/lstat?
Because stat and lstat are #defined with an argument list, but in those instances where the cygwin version of stat/lstat is meant, they are used *without* argument list (see cygwin_stat/lstat_stub), and no macro expansion happens, and therefore we don't need to #undef the macro. OTOH, do_fstat calls into cygwin's fstat() if the file handle is not a file and uses an argument list that would cause a macro expansion if it were not #undef'd:
+#undef fstat
+static int cygwin_fstat(int fd, struct stat *buf)
+{
+ HANDLE fh = (HANDLE)_get_osfhandle(fd);
+ BY_HANDLE_FILE_INFORMATION fdata;
+
+ if (fh == INVALID_HANDLE_VALUE) {
+ errno = EBADF;
+ return -1;
+ }
+ /* direct non-file handles to cygwin's fstat() */
+ if (GetFileType(fh) != FILE_TYPE_DISK)
+ return fstat(fd, buf);We never do that for stat/lstat. -- Hannes