On Sunday 02 March 2025 18:46:49 Lasse Collin wrote:
> On 2025-02-27 Pali Rohár wrote:
> > I did not wanted to open also this discussion about stat, but as you
> > have opened it, I write some important details, which needs to be
> > taken into account, otherwise another breakage can happen.
>
> Thank you for writing it! It is useful. I apologize if opening this
> thread was bad timing.
>
> > But let this mess as is, all those are underscored functions which MS
> > somehow defined and it is well known API/ABI.
>
> Here was my main confusion a few emails ago and why I opened this
> thread: With UCRT, even _stat64i32 has mingw-w64-specific behavior.
> This felt unexpected because it's a Microsoft function, not POSIX. When
> _stat is defined to _stat64i32, _stat is affected too. It was extra
> confusing because of the inline function that appears only when
> optimizations are enabled.
>
> The trailing slash removal was added in the commit 32ec57d19d96
> ("_mingw_no_trailing_slash() for _stat64i32() and _wstat64i32()") in
> 2017. The commit message only has that one line, giving no hints why the
> change was made. <sys/stat.h> wasn't modified, thus the inline function
> _stat64i32 got out of sync with the code in _stat64i32.c. There is no
> inline function _wstat64i32. Thus, most of the time this commit made no
> difference to the code that calls _stat64i32.
>
> From the mailing list, I only found [1] which explains why 02ad8d9cc38a
> ("fix for previous commit") was made. I didn't find anything else, but
> I didn't search much either.
>
> If these two commits were reverted, I suppose UCRT's _stat64i32 should
> work correctly with optimizations disabled (I didn't test). With
> correctly I mean having whatever behavior the MS CRT function has. As a
> side effect, stat (without underscore) with UCRT would behave better
> when the #defines are such that stat calls _stat64i32.
>
> [1]
> https://sourceforge.net/p/mingw-w64/mailman/mingw-w64-public/thread/alpine.DEB.2.20.1708031327560.2300%40cone.martin.st/
>
> > Now the interesting part is: How should non-underscored POSIX stat()
> > and fstat() behaves?
> >
> > I think that header file for POSIX stat() and fstat() should follow
> > application definition of _USE_32BIT_TIME_T or the largely used the
> > "-D_TIME_BITS=64" or "-D_FILE_OFFSET_BITS=64" compile flags.
>
> Right, I think four versions are needed because POSIX struct stat
> contains both off_t and time_t (in current POSIX, time_t comes via
> struct timespec, and st_mtime macro expands to st_mtim.tv_sec).
>
> > As the msvcrt.dll's _stat() function has somehow strange behavior of
> > trailing slash, for POSIX stat() purposes, it is needed to define
> > mingw-w64 wrapper.
>
> Correct.
>
> > But as there are 4 variants of "-D_TIME_BITS=64" +
> > "-D_FILE_OFFSET_BITS=64" combinations, it is needed to define 4
> > variants of POSIX stat function. Maybe call them similarly: stat32,
> > stat64, stat64i32 and stat32i64.
>
> It's not ideal to add stat64i32 and stat32i64 into the public
> namespace but maybe it's OK in practice. stat64 comes from LFS so in
> that sense it's a standard name. mingw-w64-headers/crt/_mingw_stat64.h
> has these:
>
> #define stat64 _stat64 /* for POSIX */
> #define fstat64 _fstat64 /* for POSIX */
>
> Maybe it could be safest to put the four functions into private
> namespace, naming them like __mingw64_stat64i32. Then the macro stat
> could have four different values and the macro stat64 two different
> values. On the other hand, changing stat64 to depend on _TIME_BITS is
> AP/ABI change. *sigh* I don't know what makes sense now.
>
> > I think that providing any inline function for any stat* variant would
> > just cause a bigger mess. So I would propose to define 4 mingw-w64
> > wrappers (for each variant) and in header file just add a proper
> > #define stat based on the macros configuration.
>
> I agree.
>
> > Similarly it would be needed to define fstat macro, but should just
> > expand to correct _fstat as there is no need for wrapper.
>
> Sounds good too.
>
> However... if the symbols stat and fstat (and maybe stat64 and fstat64)
> don't exist, will Autoconf find those symbols? AC_CHECK_FUNC is overly
> clever (that is, sort of broken) because it doesn't take a parameter to
> specify the headers to include. Simplified, it tries if this can be
> compiled and linked:
>
> char somefunc(void);
>
> int main(void)
> {
> return somefunc();
> return 0;
> }
>
> I don't know if many packages check if stat and fstat are available
> this way. Maybe many enough assume that they just are available. I hope
> this is overworrying and doesn't matter at all. :-)
>
> I suppose improving the POSIX variants isn't a high priority, but maybe
> the _stat64i32 oddity could be worth fixing sooner than the other
> <sys/stat.h> things.
>
> --
> Lasse Collin
As the discussion started, I decided to I looked at these issues. I have
some WIP changes which defines 4 variants of each fstat/stat/wstat
function, then provides also fstat, stat and wstat function declaration
in header file via __MINGW_ASM_CALL redirect and also exports symbols
from import library. With this way it behaves in the same way as ms
_fstat/_stat/_wstat symbols and functions. This should address also the
autoconf issue which is trying to use functions without including header
file, and also ensure that "stat()" call will be 64-bit + 64-bit if both
-D_TIME_BITS=64 and -D_FILE_OFFSET_BITS=64 are defined. At the same
time I added emulation wrapper for _fstat64/_stat64/_wstat64 function
via WinAPI fallback for older msvcrt libraries which do not have them.
What I have not addressed is the bug in the _mingw_no_trailing_slash
function which you described in the other email. Do you want to look at
my changes or test them?
_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public