X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=support%2Ferrno.c;h=76b4b388e9862170e2647ed127d1bf71017f1fbd;hb=52e98abd6e5c6d10ddea91a529f7b1b2336e0696;hp=26ee780169183aff8538e23987818f38721356f4;hpb=987f8c63e214937c50dcb308149f7558a2cbba41;p=mono.git diff --git a/support/errno.c b/support/errno.c index 26ee7801691..76b4b388e98 100644 --- a/support/errno.c +++ b/support/errno.c @@ -10,6 +10,12 @@ G_BEGIN_DECLS +int +Mono_Posix_Stdlib_GetLastError (void) +{ + return errno; +} + void Mono_Posix_Stdlib_SetLastError (int error_number) { @@ -80,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 ||