Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / support / errno.c
index 878e9560eb6db36d565cc35d49773d62ca7b236a..76b4b388e9862170e2647ed127d1bf71017f1fbd 100644 (file)
@@ -4,11 +4,18 @@
 
 #include <errno.h>
 #include <string.h>
+#include "map.h"
 #include "mph.h"
 #include <stdio.h>
 
 G_BEGIN_DECLS
 
+int
+Mono_Posix_Stdlib_GetLastError (void)
+{
+       return errno;
+}
+
 void
 Mono_Posix_Stdlib_SetLastError (int error_number)
 {
@@ -79,7 +86,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 HOST_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 ||