Merge pull request #2832 from razzfazz/handle_eintr
[mono.git] / support / errno.c
index a28425e03b84ab8a34617a148ba96577d4e3d939..74c2fdf5648bd0613f87d8cb93b41431e1481e2d 100644 (file)
@@ -4,18 +4,12 @@
 
 #include <errno.h>
 #include <string.h>
+#include "map.h"
 #include "mph.h"
 #include <stdio.h>
 
 G_BEGIN_DECLS
 
-/* DEPRECATED: Use the Stdlib version instead */
-void
-Mono_Posix_Syscall_SetLastError (int error_number)
-{
-       errno = error_number;
-}
-
 void
 Mono_Posix_Stdlib_SetLastError (int error_number)
 {
@@ -86,7 +80,27 @@ Mono_Posix_Syscall_strerror_r (int errnum, char *buf, mph_size_t n)
        mph_return_if_size_t_overflow (n);
 
        /* first, check for valid errnum */
+#if PLATFORM_ANDROID
+       /* Android NDK defines _GNU_SOURCE but strerror_r follows the XSI semantics
+        * not the GNU one. XSI version returns an integer, as opposed to the GNU one
+        * which returns pointer to the buffer.
+        */
+       if (strerror_r (errnum, ebuf, sizeof(ebuf)) == -1) {
+               /* XSI strerror_r will return -1 if errno is set, but if we leave the value
+                * alone it breaks Mono.Posix StdioFileStream tests, so we'll ignore the value
+                * and set errno as below
+                */
+               errno = EINVAL;
+               return -1;
+       }
+       r = ebuf;
+#else
        r = strerror_r (errnum, ebuf, sizeof(ebuf));
+#endif
+       if (!r) {
+               errno = EINVAL;
+               return -1;
+       } 
        len = strlen (r);
 
        if (r == ebuf ||