summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2002-02-26 09:35:50 +0000
committerEric Andersen <andersen@codepoet.org>2002-02-26 09:35:50 +0000
commit033c0d7edcb04845b31ca09ae87f9c25acab975d (patch)
tree363dc134e08512eb9ae8e40b75ef86cda828baa6
parent2c81c415ceda41331df567ba97ab5cdf98211107 (diff)
Proper support for setting h_errno
-rw-r--r--libc/misc/internals/Makefile2
-rw-r--r--libc/misc/internals/__h_errno_location.c10
-rw-r--r--libc/misc/internals/__uClibc_main.c7
3 files changed, 17 insertions, 2 deletions
diff --git a/libc/misc/internals/Makefile b/libc/misc/internals/Makefile
index c81e02078..6e1c2c29d 100644
--- a/libc/misc/internals/Makefile
+++ b/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
diff --git a/libc/misc/internals/__h_errno_location.c b/libc/misc/internals/__h_errno_location.c
new file mode 100644
index 000000000..f4f598057
--- /dev/null
+++ b/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;
+}
+
diff --git a/libc/misc/internals/__uClibc_main.c b/libc/misc/internals/__uClibc_main.c
index ffe8ad813..7f5e6e805 100644
--- a/libc/misc/internals/__uClibc_main.c
+++ b/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.