Fix errno display in c-ares exceptions
authorRyan Dahl <ry@tinyclouds.org>
Mon, 17 May 2010 20:58:15 +0000 (13:58 -0700)
committerRyan Dahl <ry@tinyclouds.org>
Mon, 17 May 2010 20:58:15 +0000 (13:58 -0700)
src/node_cares.cc

index c09ee84..f9e1a1a 100644 (file)
@@ -167,11 +167,54 @@ static Local<Array> HostEntToNames(struct hostent* hostent) {
   return names;
 }
 
+static inline const char *ares_errno_string(int errorno) {
+#define ERRNO_CASE(e)  case ARES_##e: return #e;
+  switch (errorno) {
+    ERRNO_CASE(SUCCESS)
+    ERRNO_CASE(ENODATA)
+    ERRNO_CASE(EFORMERR)
+    ERRNO_CASE(ESERVFAIL)
+    ERRNO_CASE(ENOTFOUND)
+    ERRNO_CASE(ENOTIMP)
+    ERRNO_CASE(EREFUSED)
+    ERRNO_CASE(EBADQUERY)
+    ERRNO_CASE(EBADNAME)
+    ERRNO_CASE(EBADFAMILY)
+    ERRNO_CASE(EBADRESP)
+    ERRNO_CASE(ECONNREFUSED)
+    ERRNO_CASE(ETIMEOUT)
+    ERRNO_CASE(EOF)
+    ERRNO_CASE(EFILE)
+    ERRNO_CASE(ENOMEM)
+    ERRNO_CASE(EDESTRUCTION)
+    ERRNO_CASE(EBADSTR)
+    ERRNO_CASE(EBADFLAGS)
+    ERRNO_CASE(ENONAME)
+    ERRNO_CASE(EBADHINTS)
+    ERRNO_CASE(ENOTINITIALIZED)
+    ERRNO_CASE(ELOADIPHLPAPI)
+    ERRNO_CASE(EADDRGETNETWORKPARAMS)
+    ERRNO_CASE(ECANCELLED)
+    default:
+      assert(0 && "Unhandled c-ares errno");
+      return "(UNKNOWN)";
+  }
+}
+
 
 static void ResolveError(Persistent<Function> &cb, int status) {
   HandleScope scope;
 
-  Local<Value> e = ErrnoException(status, NULL, ares_strerror(status));
+  Local<String> code = String::NewSymbol(ares_errno_string(status));
+  Local<String> message = String::NewSymbol(ares_strerror(status));
+
+  Local<String> cons1 = String::Concat(code, String::NewSymbol(", "));
+  Local<String> cons2 = String::Concat(cons1, message);
+
+  Local<Value> e = Exception::Error(cons2);
+
+  Local<Object> obj = e->ToObject();
+  obj->Set(String::NewSymbol("errno"), Integer::New(status));
 
   TryCatch try_catch;