Kaynağa Gözat

Proper support for setting h_errno

Eric Andersen 23 yıl önce
ebeveyn
işleme
033c0d7edc

+ 1 - 1
libc/misc/internals/Makefile

@@ -24,7 +24,7 @@
 TOPDIR=../../../
 include $(TOPDIR)Rules.mak
 
-CSRC=ultostr.c ltostr.c __uClibc_main.c tempname.c errno.c __errno_location.c
+CSRC=ultostr.c ltostr.c __uClibc_main.c tempname.c errno.c __errno_location.c __h_errno_location.c
 ifeq ($(HAS_FLOATING_POINT),true)
 	CSRC += dtostr.c zoicheck.c
 endif

+ 10 - 0
libc/misc/internals/__h_errno_location.c

@@ -0,0 +1,10 @@
+#define __FORCE_GLIBC
+#include <features.h>
+#include <netdb.h>
+#undef h_errno
+
+int * weak_const_function __h_errno_location (void)
+{
+    return &h_errno;
+}
+

+ 6 - 1
libc/misc/internals/__uClibc_main.c

@@ -30,11 +30,13 @@ void __uClibc_main(int argc, char **argv, char **envp)
 weak_alias(__environ, environ);
 extern void weak_function __init_stdio(void);
 extern void weak_function __stdio_flush_buffers(void);
-extern int *weak_function __errno_location (void);
+extern int *weak_const_function __errno_location (void);
+extern int *weak_const_function __h_errno_location (void);
 #else
 extern void __init_stdio(void);
 extern void __stdio_flush_buffers(void);
 extern int *__errno_location (void);
+extern int *__h_errno_location (void);
 #endif	
 
 /*
@@ -79,6 +81,9 @@ void __uClibc_main(int argc, char **argv, char **envp)
 	 */
 	if (__errno_location)
 	    *(__errno_location()) = 0;
+	/* Set h_errno to 0 as well */
+	if (__h_errno_location)
+	    *(__h_errno_location()) = 0;
 
 	/*
 	 * Finally, invoke application's main and then exit.