summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibC
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2022-04-21 11:09:05 +0200
committerAndreas Kling <kling@serenityos.org>2022-04-21 11:49:48 +0200
commita353ceecf13b6f156a078e32f1ddf1d21366934c (patch)
tree7f9f98ca569747a02cecbdf5afb15cb877f15652 /Userland/Libraries/LibC
parent99c0b895fed02949b528437d6b450d85befde7a5 (diff)
downloadserenity-a353ceecf13b6f156a078e32f1ddf1d21366934c.zip
LibC: Implement errno via a __errno_location() function
This matches how some other systems implement errno, and makes 3rd party software that expect us to have __errno_location() work.
Diffstat (limited to 'Userland/Libraries/LibC')
-rw-r--r--Userland/Libraries/LibC/errno.h5
-rw-r--r--Userland/Libraries/LibC/libcinit.cpp12
2 files changed, 12 insertions, 5 deletions
diff --git a/Userland/Libraries/LibC/errno.h b/Userland/Libraries/LibC/errno.h
index ad4b251366..e3e8e84a40 100644
--- a/Userland/Libraries/LibC/errno.h
+++ b/Userland/Libraries/LibC/errno.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
+ * Copyright (c) 2018-2022, Andreas Kling <kling@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
@@ -29,6 +29,7 @@ extern int errno;
extern __thread int errno;
#endif
-#define errno errno
+int* __errno_location() __attribute__((const));
+#define errno (*__errno_location())
__END_DECLS
diff --git a/Userland/Libraries/LibC/libcinit.cpp b/Userland/Libraries/LibC/libcinit.cpp
index 38cab1bdaa..aeed350bec 100644
--- a/Userland/Libraries/LibC/libcinit.cpp
+++ b/Userland/Libraries/LibC/libcinit.cpp
@@ -1,20 +1,21 @@
/*
- * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
+ * Copyright (c) 2018-2022, Andreas Kling <kling@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <AK/Types.h>
#include <assert.h>
+#include <errno.h>
#include <sys/internals.h>
#include <unistd.h>
extern "C" {
#ifdef NO_TLS
-int errno;
+int errno_storage;
#else
-__thread int errno;
+__thread int errno_storage;
#endif
char** environ;
bool __environ_is_malloced;
@@ -24,6 +25,11 @@ void* __auxiliary_vector;
static void __auxiliary_vector_init();
+int* __errno_location()
+{
+ return &errno_storage;
+}
+
void __libc_init()
{
__auxiliary_vector_init();