+static __thread char* errno_string = NULL;
+static __thread size_t errno_string_len = 0;
+
+void realloc_errno_string() {
+ if (errno_string_len == 0) {
+ errno_string_len = 1;
+ } else {
+ errno_string_len *= 2;
+ }
+ errno_string = realloc(errno_string, errno_string_len);
+}
+
+char* sstrerrno() {
+ int original_errno = errno;
+ while (strerror_r(original_errno, errno_string, errno_string_len) != 0) {
+ realloc_errno_string();
+ }
+ return errno_string;
+}
+