diff options
author | Andreas Kling <kling@serenityos.org> | 2022-04-21 11:09:05 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2022-04-21 11:49:48 +0200 |
commit | a353ceecf13b6f156a078e32f1ddf1d21366934c (patch) | |
tree | 7f9f98ca569747a02cecbdf5afb15cb877f15652 /Userland/Libraries/LibC | |
parent | 99c0b895fed02949b528437d6b450d85befde7a5 (diff) | |
download | serenity-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.h | 5 | ||||
-rw-r--r-- | Userland/Libraries/LibC/libcinit.cpp | 12 |
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(); |