X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=support%2Fstdio.c;h=590ff8cf821dca7ef57b2182caadf3b6151bc52f;hb=4058c2be43ec605cdcc57e9d678251339349cb5f;hp=b914dfdb1d098ec4d4518fd5b28f13b770200b2c;hpb=c265b8f9b2d6fe70cb8d5d3b792c669f5a6e1a2a;p=mono.git diff --git a/support/stdio.c b/support/stdio.c index b914dfdb1d0..590ff8cf821 100644 --- a/support/stdio.c +++ b/support/stdio.c @@ -16,23 +16,25 @@ G_BEGIN_DECLS -#ifndef HOST_WIN32 gint32 Mono_Posix_Syscall_L_ctermid (void) { +#ifndef HOST_WIN32 return L_ctermid; +#else + return -1; +#endif } gint32 Mono_Posix_Syscall_L_cuserid (void) { -#if defined(__APPLE__) || defined (__OpenBSD__) +#if defined(__APPLE__) || defined (__OpenBSD__) || defined (HOST_WIN32) return -1; #else return L_cuserid; #endif } -#endif /* ndef HOST_WIN32 */ mph_size_t Mono_Posix_Stdlib_fread (unsigned char *ptr, mph_size_t size, mph_size_t nmemb, void *stream) @@ -49,7 +51,21 @@ Mono_Posix_Stdlib_fwrite (unsigned char *ptr, mph_size_t size, mph_size_t nmemb, mph_return_if_size_t_overflow (size); mph_return_if_size_t_overflow (nmemb); - return fwrite (ptr, (size_t) size, (size_t) nmemb, (FILE*) stream); + size_t ret = fwrite (ptr, (size_t) size, (size_t) nmemb, (FILE*) stream); +#ifdef HOST_WIN32 + // Workaround for a particular weirdness on Windows triggered by the + // StdioFileStreamTest.Write() test method. The test writes 15 bytes to a + // file, then rewinds the file pointer and reads the same bytes. It then + // writes 15 additional bytes to the file. This second write fails on + // Windows with 0 returned from fwrite(). Calling fseek() followed by a retry + // of fwrite() like we do here fixes the issue. + if (ret != nmemb) + { + fseek (stream, 0, SEEK_CUR); + ret = fwrite (ptr + (ret * nmemb), (size_t) size, (size_t) nmemb - ret, (FILE*) stream); + } +#endif + return ret; } #ifdef HAVE_VSNPRINTF @@ -276,13 +292,13 @@ Mono_Posix_Stdlib_ungetc (gint32 c, void* stream) gint32 Mono_Posix_Stdlib_feof (void* stream) { - return feof (stream); + return feof (((FILE*) stream)); } gint32 Mono_Posix_Stdlib_ferror (void* stream) { - return ferror (stream); + return ferror (((FILE*) stream)); } int