@@ -47,6 +47,38 @@ using v8::String;
4747using v8::Value;
4848
4949
50+ inline const char * ToErrorCodeString (int status) {
51+ switch (status) {
52+ #define V (code ) case ARES_##code: return #code;
53+ V (EADDRGETNETWORKPARAMS)
54+ V (EBADFAMILY)
55+ V (EBADFLAGS)
56+ V (EBADHINTS)
57+ V (EBADNAME)
58+ V (EBADQUERY)
59+ V (EBADRESP)
60+ V (EBADSTR)
61+ V (ECANCELLED)
62+ V (ECONNREFUSED)
63+ V (EDESTRUCTION)
64+ V (EFILE)
65+ V (EFORMERR)
66+ V (ELOADIPHLPAPI)
67+ V (ENODATA)
68+ V (ENOMEM)
69+ V (ENONAME)
70+ V (ENOTFOUND)
71+ V (ENOTIMP)
72+ V (ENOTINITIALIZED)
73+ V (EOF)
74+ V (EREFUSED)
75+ V (ESERVFAIL)
76+ V (ETIMEOUT)
77+ #undef V
78+ }
79+ return " UNKNOWN_ARES_ERROR" ;
80+ }
81+
5082class GetAddrInfoReqWrap : public ReqWrap <uv_getaddrinfo_t > {
5183 public:
5284 GetAddrInfoReqWrap (Environment* env, Local<Object> req_wrap_obj);
@@ -330,41 +362,8 @@ class QueryWrap : public AsyncWrap {
330362 CHECK_NE (status, ARES_SUCCESS);
331363 HandleScope handle_scope (env ()->isolate ());
332364 Context::Scope context_scope (env ()->context ());
333- Local<Value> arg;
334- switch (status) {
335- #define V (code ) \
336- case ARES_ ## code: \
337- arg = FIXED_ONE_BYTE_STRING (env ()->isolate (), #code); \
338- break ;
339- V (ENODATA)
340- V (EFORMERR)
341- V (ESERVFAIL)
342- V (ENOTFOUND)
343- V (ENOTIMP)
344- V (EREFUSED)
345- V (EBADQUERY)
346- V (EBADNAME)
347- V (EBADFAMILY)
348- V (EBADRESP)
349- V (ECONNREFUSED)
350- V (ETIMEOUT)
351- V (EOF)
352- V (EFILE)
353- V (ENOMEM)
354- V (EDESTRUCTION)
355- V (EBADSTR)
356- V (EBADFLAGS)
357- V (ENONAME)
358- V (EBADHINTS)
359- V (ENOTINITIALIZED)
360- V (ELOADIPHLPAPI)
361- V (EADDRGETNETWORKPARAMS)
362- V (ECANCELLED)
363- #undef V
364- default :
365- arg = FIXED_ONE_BYTE_STRING (env ()->isolate (), " UNKNOWN_ARES_ERROR" );
366- break ;
367- }
365+ const char * code = ToErrorCodeString (status);
366+ Local<Value> arg = OneByteString (env ()->isolate (), code);
368367 MakeCallback (env ()->oncomplete_string (), 1 , &arg);
369368 }
370369
@@ -1311,7 +1310,8 @@ static void Initialize(Local<Object> target,
13111310 Environment* env = Environment::GetCurrent (context);
13121311
13131312 int r = ares_library_init (ARES_LIB_INIT_ALL);
1314- CHECK_EQ (r, ARES_SUCCESS);
1313+ if (r != ARES_SUCCESS)
1314+ return env->ThrowError (ToErrorCodeString (r));
13151315
13161316 struct ares_options options;
13171317 memset (&options, 0 , sizeof (options));
@@ -1323,7 +1323,10 @@ static void Initialize(Local<Object> target,
13231323 r = ares_init_options (env->cares_channel_ptr (),
13241324 &options,
13251325 ARES_OPT_FLAGS | ARES_OPT_SOCK_STATE_CB);
1326- CHECK_EQ (r, ARES_SUCCESS);
1326+ if (r != ARES_SUCCESS) {
1327+ ares_library_cleanup ();
1328+ return env->ThrowError (ToErrorCodeString (r));
1329+ }
13271330
13281331 /* Initialize the timeout timer. The timer won't be started until the */
13291332 /* first socket is opened. */
0 commit comments