git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 03/18] mingw: drop the separate `do_lstat()` function

From
Johannes Sixt <j6t@kdbg.org>
Date
Dec 18, 2025, 10:48 UTC
Message-ID
<52d0ef24-ae21-400c-836b-aa43dd5899d2@kdbg.org>
In-Reply-To
<aa0ca80bbb00ec53f359c79719b95bcc141ac85c.1765980535.git.gitgitgadget@gmail.com>
Am 17.12.25 um 15:08 schrieb Karsten Blees via GitGitGadget:
Show 30 quoted lines
> From: Karsten Blees <blees@dcon.de>
> 
> With the new `mingw_stat()` implementation, `do_lstat()` is only called
> from `mingw_lstat()` (with the function parameter `follow == 0`). Remove
> the extra function and the old `mingw_stat()`-specific (`follow == 1`)
> logic.
> 
> Signed-off-by: Karsten Blees <blees@dcon.de>
> Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
> ---
>  compat/mingw.c | 22 ++--------------------
>  1 file changed, 2 insertions(+), 20 deletions(-)
> 
> diff --git a/compat/mingw.c b/compat/mingw.c
> index 59afd69686..ec6c2801d3 100644
> --- a/compat/mingw.c
> +++ b/compat/mingw.c
> @@ -917,14 +917,7 @@ static int has_valid_directory_prefix(wchar_t *wfilename)
>  	return 1;
>  }
>  
> -/* We keep the do_lstat code in a separate function to avoid recursion.
> - * When a path ends with a slash, the stat will fail with ENOENT. In
> - * this case, we strip the trailing slashes and stat again.
> - *
> - * If follow is true then act like stat() and report on the link
> - * target. Otherwise report on the link itself.
> - */
> -static int do_lstat(int follow, const char *file_name, struct stat *buf)
> +int mingw_lstat(const char *file_name, struct stat *buf)

Oh, here goes the entire function including the comment. Fine, then. Disregard my comment on 01/18.

