Index: native_client_sdk/src/libraries/nacl_io/h_errno.c |
diff --git a/native_client_sdk/src/libraries/nacl_io/h_errno.c b/native_client_sdk/src/libraries/nacl_io/h_errno.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..114878dbbd14d6d740350a06608d8428c86511fc |
--- /dev/null |
+++ b/native_client_sdk/src/libraries/nacl_io/h_errno.c |
@@ -0,0 +1,39 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "nacl_io/ossocket.h" |
+ |
+#if defined(PROVIDES_SOCKET_API) && !defined(__GLIBC__) |
+ |
+#include <stdlib.h> |
+#include <pthread.h> |
+ |
+static pthread_key_t s_h_errno_key; |
+static pthread_once_t s_h_errno_once = PTHREAD_ONCE_INIT; |
+ |
+static void __h_errno_create() { |
+ pthread_key_create(&s_h_errno_key, NULL); |
+} |
+ |
+int *__h_errno_location() { |
+ int* h_errno_ptr; |
+ pthread_once(&s_h_errno_once, __h_errno_create); |
+ h_errno_ptr = (int *) pthread_getspecific(s_h_errno_key); |
+ |
+ if (NULL == h_errno_ptr) { |
+ h_errno_ptr = (int *) malloc(sizeof(int)); |
+ pthread_setspecific(s_h_errno_key, h_errno_ptr); |
+ *h_errno_ptr = 0; |
+ } |
+ |
+ return h_errno_ptr; |
+} |
+ |
+#if defined(__BIONIC__) |
+int *__get_h_errno() { |
+ return __h_errno_location(); |
+} |
+#endif |
+ |
+#endif // defined(PROVIDES_SOCKET_API) && !defined(__GLIBC__) |