Re: [PATCH] Fix checkout of large files to network shares under Windows XP
- From
René Scharfe <rene.scharfe@lsrfire.ath.cx>
- Date
- Apr 19, 2010, 20:43 UTC
- Message-ID
- <4BCCC05E.4030206@lsrfire.ath.cx>
- In-Reply-To
- <4BCC5083.30801@gmail.com>
Am 19.04.2010 14:45, schrieb Sebastian Schuberth:
Show 29 quoted lines
> This fixes msysGit issue 409, see
> http://code.google.com/p/msysgit/issues/detail?id=409
>
> Signed-off-by: Sebastian Schuberth <sschuberth@gmail.com>
> ---
> compat/mingw.c | 24 ++++++++++++++++++++++++
> compat/mingw.h | 3 +++
> 2 files changed, 27 insertions(+), 0 deletions(-)
>
> diff --git a/compat/mingw.c b/compat/mingw.c
> index 7ec615c..672d074 100644
> --- a/compat/mingw.c
> +++ b/compat/mingw.c
> @@ -293,6 +293,30 @@ int mingw_open (const char *filename, int oflags, ...)
> return fd;
> }
>
> +#undef write
> +ssize_t mingw_write(int fd, const void *buf, size_t count)
> +{
> + ssize_t written = 0;
> + size_t total = 0, size = count;
> +
> + while (total < count && size > 0) {
> + written = write(fd, buf, size);
> + if (written < 0 && errno == EINVAL) {
> + // There seems to be a bug in the Windows XP network stack that
> + // causes writes with sizes > 64 MB to fail, so we halve the size
> + // until we succeed or ultimately fail.C style comments (/*...*/) are preferred over C++ style comments (//...) for git.
Is there a known-good size, or at least a mostly-working one? Would it make sense to start with that size instead of halving and trying until that size is reached?
> + size /= 2;
> + } else {
> + buf += written;
> + total += written;What about other errors? You need to break out of the loop instead of adding -1 to buf and total, right?
> + if (total + size > count) > + size = count - total; > + } > + }
Shouldn't the loop be left in the successful case, too? write(2) is allowed to write less than requested, so the caller already needs to deal with that case anyway.
Show 21 quoted lines
> +
> + return written < 0 ? written : total;
> +}
> +
> #undef fopen
> FILE *mingw_fopen (const char *filename, const char *otype)
> {
> diff --git a/compat/mingw.h b/compat/mingw.h
> index 756f3ab..751bb4c 100644
> --- a/compat/mingw.h
> +++ b/compat/mingw.h
> @@ -178,6 +178,9 @@ int mingw_rmdir(const char *path);
> int mingw_open (const char *filename, int oflags, ...);
> #define open mingw_open
>
> +ssize_t mingw_write(int fd, const void *buf, size_t count);
> +#define write mingw_write
> +
> FILE *mingw_fopen (const char *filename, const char *otype);
> #define fopen mingw_fopen
>