Show 30 quoted lines
>  {
>  	WIN32_FILE_ATTRIBUTE_DATA fdata;
>  	wchar_t wfilename[MAX_PATH];
> @@ -958,13 +951,7 @@ static int do_lstat(int follow, const char *file_name, struct stat *buf)
>  			if (handle != INVALID_HANDLE_VALUE) {
>  				if ((findbuf.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) &&
>  						(findbuf.dwReserved0 == IO_REPARSE_TAG_SYMLINK)) {
> -					if (follow) {
> -						char buffer[MAXIMUM_REPARSE_DATA_BUFFER_SIZE];
> -						buf->st_size = readlink(file_name, buffer, MAXIMUM_REPARSE_DATA_BUFFER_SIZE);
> -					} else {
> -						buf->st_mode = S_IFLNK;
> -					}
> -					buf->st_mode |= S_IREAD;
> +					buf->st_mode = S_IFLNK | S_IREAD;
>  					if (!(findbuf.dwFileAttributes & FILE_ATTRIBUTE_READONLY))
>  						buf->st_mode |= S_IWRITE;
>  				}
> @@ -1022,11 +1009,6 @@ static int get_file_info_by_handle(HANDLE hnd, struct stat *buf)
>  	return 0;
>  }
>  
> -int mingw_lstat(const char *file_name, struct stat *buf)
> -{
> -	return do_lstat(0, file_name, buf);
> -}
> -
>  int mingw_stat(const char *file_name, struct stat *buf)
>  {
>  	wchar_t wfile_name[MAX_PATH];
An obviously correct rewrite.
-- Hannes
Previous: Karsten Blees via GitGitGadgetNext: Karsten Blees via GitGitGadget
Message 8 of 51 in “Support symbolic links on Windows”
  1. 00/18 Support symbolic links on WindowsJohannes Schindelin via GitGitGadget, Dec 17, 2025
  2. 01/18 mingw: don't call `GetFileAttributes()` twice in `mingw_lstat()`Karsten Blees via GitGitGadget, Dec 17, 2025
  3. Johannes SixtDec 18, 2025
  4. 02/18 mingw: implement `stat()` with symlink supportKarsten Blees via GitGitGadget, Dec 17, 2025
  5. Johannes SixtDec 18, 2025
  6. Johannes SchindelinJan 9, 2026
  7. 03/18 mingw: drop the separate `do_lstat()` functionKarsten Blees via GitGitGadget, Dec 17, 2025
  8. Johannes SixtDec 18, 2025
  9. 04/18 mingw: let `mingw_lstat()` error early upon problems with reparse pointsKarsten Blees via GitGitGadget, Dec 17, 2025
  10. 05/18 mingw: teach dirent about symlinksKarsten Blees via GitGitGadget, Dec 17, 2025
  11. 06/18 mingw: compute the correct size for symlinks in `mingw_lstat()`Bill Zissimopoulos via GitGitGadget, Dec 17, 2025
  12. 07/18 mingw: factor out the retry logicKarsten Blees via GitGitGadget, Dec 17, 2025
  13. 08/18 mingw: change default of `core.symlinks` to falseKarsten Blees via GitGitGadget, Dec 17, 2025
  14. 09/18 mingw: add symlink-specific error codesKarsten Blees via GitGitGadget, Dec 17, 2025
  15. 10/18 mingw: handle symlinks to directories in `mingw_unlink()`Karsten Blees via GitGitGadget, Dec 17, 2025
  16. Ben KnobleDec 18, 2025
  17. Johannes SchindelinJan 9, 2026
  18. 11/18 mingw: support renaming symlinksKarsten Blees via GitGitGadget, Dec 17, 2025
  19. Johannes SixtDec 18, 2025
  20. Johannes SchindelinJan 9, 2026
  21. 12/18 mingw: allow `mingw_chdir()` to change to symlink-resolved directoriesKarsten Blees via GitGitGadget, Dec 17, 2025
  22. 13/18 mingw: implement `readlink()`Karsten Blees via GitGitGadget, Dec 17, 2025
  23. Johannes SixtDec 18, 2025
  24. Johannes SchindelinJan 9, 2026
  25. 14/18 mingw: implement basic `symlink()` functionality (file symlinks only)Karsten Blees via GitGitGadget, Dec 17, 2025
  26. 15/18 mingw: add support for symlinks to directoriesKarsten Blees via GitGitGadget, Dec 17, 2025
  27. 16/18 mingw: try to create symlinks without elevated permissionsJohannes Schindelin via GitGitGadget, Dec 17, 2025
  28. 17/18 mingw: emulate `stat()` a little more faithfullyJohannes Schindelin via GitGitGadget, Dec 17, 2025
  29. 18/18 mingw: special-case index entries for symlinks with buggy sizeJohannes Schindelin via GitGitGadget, Dec 17, 2025
  30. Junio C HamanoDec 18, 2025
  31. Johannes SixtDec 18, 2025
  32. Karsten BleesDec 18, 2025
  33. 00/18 Support symbolic links on WindowsJohannes Schindelin via GitGitGadget, Jan 9, 2026
  34. 01/18 mingw: don't call `GetFileAttributes()` twice in `mingw_lstat()`Karsten Blees via GitGitGadget, Jan 9, 2026
  35. 02/18 mingw: implement `stat()` with symlink supportKarsten Blees via GitGitGadget, Jan 9, 2026
  36. 03/18 mingw: drop the separate `do_lstat()` functionKarsten Blees via GitGitGadget, Jan 9, 2026
  37. 04/18 mingw: let `mingw_lstat()` error early upon problems with reparse pointsKarsten Blees via GitGitGadget, Jan 9, 2026
  38. 05/18 mingw: teach dirent about symlinksKarsten Blees via GitGitGadget, Jan 9, 2026
  39. 06/18 mingw: compute the correct size for symlinks in `mingw_lstat()`Bill Zissimopoulos via GitGitGadget, Jan 9, 2026
  40. 07/18 mingw: factor out the retry logicKarsten Blees via GitGitGadget, Jan 9, 2026
  41. 08/18 mingw: change default of `core.symlinks` to falseKarsten Blees via GitGitGadget, Jan 9, 2026
  42. 09/18 mingw: add symlink-specific error codesKarsten Blees via GitGitGadget, Jan 9, 2026
  43. 11/18 mingw: support renaming symlinksKarsten Blees via GitGitGadget, Jan 9, 2026
  44. 10/18 mingw: handle symlinks to directories in `mingw_unlink()`Karsten Blees via GitGitGadget, Jan 9, 2026
  45. 12/18 mingw: allow `mingw_chdir()` to change to symlink-resolved directoriesKarsten Blees via GitGitGadget, Jan 9, 2026
  46. 13/18 mingw: implement `readlink()`Karsten Blees via GitGitGadget, Jan 9, 2026
  47. 14/18 mingw: implement basic `symlink()` functionality (file symlinks only)Karsten Blees via GitGitGadget, Jan 9, 2026
  48. 15/18 mingw: add support for symlinks to directoriesKarsten Blees via GitGitGadget, Jan 9, 2026
  49. 16/18 mingw: try to create symlinks without elevated permissionsJohannes Schindelin via GitGitGadget, Jan 9, 2026
  50. 17/18 mingw: emulate `stat()` a little more faithfullyJohannes Schindelin via GitGitGadget, Jan 9, 2026
  51. 18/18 mingw: special-case index entries for symlinks with buggy sizeJohannes Schindelin via GitGitGadget, Jan 9, 2026

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.