This fixes msysGit issue 409, see http://code.google.com/p/msysgit/issues/detail?id=409 Signed-off-by: Sebastian Schuberth <sschuberth@xxxxxxxxx> --- 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. + size /= 2; + } else { + buf += written; + total += written; + if (total + size > count) + size = count - total; + } + } + + 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 -- 1.7.0.2.msysgit.0.898.gbf4f.dirty -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html