Hi, this is third version of my patch series that introduces POSIX-style atomic renames on Windows to fix concurrent writes with the reftable backend. Changes compared to v2: - Use `DWORD` instead of `int` to store the `access` flags. - Fix handling of `oflags`. - Add a comment referring to `mingw_open_append()` for why convert `ERROR_INVALID_PARAMETER` to `ERROR_PATH_NOT_FOUND`. Thanks! Patrick Patrick Steinhardt (3): compat/mingw: share file handles created via `CreateFileW()` compat/mingw: allow deletion of most opened files compat/mingw: support POSIX semantics for atomic renames compat/mingw.c | 157 +++++++++++++++++++++++++++++++++++-- t/t0610-reftable-basics.sh | 8 +- 2 files changed, 156 insertions(+), 9 deletions(-) Range-diff against v2: 1: 63c2cfa87a4 = 1: 63c2cfa87a4 compat/mingw: share file handles created via `CreateFileW()` 2: c308eafbbb5 ! 2: 91d434116f3 compat/mingw: allow deletion of most opened files @@ compat/mingw.c: static int mingw_open_append(wchar_t const *wfilename, int oflag + .bInheritHandle = !(oflags & O_NOINHERIT), + }; + HANDLE handle; -+ int access; ++ DWORD access; + int fd; + + /* We only support basic flags. */ @@ compat/mingw.c: static int mingw_open_append(wchar_t const *wfilename, int oflag + return -1; + } + -+ if (oflags & O_RDWR) ++ switch (oflags & O_ACCMODE) { ++ case O_RDWR: + access = GENERIC_READ | GENERIC_WRITE; -+ else if (oflags & O_WRONLY) ++ break; ++ case O_WRONLY: + access = GENERIC_WRITE; -+ else ++ break; ++ default: + access = GENERIC_READ; ++ break; ++ } + + handle = CreateFileW(filename, access, + FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE, + &security_attributes, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (handle == INVALID_HANDLE_VALUE) { + DWORD err = GetLastError(); ++ ++ /* See `mingw_open_append()` for why we have this conversion. */ + if (err == ERROR_INVALID_PARAMETER) + err = ERROR_PATH_NOT_FOUND; ++ + errno = err_win_to_posix(err); + return -1; + } 3: ee1e92e593e = 3: 2447d332a85 compat/mingw: support POSIX semantics for atomic renames -- 2.47.0.118.gfd3785337b.dirty