about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/uv_link_t.c35
1 files changed, 28 insertions, 7 deletions
diff --git a/src/uv_link_t.c b/src/uv_link_t.c
index 696dd15..32c676e 100644
--- a/src/uv_link_t.c
+++ b/src/uv_link_t.c
@@ -221,21 +221,42 @@ int uv_link_unchain(uv_link_t* from, uv_link_t* to) {
 }
 
 
-const char* uv_link_strerror(uv_link_t* link, int err) {
+int uv_link_errno(uv_link_t** link, int err) {
   unsigned int prefix;
   int local_err;
+  uv_link_t* p;
 
-  if (err >= UV_ERRNO_MAX)
-    return uv_strerror(err);
+  if (err >= UV_ERRNO_MAX) {
+    *link = NULL;
+    return err;
+  }
 
   prefix = (-err) & kErrorPrefixMask;
   local_err = -((-err) & kErrorValueMask);
 
-  for (; link != NULL; link = link->parent)
-    if (prefix == link->err_prefix)
-      return link->methods->strerror(link, local_err);
+  for (p = *link; p != NULL; p = p->parent) {
+    if (prefix == p->err_prefix) {
+      *link = p;
+      return local_err;
+    }
+  }
+
+  *link = NULL;
+  return err;
+}
+
+
+const char* uv_link_strerror(uv_link_t* link, int err) {
+  int local_err;
+
+  if (err >= UV_ERRNO_MAX)
+    return uv_strerror(err);
+
+  local_err = uv_link_errno(&link, err);
+  if (link == NULL)
+    return NULL;
 
-  return NULL;
+  return link->methods->strerror(link, local_err);
 }