Permalink
Browse files

Unify ErrnoException creation

  • Loading branch information...
1 parent 0633e5c commit c9e27b11c5b995b7ff9d3c1dde4687ccd54f0071 @ry ry committed Apr 23, 2010
Showing with 375 additions and 397 deletions.
  1. +350 −0 src/node.cc
  2. +4 −0 src/node.h
  3. +1 −5 src/node_cares.cc
  4. +0 −17 src/node_crypto.cc
  5. +0 −1 src/node_events.cc
  6. +19 −25 src/node_file.cc
  7. +0 −340 src/node_net2.cc
  8. +1 −9 src/node_stdio.cc
View
@@ -50,6 +50,9 @@ namespace node {
static Persistent<Object> process;
+static Persistent<String> errno_symbol;
+static Persistent<String> syscall_symbol;
+
static Persistent<String> dev_symbol;
static Persistent<String> ino_symbol;
static Persistent<String> mode_symbol;
@@ -278,6 +281,353 @@ static void EIODonePoll(void) {
}
+static inline const char *errno_string(int errorno) {
+#define ERRNO_CASE(e) case e: return #e;
+ switch (errorno) {
+
+#ifdef EACCES
+ ERRNO_CASE(EACCES);
+#endif
+
+#ifdef EADDRINUSE
+ ERRNO_CASE(EADDRINUSE);
+#endif
+
+#ifdef EADDRNOTAVAIL
+ ERRNO_CASE(EADDRNOTAVAIL);
+#endif
+
+#ifdef EAFNOSUPPORT
+ ERRNO_CASE(EAFNOSUPPORT);
+#endif
+
+#ifdef EAGAIN
+ ERRNO_CASE(EAGAIN);
+#else
+# ifdef EWOULDBLOCK
+ ERRNO_CASE(EWOULDBLOCK);
+# endif
+#endif
+
+#ifdef EALREADY
+ ERRNO_CASE(EALREADY);
+#endif
+
+#ifdef EBADF
+ ERRNO_CASE(EBADF);
+#endif
+
+#ifdef EBADMSG
+ ERRNO_CASE(EBADMSG);
+#endif
+
+#ifdef EBUSY
+ ERRNO_CASE(EBUSY);
+#endif
+
+#ifdef ECANCELED
+ ERRNO_CASE(ECANCELED);
+#endif
+
+#ifdef ECHILD
+ ERRNO_CASE(ECHILD);
+#endif
+
+#ifdef ECONNABORTED
+ ERRNO_CASE(ECONNABORTED);
+#endif
+
+#ifdef ECONNREFUSED
+ ERRNO_CASE(ECONNREFUSED);
+#endif
+
+#ifdef ECONNRESET
+ ERRNO_CASE(ECONNRESET);
+#endif
+
+#ifdef EDEADLK
+ ERRNO_CASE(EDEADLK);
+#endif
+
+#ifdef EDESTADDRREQ
+ ERRNO_CASE(EDESTADDRREQ);
+#endif
+
+#ifdef EDOM
+ ERRNO_CASE(EDOM);
+#endif
+
+#ifdef EDQUOT
+ ERRNO_CASE(EDQUOT);
+#endif
+
+#ifdef EEXIST
+ ERRNO_CASE(EEXIST);
+#endif
+
+#ifdef EFAULT
+ ERRNO_CASE(EFAULT);
+#endif
+
+#ifdef EFBIG
+ ERRNO_CASE(EFBIG);
+#endif
+
+#ifdef EHOSTUNREACH
+ ERRNO_CASE(EHOSTUNREACH);
+#endif
+
+#ifdef EIDRM
+ ERRNO_CASE(EIDRM);
+#endif
+
+#ifdef EILSEQ
+ ERRNO_CASE(EILSEQ);
+#endif
+
+#ifdef EINPROGRESS
+ ERRNO_CASE(EINPROGRESS);
+#endif
+
+#ifdef EINTR
+ ERRNO_CASE(EINTR);
+#endif
+
+#ifdef EINVAL
+ ERRNO_CASE(EINVAL);
+#endif
+
+#ifdef EIO
+ ERRNO_CASE(EIO);
+#endif
+
+#ifdef EISCONN
+ ERRNO_CASE(EISCONN);
+#endif
+
+#ifdef EISDIR
+ ERRNO_CASE(EISDIR);
+#endif
+
+#ifdef ELOOP
+ ERRNO_CASE(ELOOP);
+#endif
+
+#ifdef EMFILE
+ ERRNO_CASE(EMFILE);
+#endif
+
+#ifdef EMLINK
+ ERRNO_CASE(EMLINK);
+#endif
+
+#ifdef EMSGSIZE
+ ERRNO_CASE(EMSGSIZE);
+#endif
+
+#ifdef EMULTIHOP
+ ERRNO_CASE(EMULTIHOP);
+#endif
+
+#ifdef ENAMETOOLONG
+ ERRNO_CASE(ENAMETOOLONG);
+#endif
+
+#ifdef ENETDOWN
+ ERRNO_CASE(ENETDOWN);
+#endif
+
+#ifdef ENETRESET
+ ERRNO_CASE(ENETRESET);
+#endif
+
+#ifdef ENETUNREACH
+ ERRNO_CASE(ENETUNREACH);
+#endif
+
+#ifdef ENFILE
+ ERRNO_CASE(ENFILE);
+#endif
+
+#ifdef ENOBUFS
+ ERRNO_CASE(ENOBUFS);
+#endif
+
+#ifdef ENODATA
+ ERRNO_CASE(ENODATA);
+#endif
+
+#ifdef ENODEV
+ ERRNO_CASE(ENODEV);
+#endif
+
+#ifdef ENOENT
+ ERRNO_CASE(ENOENT);
+#endif
+
+#ifdef ENOEXEC
+ ERRNO_CASE(ENOEXEC);
+#endif
+
+#ifdef ENOLCK
+ ERRNO_CASE(ENOLCK);
+#endif
+
+#ifdef ENOLINK
+ ERRNO_CASE(ENOLINK);
+#endif
+
+#ifdef ENOMEM
+ ERRNO_CASE(ENOMEM);
+#endif
+
+#ifdef ENOMSG
+ ERRNO_CASE(ENOMSG);
+#endif
+
+#ifdef ENOPROTOOPT
+ ERRNO_CASE(ENOPROTOOPT);
+#endif
+
+#ifdef ENOSPC
+ ERRNO_CASE(ENOSPC);
+#endif
+
+#ifdef ENOSR
+ ERRNO_CASE(ENOSR);
+#endif
+
+#ifdef ENOSTR
+ ERRNO_CASE(ENOSTR);
+#endif
+
+#ifdef ENOSYS
+ ERRNO_CASE(ENOSYS);
+#endif
+
+#ifdef ENOTCONN
+ ERRNO_CASE(ENOTCONN);
+#endif
+
+#ifdef ENOTDIR
+ ERRNO_CASE(ENOTDIR);
+#endif
+
+#ifdef ENOTEMPTY
+ ERRNO_CASE(ENOTEMPTY);
+#endif
+
+#ifdef ENOTSOCK
+ ERRNO_CASE(ENOTSOCK);
+#endif
+
+#ifdef ENOTSUP
+ ERRNO_CASE(ENOTSUP);
+#else
+# ifdef EOPNOTSUPP
+ ERRNO_CASE(EOPNOTSUPP);
+# endif
+#endif
+
+#ifdef ENOTTY
+ ERRNO_CASE(ENOTTY);
+#endif
+
+#ifdef ENXIO
+ ERRNO_CASE(ENXIO);
+#endif
+
+
+#ifdef EOVERFLOW
+ ERRNO_CASE(EOVERFLOW);
+#endif
+
+#ifdef EPERM
+ ERRNO_CASE(EPERM);
+#endif
+
+#ifdef EPIPE
+ ERRNO_CASE(EPIPE);
+#endif
+
+#ifdef EPROTO
+ ERRNO_CASE(EPROTO);
+#endif
+
+#ifdef EPROTONOSUPPORT
+ ERRNO_CASE(EPROTONOSUPPORT);
+#endif
+
+#ifdef EPROTOTYPE
+ ERRNO_CASE(EPROTOTYPE);
+#endif
+
+#ifdef ERANGE
+ ERRNO_CASE(ERANGE);
+#endif
+
+#ifdef EROFS
+ ERRNO_CASE(EROFS);
+#endif
+
+#ifdef ESPIPE
+ ERRNO_CASE(ESPIPE);
+#endif
+
+#ifdef ESRCH
+ ERRNO_CASE(ESRCH);
+#endif
+
+#ifdef ESTALE
+ ERRNO_CASE(ESTALE);
+#endif
+
+#ifdef ETIME
+ ERRNO_CASE(ETIME);
+#endif
+
+#ifdef ETIMEDOUT
+ ERRNO_CASE(ETIMEDOUT);
+#endif
+
+#ifdef ETXTBSY
+ ERRNO_CASE(ETXTBSY);
+#endif
+
+#ifdef EXDEV
+ ERRNO_CASE(EXDEV);
+#endif
+
+ default: return "";
+ }
+}
+
+
+Local<Value> ErrnoException(int errorno,
+ const char *syscall,
+ const char *msg) {
+ Local<String> estring = String::NewSymbol(errno_string(errorno));
+ if (!msg[0]) msg = strerror(errorno);
+ Local<String> message = String::NewSymbol(msg);
+
+ Local<String> cons1 = String::Concat(estring, String::NewSymbol(", "));
+ Local<String> cons2 = String::Concat(cons1, message);
+
+ Local<Value> e = Exception::Error(cons2);
+
+ Local<Object> obj = e->ToObject();
+
+ if (errno_symbol.IsEmpty()) {
+ syscall_symbol = NODE_PSYMBOL("syscall");
+ errno_symbol = NODE_PSYMBOL("errno");
+ }
+
+ obj->Set(errno_symbol, Integer::New(errorno));
+ if (syscall) obj->Set(syscall_symbol, String::NewSymbol(syscall));
+ return e;
+}
+
+
enum encoding ParseEncoding(Handle<Value> encoding_v, enum encoding _default) {
HandleScope scope;
View
@@ -77,5 +77,9 @@ static inline void cb_destroy(v8::Persistent<v8::Function> * cb) {
delete cb;
}
+v8::Local<v8::Value> ErrnoException(int errorno,
+ const char *syscall = NULL,
+ const char *msg = "");
+
} // namespace node
#endif // SRC_NODE_H_
Oops, something went wrong.

0 comments on commit c9e27b1

Please sign in to comment.