Browse Source

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.
Andreas Kling 3 years ago
parent
commit
a353ceecf1
2 changed files with 12 additions and 5 deletions
  1. 3 2
      Userland/Libraries/LibC/errno.h
  2. 9 3
      Userland/Libraries/LibC/libcinit.cpp

+ 3 - 2
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

+ 9 - 3
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();