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 Mingw-w64-public@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mingw-w64-public