From 6cc42927d83adf2f89809ff54732e13f9376ff6c Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Wed, 19 Oct 2011 16:53:07 -0700 Subject: [PATCH] Display sys_errno when UV_UNKNOWN is returned --- src/fs_event_wrap.cc | 8 +++++--- src/handle_wrap.cc | 4 +++- src/node.cc | 22 ++++++++++++++++------ src/node.h | 2 +- src/pipe_wrap.cc | 12 +++++++----- src/process_wrap.cc | 8 +++++--- src/stream_wrap.cc | 18 ++++++++++-------- src/tcp_wrap.cc | 22 ++++++++++++---------- src/timer_wrap.cc | 12 +++++++----- src/tty_wrap.cc | 8 +++++--- src/udp_wrap.cc | 16 +++++++++------- 11 files changed, 80 insertions(+), 52 deletions(-) diff --git a/src/fs_event_wrap.cc b/src/fs_event_wrap.cc index 9a2df34bfc..76f88ffbb8 100644 --- a/src/fs_event_wrap.cc +++ b/src/fs_event_wrap.cc @@ -13,7 +13,9 @@ namespace node { FSEventWrap* wrap = \ static_cast(args.Holder()->GetPointerFromInternalField(0)); \ if (!wrap) { \ - SetErrno(UV_EBADF); \ + uv_err_t err; \ + err.code = UV_EBADF; \ + SetErrno(err); \ return scope.Close(Integer::New(-1)); \ } @@ -89,7 +91,7 @@ Handle FSEventWrap::Start(const Arguments& args) { uv_unref(uv_default_loop()); } } else { - SetErrno(uv_last_error(uv_default_loop()).code); + SetErrno(uv_last_error(uv_default_loop())); } return scope.Close(Integer::New(r)); @@ -106,7 +108,7 @@ void FSEventWrap::OnEvent(uv_fs_event_t* handle, const char* filename, assert(wrap->object_.IsEmpty() == false); if (status) { - SetErrno(uv_last_error(uv_default_loop()).code); + SetErrno(uv_last_error(uv_default_loop())); eventStr = String::Empty(); } else { switch (events) { diff --git a/src/handle_wrap.cc b/src/handle_wrap.cc index b82418ab37..45ab0bbf2d 100644 --- a/src/handle_wrap.cc +++ b/src/handle_wrap.cc @@ -24,7 +24,9 @@ using v8::Integer; HandleWrap* wrap = \ static_cast(args.Holder()->GetPointerFromInternalField(0)); \ if (!wrap) { \ - SetErrno(UV_EBADF); \ + uv_err_t err; \ + err.code = UV_EBADF; \ + SetErrno(err); \ return scope.Close(Integer::New(-1)); \ } diff --git a/src/node.cc b/src/node.cc index fc4f26edea..46d2a796c3 100644 --- a/src/node.cc +++ b/src/node.cc @@ -1004,7 +1004,7 @@ Local ErrnoException(int errorno, Local cons1 = String::Concat(estring, String::NewSymbol(", ")); Local cons2 = String::Concat(cons1, message); - if (errno_symbol.IsEmpty()) { + if (syscall_symbol.IsEmpty()) { syscall_symbol = NODE_PSYMBOL("syscall"); errno_symbol = NODE_PSYMBOL("errno"); errpath_symbol = NODE_PSYMBOL("path"); @@ -1080,11 +1080,21 @@ void MakeCallback(Handle object, } -void SetErrno(uv_err_code code) { - uv_err_t err; - err.code = code; - Context::GetCurrent()->Global()->Set(String::NewSymbol("errno"), - String::NewSymbol(uv_err_name(err))); +void SetErrno(uv_err_t err) { + HandleScope scope; + + if (errno_symbol.IsEmpty()) { + errno_symbol = NODE_PSYMBOL("errno"); + } + + if (err.code == UV_UNKNOWN) { + char errno_buf[100]; + snprintf(errno_buf, 100, "Unknown system errno %d", err.sys_errno_); + Context::GetCurrent()->Global()->Set(errno_symbol, String::New(errno_buf)); + } else { + Context::GetCurrent()->Global()->Set(errno_symbol, + String::NewSymbol(uv_err_name(err))); + } } diff --git a/src/node.h b/src/node.h index 5748598916..1a3b6110e8 100644 --- a/src/node.h +++ b/src/node.h @@ -203,7 +203,7 @@ node_module_struct* get_builtin_module(const char *name); #define NODE_MODULE_DECL(modname) \ extern node::node_module_struct modname ## _module; -void SetErrno(uv_err_code code); +void SetErrno(uv_err_t err); void MakeCallback(v8::Handle object, const char* method, int argc, diff --git a/src/pipe_wrap.cc b/src/pipe_wrap.cc index 1bf59bd2de..a180b4b4d0 100644 --- a/src/pipe_wrap.cc +++ b/src/pipe_wrap.cc @@ -11,7 +11,9 @@ PipeWrap* wrap = \ static_cast(args.Holder()->GetPointerFromInternalField(0)); \ if (!wrap) { \ - SetErrno(UV_EBADF); \ + uv_err_t err; \ + err.code = UV_EBADF; \ + SetErrno(err); \ return scope.Close(Integer::New(-1)); \ } @@ -113,7 +115,7 @@ Handle PipeWrap::Bind(const Arguments& args) { int r = uv_pipe_bind(&wrap->handle_, *name); // Error starting the pipe. - if (r) SetErrno(uv_last_error(uv_default_loop()).code); + if (r) SetErrno(uv_last_error(uv_default_loop())); return scope.Close(Integer::New(r)); } @@ -129,7 +131,7 @@ Handle PipeWrap::Listen(const Arguments& args) { int r = uv_listen((uv_stream_t*)&wrap->handle_, backlog, OnConnection); // Error starting the pipe. - if (r) SetErrno(uv_last_error(uv_default_loop()).code); + if (r) SetErrno(uv_last_error(uv_default_loop())); return scope.Close(Integer::New(r)); } @@ -182,7 +184,7 @@ void PipeWrap::AfterConnect(uv_connect_t* req, int status) { assert(wrap->object_.IsEmpty() == false); if (status) { - SetErrno(uv_last_error(uv_default_loop()).code); + SetErrno(uv_last_error(uv_default_loop())); } Local argv[3] = { @@ -227,7 +229,7 @@ Handle PipeWrap::Connect(const Arguments& args) { req_wrap->Dispatched(); if (r) { - SetErrno(uv_last_error(uv_default_loop()).code); + SetErrno(uv_last_error(uv_default_loop())); delete req_wrap; return scope.Close(v8::Null()); } else { diff --git a/src/process_wrap.cc b/src/process_wrap.cc index 7b880a35d9..eb7f10d9da 100644 --- a/src/process_wrap.cc +++ b/src/process_wrap.cc @@ -10,7 +10,9 @@ ProcessWrap* wrap = \ static_cast(args.Holder()->GetPointerFromInternalField(0)); \ if (!wrap) { \ - SetErrno(UV_EBADF); \ + uv_err_t err; \ + err.code = UV_EBADF; \ + SetErrno(err); \ return scope.Close(Integer::New(-1)); \ } @@ -172,7 +174,7 @@ class ProcessWrap : public HandleWrap { delete [] options.env; } - if (r) SetErrno(uv_last_error(uv_default_loop()).code); + if (r) SetErrno(uv_last_error(uv_default_loop())); return scope.Close(Integer::New(r)); } @@ -186,7 +188,7 @@ class ProcessWrap : public HandleWrap { int r = uv_process_kill(&wrap->process_, signal); - if (r) SetErrno(uv_last_error(uv_default_loop()).code); + if (r) SetErrno(uv_last_error(uv_default_loop())); return scope.Close(Integer::New(r)); } diff --git a/src/stream_wrap.cc b/src/stream_wrap.cc index cea1a5589e..fab635ad9d 100644 --- a/src/stream_wrap.cc +++ b/src/stream_wrap.cc @@ -34,7 +34,9 @@ using v8::Integer; StreamWrap* wrap = \ static_cast(args.Holder()->GetPointerFromInternalField(0)); \ if (!wrap) { \ - SetErrno(UV_EBADF); \ + uv_err_t err; \ + err.code = UV_EBADF; \ + SetErrno(err); \ return scope.Close(Integer::New(-1)); \ } @@ -106,7 +108,7 @@ Handle StreamWrap::ReadStart(const Arguments& args) { } // Error starting the tcp. - if (r) SetErrno(uv_last_error(uv_default_loop()).code); + if (r) SetErrno(uv_last_error(uv_default_loop())); return scope.Close(Integer::New(r)); } @@ -120,7 +122,7 @@ Handle StreamWrap::ReadStop(const Arguments& args) { int r = uv_read_stop(wrap->stream_); // Error starting the tcp. - if (r) SetErrno(uv_last_error(uv_default_loop()).code); + if (r) SetErrno(uv_last_error(uv_default_loop())); return scope.Close(Integer::New(r)); } @@ -199,7 +201,7 @@ void StreamWrap::OnReadCommon(uv_stream_t* handle, ssize_t nread, slab_used -= buf.len; } - SetErrno(uv_last_error(uv_default_loop()).code); + SetErrno(uv_last_error(uv_default_loop())); MakeCallback(wrap->object_, "onread", 0, NULL); return; } @@ -312,7 +314,7 @@ Handle StreamWrap::Write(const Arguments& args) { wrap->UpdateWriteQueueSize(); if (r) { - SetErrno(uv_last_error(uv_default_loop()).code); + SetErrno(uv_last_error(uv_default_loop())); delete req_wrap; return scope.Close(v8::Null()); } else { @@ -332,7 +334,7 @@ void StreamWrap::AfterWrite(uv_write_t* req, int status) { assert(wrap->object_.IsEmpty() == false); if (status) { - SetErrno(uv_last_error(uv_default_loop()).code); + SetErrno(uv_last_error(uv_default_loop())); } wrap->UpdateWriteQueueSize(); @@ -362,7 +364,7 @@ Handle StreamWrap::Shutdown(const Arguments& args) { req_wrap->Dispatched(); if (r) { - SetErrno(uv_last_error(uv_default_loop()).code); + SetErrno(uv_last_error(uv_default_loop())); delete req_wrap; return scope.Close(v8::Null()); } else { @@ -382,7 +384,7 @@ void StreamWrap::AfterShutdown(uv_shutdown_t* req, int status) { HandleScope scope; if (status) { - SetErrno(uv_last_error(uv_default_loop()).code); + SetErrno(uv_last_error(uv_default_loop())); } Local argv[3] = { diff --git a/src/tcp_wrap.cc b/src/tcp_wrap.cc index 1303246a0a..90fc448fcf 100644 --- a/src/tcp_wrap.cc +++ b/src/tcp_wrap.cc @@ -28,7 +28,9 @@ TCPWrap* wrap = \ static_cast(args.Holder()->GetPointerFromInternalField(0)); \ if (!wrap) { \ - SetErrno(UV_EBADF); \ + uv_err_t err; \ + err.code = UV_EBADF; \ + SetErrno(err); \ return scope.Close(Integer::New(-1)); \ } @@ -149,7 +151,7 @@ Handle TCPWrap::GetSockName(const Arguments& args) { Local sockname = Object::New(); if (r != 0) { - SetErrno(uv_last_error(uv_default_loop()).code); + SetErrno(uv_last_error(uv_default_loop())); } else { family = address.ss_family; @@ -191,7 +193,7 @@ Handle TCPWrap::GetPeerName(const Arguments& args) { Local sockname = Object::New(); if (r != 0) { - SetErrno(uv_last_error(uv_default_loop()).code); + SetErrno(uv_last_error(uv_default_loop())); } else { family = address.ss_family; @@ -229,7 +231,7 @@ Handle TCPWrap::Bind(const Arguments& args) { int r = uv_tcp_bind(&wrap->handle_, address); // Error starting the tcp. - if (r) SetErrno(uv_last_error(uv_default_loop()).code); + if (r) SetErrno(uv_last_error(uv_default_loop())); return scope.Close(Integer::New(r)); } @@ -247,7 +249,7 @@ Handle TCPWrap::Bind6(const Arguments& args) { int r = uv_tcp_bind6(&wrap->handle_, address); // Error starting the tcp. - if (r) SetErrno(uv_last_error(uv_default_loop()).code); + if (r) SetErrno(uv_last_error(uv_default_loop())); return scope.Close(Integer::New(r)); } @@ -263,7 +265,7 @@ Handle TCPWrap::Listen(const Arguments& args) { int r = uv_listen((uv_stream_t*)&wrap->handle_, backlog, OnConnection); // Error starting the tcp. - if (r) SetErrno(uv_last_error(uv_default_loop()).code); + if (r) SetErrno(uv_last_error(uv_default_loop())); return scope.Close(Integer::New(r)); } @@ -298,7 +300,7 @@ void TCPWrap::OnConnection(uv_stream_t* handle, int status) { // Successful accept. Call the onconnection callback in JavaScript land. argv[0] = client_obj; } else { - SetErrno(uv_last_error(uv_default_loop()).code); + SetErrno(uv_last_error(uv_default_loop())); argv[0] = v8::Null(); } @@ -317,7 +319,7 @@ void TCPWrap::AfterConnect(uv_connect_t* req, int status) { assert(wrap->object_.IsEmpty() == false); if (status) { - SetErrno(uv_last_error(uv_default_loop()).code); + SetErrno(uv_last_error(uv_default_loop())); } Local argv[3] = { @@ -353,7 +355,7 @@ Handle TCPWrap::Connect(const Arguments& args) { req_wrap->Dispatched(); if (r) { - SetErrno(uv_last_error(uv_default_loop()).code); + SetErrno(uv_last_error(uv_default_loop())); delete req_wrap; return scope.Close(v8::Null()); } else { @@ -380,7 +382,7 @@ Handle TCPWrap::Connect6(const Arguments& args) { req_wrap->Dispatched(); if (r) { - SetErrno(uv_last_error(uv_default_loop()).code); + SetErrno(uv_last_error(uv_default_loop())); delete req_wrap; return scope.Close(v8::Null()); } else { diff --git a/src/timer_wrap.cc b/src/timer_wrap.cc index 99db0c5d6d..3071c2a823 100644 --- a/src/timer_wrap.cc +++ b/src/timer_wrap.cc @@ -7,7 +7,9 @@ TimerWrap* wrap = \ static_cast(args.Holder()->GetPointerFromInternalField(0)); \ if (!wrap) { \ - SetErrno(UV_EBADF); \ + uv_err_t err; \ + err.code = UV_EBADF; \ + SetErrno(err); \ return scope.Close(Integer::New(-1)); \ } @@ -109,7 +111,7 @@ class TimerWrap : public HandleWrap { int r = uv_timer_start(&wrap->handle_, OnTimeout, timeout, repeat); // Error starting the timer. - if (r) SetErrno(uv_last_error(uv_default_loop()).code); + if (r) SetErrno(uv_last_error(uv_default_loop())); wrap->StateChange(); @@ -123,7 +125,7 @@ class TimerWrap : public HandleWrap { int r = uv_timer_stop(&wrap->handle_); - if (r) SetErrno(uv_last_error(uv_default_loop()).code); + if (r) SetErrno(uv_last_error(uv_default_loop())); wrap->StateChange(); @@ -137,7 +139,7 @@ class TimerWrap : public HandleWrap { int r = uv_timer_again(&wrap->handle_); - if (r) SetErrno(uv_last_error(uv_default_loop()).code); + if (r) SetErrno(uv_last_error(uv_default_loop())); wrap->StateChange(); @@ -163,7 +165,7 @@ class TimerWrap : public HandleWrap { int64_t repeat = uv_timer_get_repeat(&wrap->handle_); - if (repeat < 0) SetErrno(uv_last_error(uv_default_loop()).code); + if (repeat < 0) SetErrno(uv_last_error(uv_default_loop())); return scope.Close(Integer::New(repeat)); } diff --git a/src/tty_wrap.cc b/src/tty_wrap.cc index eaa8cfdcd4..6272d45f29 100644 --- a/src/tty_wrap.cc +++ b/src/tty_wrap.cc @@ -27,7 +27,9 @@ using v8::Undefined; TTYWrap* wrap = \ static_cast(args.Holder()->GetPointerFromInternalField(0)); \ if (!wrap) { \ - SetErrno(UV_EBADF); \ + uv_err_t err; \ + err.code = UV_EBADF; \ + SetErrno(err); \ return scope.Close(Integer::New(-1)); \ } @@ -100,7 +102,7 @@ class TTYWrap : StreamWrap { int r = uv_tty_get_winsize(&wrap->handle_, &width, &height); if (r) { - SetErrno(uv_last_error(uv_default_loop()).code); + SetErrno(uv_last_error(uv_default_loop())); return v8::Undefined(); } @@ -119,7 +121,7 @@ class TTYWrap : StreamWrap { int r = uv_tty_set_mode(&wrap->handle_, args[0]->IsTrue()); if (r) { - SetErrno(uv_last_error(uv_default_loop()).code); + SetErrno(uv_last_error(uv_default_loop())); } return scope.Close(Integer::New(r)); diff --git a/src/udp_wrap.cc b/src/udp_wrap.cc index 651dc6f40a..eb9a4843b2 100644 --- a/src/udp_wrap.cc +++ b/src/udp_wrap.cc @@ -32,7 +32,9 @@ namespace node { UDPWrap* wrap = \ static_cast(args.Holder()->GetPointerFromInternalField(0)); \ if (!wrap) { \ - SetErrno(UV_EBADF); \ + uv_err_t err; \ + err.code = UV_EBADF; \ + SetErrno(err); \ return scope.Close(Integer::New(-1)); \ } @@ -153,7 +155,7 @@ Handle UDPWrap::DoBind(const Arguments& args, int family) { } if (r) - SetErrno(uv_last_error(uv_default_loop()).code); + SetErrno(uv_last_error(uv_default_loop())); return scope.Close(Integer::New(r)); } @@ -210,7 +212,7 @@ Handle UDPWrap::DoSend(const Arguments& args, int family) { req_wrap->Dispatched(); if (r) { - SetErrno(uv_last_error(uv_default_loop()).code); + SetErrno(uv_last_error(uv_default_loop())); delete req_wrap; return Null(); } @@ -238,7 +240,7 @@ Handle UDPWrap::RecvStart(const Arguments& args) { // UV_EALREADY means that the socket is already bound but that's okay int r = uv_udp_recv_start(&wrap->handle_, OnAlloc, OnRecv); if (r && uv_last_error(uv_default_loop()).code != UV_EALREADY) { - SetErrno(uv_last_error(uv_default_loop()).code); + SetErrno(uv_last_error(uv_default_loop())); return False(); } @@ -274,7 +276,7 @@ Handle UDPWrap::GetSockName(const Arguments& args) { return scope.Close(sockname); } else { - SetErrno(uv_last_error(uv_default_loop()).code); + SetErrno(uv_last_error(uv_default_loop())); return Null(); } } @@ -293,7 +295,7 @@ void UDPWrap::OnSend(uv_udp_send_t* req, int status) { assert(wrap->object_.IsEmpty() == false); if (status) { - SetErrno(uv_last_error(uv_default_loop()).code); + SetErrno(uv_last_error(uv_default_loop())); } Local argv[4] = { @@ -341,7 +343,7 @@ void UDPWrap::OnRecv(uv_udp_t* handle, }; if (nread == -1) { - SetErrno(uv_last_error(uv_default_loop()).code); + SetErrno(uv_last_error(uv_default_loop())); } else { Local rinfo = Object::New();