X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=support%2Fstdio.c;h=b7cc689deb51087588140936b4f99f1cd10d5bf8;hb=487fddd14660e9095c1abd1d461ea5303ce52b48;hp=e5b54da47b909f222d3664480c522d34d40ca1f8;hpb=80c4c54dd7259d6f2849693836bfe7f9e2bcae7a;p=mono.git diff --git a/support/stdio.c b/support/stdio.c index e5b54da47b9..b7cc689deb5 100644 --- a/support/stdio.c +++ b/support/stdio.c @@ -49,7 +49,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 @@ -142,6 +156,12 @@ Mono_Posix_Stdlib_TMP_MAX (void) return TMP_MAX; } +void* +Mono_Posix_Stdlib_tmpfile (void) +{ + return tmpfile (); +} + gint32 Mono_Posix_Stdlib_setvbuf (void* stream, void *buf, int mode, mph_size_t size) { @@ -156,6 +176,60 @@ Mono_Posix_Stdlib_setbuf (void* stream, void* buf) return 0; } +void* +Mono_Posix_Stdlib_fopen (char* path, char* mode) +{ + return fopen (path, mode); +} + +void* +Mono_Posix_Stdlib_freopen (char* path, char* mode, void *stream) +{ + return freopen (path, mode, stream); +} + +gint32 +Mono_Posix_Stdlib_fprintf (void* stream, char* format, char *message) +{ + return fprintf (stream, format, message); +} + +gint32 +Mono_Posix_Stdlib_fgetc (void* stream) +{ + return fgetc (stream); +} + +char* +Mono_Posix_Stdlib_fgets (char* str, gint32 size, void* stream) +{ + return fgets (str, size, stream); +} + +gint32 +Mono_Posix_Stdlib_fputc (gint32 c, void* stream) +{ + return fputc (c, stream); +} + +gint32 +Mono_Posix_Stdlib_fputs (char* s, void* stream) +{ + return fputs (s, stream); +} + +gint32 +Mono_Posix_Stdlib_fclose (void* stream) +{ + return fclose (stream); +} + +gint32 +Mono_Posix_Stdlib_fflush (void* stream) +{ + return fflush (stream); +} + gint32 Mono_Posix_Stdlib_fseek (void* stream, gint64 offset, int origin) { @@ -207,6 +281,24 @@ Mono_Posix_Stdlib_clearerr (void* stream) return 0; } +gint32 +Mono_Posix_Stdlib_ungetc (gint32 c, void* stream) +{ + return ungetc (c, stream); +} + +gint32 +Mono_Posix_Stdlib_feof (void* stream) +{ + return feof (((FILE*) stream)); +} + +gint32 +Mono_Posix_Stdlib_ferror (void* stream) +{ + return ferror (((FILE*) stream)); +} + int Mono_Posix_Stdlib_perror (const char* s, int err) {