All of lore.kernel.org
 help / color / mirror / Atom feed
From: Johannes Schindelin <Johannes.Schindelin@gmx.de>
To: Tao Klerks via GitGitGadget <gitgitgadget@gmail.com>
Cc: git@vger.kernel.org, "Ævar Arnfjörð Bjarmason" <avarab@gmail.com>,
	"Jeff Hostetler" <git@jeffhostetler.com>,
	"Tao Klerks" <tao@klerks.biz>, "Tao Klerks" <tao@klerks.biz>,
	"Tao Klerks" <tao@klerks.biz>
Subject: Re: [PATCH v3 1/2] t/helper/test-chmtime: update mingw to support chmtime on directories
Date: Wed, 9 Mar 2022 22:46:35 +0100 (CET)	[thread overview]
Message-ID: <nycvar.QRO.7.76.6.2203092234440.357@tvgsbejvaqbjf.bet> (raw)
In-Reply-To: <052b3dd9bba8a79890863ace0992aaee41874402.1646201124.git.gitgitgadget@gmail.com>

Hi Tao,

On Wed, 2 Mar 2022, Tao Klerks via GitGitGadget wrote:

> diff --git a/compat/mingw.c b/compat/mingw.c
> index 03af369b2b9..58f347d6ae5 100644
> --- a/compat/mingw.c
> +++ b/compat/mingw.c
> @@ -961,9 +961,11 @@ static inline void time_t_to_filetime(time_t t, FILETIME *ft)
>  int mingw_utime (const char *file_name, const struct utimbuf *times)
>  {
>  	FILETIME mft, aft;
> -	int fh, rc;
> +	int rc;
>  	DWORD attrs;
>  	wchar_t wfilename[MAX_PATH];
> +	HANDLE osfilehandle;

I would prefer the short-and-sweet name `handle` here. _Especially_ since
we are no longer using `_get_osfhandle()` at all anymore, meaning that
the name is actually misleading.

> +
>  	if (xutftowcs_path(wfilename, file_name) < 0)
>  		return -1;
>
> @@ -975,7 +977,17 @@ int mingw_utime (const char *file_name, const struct utimbuf *times)
>  		SetFileAttributesW(wfilename, attrs & ~FILE_ATTRIBUTE_READONLY);
>  	}
>
> -	if ((fh = _wopen(wfilename, O_RDWR | O_BINARY)) < 0) {
> +	osfilehandle = CreateFileW(wfilename,
> +				   FILE_WRITE_ATTRIBUTES,
> +				   0 /*FileShare.None*/,

Hmm. I wonder why you don't want to allow shared access? Like, why
disallow changing the mtime while a file is being read?

This is a change in behavior, and I think we should avoid that. Wine uses
`FILE_SHARE_READ | FILE_SHARE_WRITE` in its `_wopen()` implementation
(there are a couple of layers of indirection leading all the way down to
https://github.com/wine-mirror/wine/blob/1d178982ae5a73b18f367026c8689b56789c39fd/dlls/msvcrt/file.c#L2261).

The closest already-existing code that creates a file handle to a
directory is in `mingw_getcwd()`, and it even adds `FILE_SHARE_DELETE` to
the fray. That would probably be the best here, too.

The rest of the patch
> +				   NULL,
> +				   OPEN_EXISTING,
> +				   (attrs != INVALID_FILE_ATTRIBUTES &&
> +					(attrs & FILE_ATTRIBUTE_DIRECTORY)) ?
> +					FILE_FLAG_BACKUP_SEMANTICS : 0,
> +				   NULL);
> +	if (osfilehandle == INVALID_HANDLE_VALUE) {
> +		errno = err_win_to_posix(GetLastError());
>  		rc = -1;
>  		goto revert_attrs;
>  	}
> @@ -987,12 +999,15 @@ int mingw_utime (const char *file_name, const struct utimbuf *times)
>  		GetSystemTimeAsFileTime(&mft);
>  		aft = mft;
>  	}
> -	if (!SetFileTime((HANDLE)_get_osfhandle(fh), NULL, &aft, &mft)) {
> +
> +	if (!SetFileTime(osfilehandle, NULL, &aft, &mft)) {
>  		errno = EINVAL;
>  		rc = -1;
>  	} else
>  		rc = 0;
> -	close(fh);
> +
> +	if (osfilehandle != INVALID_HANDLE_VALUE)
> +		CloseHandle(osfilehandle);

It is quite obvious from the diff that it is quite impossible for
`osfilehandle` to equal `INVALID_HANDLE_VALUE`, because if that is the
case, we specifically `goto revert_attrs` which is two lines below:

>
>  revert_attrs:
>  	if (attrs != INVALID_FILE_ATTRIBUTES &&
> --
> gitgitgadget

Therefore, I would prefer the `CloseHandle()` to be as unconditional as
the now-replaced `close()` was.

Thank you,
Dscho

  reply	other threads:[~2022-03-09 21:46 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-02-28  9:40 [PATCH 0/2] Reduce explicit sleep calls in t7063 untracked cache tests Tao Klerks via GitGitGadget
2022-02-28  9:40 ` [PATCH 1/2] t/helper/test-chmtime: update mingw to support chmtime on directories Tao Klerks via GitGitGadget
2022-02-28 15:27   ` Jeff Hostetler
2022-02-28 22:01     ` Junio C Hamano
2022-03-01  8:16     ` Tao Klerks
2022-02-28 22:00   ` Junio C Hamano
2022-03-01  8:21     ` Tao Klerks
2022-02-28  9:40 ` [PATCH 2/2] t7063: mtime-mangling instead of delays in untracked cache testing Tao Klerks via GitGitGadget
2022-02-28 22:19   ` Junio C Hamano
2022-03-01  9:44     ` Tao Klerks
2022-02-28 11:03 ` [PATCH 0/2] Reduce explicit sleep calls in t7063 untracked cache tests Ævar Arnfjörð Bjarmason
2022-02-28 15:29 ` Jeff Hostetler
2022-03-01  9:45 ` [PATCH v2 " Tao Klerks via GitGitGadget
2022-03-01  9:45   ` [PATCH v2 1/2] t/helper/test-chmtime: update mingw to support chmtime on directories Tao Klerks via GitGitGadget
2022-03-01 16:34     ` Jeff Hostetler
2022-03-01 21:14       ` Tao Klerks
2022-03-01  9:45   ` [PATCH v2 2/2] t7063: mtime-mangling instead of delays in untracked cache testing Tao Klerks via GitGitGadget
2022-03-01 18:03     ` Junio C Hamano
2022-03-01 22:13       ` Tao Klerks
2022-03-01  9:49   ` [PATCH v2 0/2] Reduce explicit sleep calls in t7063 untracked cache tests Tao Klerks
2022-03-01 17:49   ` Junio C Hamano
2022-03-02  6:05   ` [PATCH v3 " Tao Klerks via GitGitGadget
2022-03-02  6:05     ` [PATCH v3 1/2] t/helper/test-chmtime: update mingw to support chmtime on directories Tao Klerks via GitGitGadget
2022-03-09 21:46       ` Johannes Schindelin [this message]
2022-03-02  6:05     ` [PATCH v3 2/2] t7063: mtime-mangling instead of delays in untracked cache testing Tao Klerks via GitGitGadget
2022-03-09 21:53       ` Johannes Schindelin
2022-03-05  4:24     ` [PATCH v3 0/2] Reduce explicit sleep calls in t7063 untracked cache tests Tao Klerks
2022-03-06 21:57       ` Junio C Hamano
2022-03-07  5:37         ` Tao Klerks
2022-03-07 18:15           ` Junio C Hamano

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=nycvar.QRO.7.76.6.2203092234440.357@tvgsbejvaqbjf.bet \
    --to=johannes.schindelin@gmx.de \
    --cc=avarab@gmail.com \
    --cc=git@jeffhostetler.com \
    --cc=git@vger.kernel.org \
    --cc=gitgitgadget@gmail.com \
    --cc=tao@klerks.biz \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.