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)
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
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