aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/bindings/ProcessBindingUV.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/bun.js/bindings/ProcessBindingUV.cpp')
-rw-r--r--src/bun.js/bindings/ProcessBindingUV.cpp158
1 files changed, 158 insertions, 0 deletions
diff --git a/src/bun.js/bindings/ProcessBindingUV.cpp b/src/bun.js/bindings/ProcessBindingUV.cpp
new file mode 100644
index 000000000..8173072a9
--- /dev/null
+++ b/src/bun.js/bindings/ProcessBindingUV.cpp
@@ -0,0 +1,158 @@
+#include "ProcessBindingUV.h"
+#include "ZigGlobalObject.h"
+#include "JavaScriptCore/ObjectConstructor.h"
+#include "JavaScriptCore/JSMap.h"
+#include "JavaScriptCore/JSMapInlines.h"
+
+// clang-format off
+
+#define UV_ERRNO_MAP(macro) \
+ macro(E2BIG, -7, "argument list too long") \
+ macro(EACCES, -13, "permission denied") \
+ macro(EADDRINUSE, -48, "address already in use") \
+ macro(EADDRNOTAVAIL, -49, "address not available") \
+ macro(EAFNOSUPPORT, -47, "address family not supported") \
+ macro(EAGAIN, -35, "resource temporarily unavailable") \
+ macro(EAI_ADDRFAMILY, -3000, "address family not supported") \
+ macro(EAI_AGAIN, -3001, "temporary failure") \
+ macro(EAI_BADFLAGS, -3002, "bad ai_flags value") \
+ macro(EAI_BADHINTS, -3013, "invalid value for hints") \
+ macro(EAI_CANCELED, -3003, "request canceled") \
+ macro(EAI_FAIL, -3004, "permanent failure") \
+ macro(EAI_FAMILY, -3005, "ai_family not supported") \
+ macro(EAI_MEMORY, -3006, "out of memory") \
+ macro(EAI_NODATA, -3007, "no address") \
+ macro(EAI_NONAME, -3008, "unknown node or service") \
+ macro(EAI_OVERFLOW, -3009, "argument buffer overflow") \
+ macro(EAI_PROTOCOL, -3014, "resolved protocol is unknown") \
+ macro(EAI_SERVICE, -3010, "service not available for socket type") \
+ macro(EAI_SOCKTYPE, -3011, "socket type not supported") \
+ macro(EALREADY, -37, "connection already in progress") \
+ macro(EBADF, -9, "bad file descriptor") \
+ macro(EBUSY, -16, "resource busy or locked") \
+ macro(ECANCELED, -89, "operation canceled") \
+ macro(ECHARSET, -4080, "invalid Unicode character") \
+ macro(ECONNABORTED, -53, "software caused connection abort") \
+ macro(ECONNREFUSED, -61, "connection refused") \
+ macro(ECONNRESET, -54, "connection reset by peer") \
+ macro(EDESTADDRREQ, -39, "destination address required") \
+ macro(EEXIST, -17, "file already exists") \
+ macro(EFAULT, -14, "bad address in system call argument") \
+ macro(EFBIG, -27, "file too large") \
+ macro(EHOSTUNREACH, -65, "host is unreachable") \
+ macro(EINTR, -4, "interrupted system call") \
+ macro(EINVAL, -22, "invalid argument") \
+ macro(EIO, -5, "i/o error") \
+ macro(EISCONN, -56, "socket is already connected") \
+ macro(EISDIR, -21, "illegal operation on a directory") \
+ macro(ELOOP, -62, "too many symbolic links encountered") \
+ macro(EMFILE, -24, "too many open files") \
+ macro(EMSGSIZE, -40, "message too long") \
+ macro(ENAMETOOLONG, -63, "name too long") \
+ macro(ENETDOWN, -50, "network is down") \
+ macro(ENETUNREACH, -51, "network is unreachable") \
+ macro(ENFILE, -23, "file table overflow") \
+ macro(ENOBUFS, -55, "no buffer space available") \
+ macro(ENODEV, -19, "no such device") \
+ macro(ENOENT, -2, "no such file or directory") \
+ macro(ENOMEM, -12, "not enough memory") \
+ macro(ENONET, -4056, "machine is not on the network") \
+ macro(ENOPROTOOPT, -42, "protocol not available") \
+ macro(ENOSPC, -28, "no space left on device") \
+ macro(ENOSYS, -78, "function not implemented") \
+ macro(ENOTCONN, -57, "socket is not connected") \
+ macro(ENOTDIR, -20, "not a directory") \
+ macro(ENOTEMPTY, -66, "directory not empty") \
+ macro(ENOTSOCK, -38, "socket operation on non-socket") \
+ macro(ENOTSUP, -45, "operation not supported on socket") \
+ macro(EOVERFLOW, -84, "value too large for defined data type") \
+ macro(EPERM, -1, "operation not permitted") \
+ macro(EPIPE, -32, "broken pipe") \
+ macro(EPROTO, -100, "protocol error") \
+ macro(EPROTONOSUPPORT, -43, "protocol not supported") \
+ macro(EPROTOTYPE, -41, "protocol wrong type for socket") \
+ macro(ERANGE, -34, "result too large") \
+ macro(EROFS, -30, "read-only file system") \
+ macro(ESHUTDOWN, -58, "cannot send after transport endpoint shutdown") \
+ macro(ESPIPE, -29, "invalid seek") \
+ macro(ESRCH, -3, "no such process") \
+ macro(ETIMEDOUT, -60, "connection timed out") \
+ macro(ETXTBSY, -26, "text file is busy") \
+ macro(EXDEV, -18, "cross-device link not permitted") \
+ macro(UNKNOWN, -4094, "unknown error") \
+ macro(EOF, -4095, "end of file") \
+ macro(ENXIO, -6, "no such device or address") \
+ macro(EMLINK, -31, "too many links") \
+ macro(EHOSTDOWN, -64, "host is down") \
+ macro(EREMOTEIO, -4030, "remote I/O error") \
+ macro(ENOTTY, -25, "inappropriate ioctl for device") \
+ macro(EFTYPE, -79, "inappropriate file type or format") \
+ macro(EILSEQ, -92, "illegal byte sequence") \
+ macro(ESOCKTNOSUPPORT, -44, "socket type not supported") \
+ macro(ENODATA, -96, "no data available") \
+ macro(EUNATCH, -4023, "protocol driver not attache")
+
+// clang-format on
+namespace Bun {
+namespace ProcessBindingUV {
+
+JSC_DEFINE_HOST_FUNCTION(jsErrname, (JSGlobalObject * globalObject, JSC::CallFrame* callFrame))
+{
+ auto arg0 = callFrame->argument(0);
+ auto& vm = globalObject->vm();
+
+ // Node.js will actualy crash here, lol.
+ if (!arg0.isInt32())
+ return JSValue::encode(jsString(vm, makeString("Unknown system error "_s, arg0.toWTFString(globalObject))));
+
+ auto err = arg0.asInt32();
+ switch (err) {
+#define CASE(name, value, desc) \
+ case value: \
+ return JSValue::encode(JSC::jsString(vm, String(#name##_s)));
+
+ UV_ERRNO_MAP(CASE)
+#undef CASE
+ }
+
+ return JSValue::encode(jsString(vm, makeString("Unknown system error "_s, String::number(err))));
+}
+
+JSC_DEFINE_HOST_FUNCTION(jsGetErrorMap, (JSGlobalObject * globalObject, JSC::CallFrame* callFrame))
+{
+ auto& vm = globalObject->vm();
+ auto map = JSC::JSMap::create(vm, globalObject->mapStructure());
+
+#define PUT_PROPERTY(name, value, desc) \
+ { \
+ auto arr = JSC::constructEmptyArray(globalObject, nullptr, 2); \
+ arr->putDirectIndex(globalObject, 0, JSC::jsString(vm, String(#name##_s))); \
+ arr->putDirectIndex(globalObject, 1, JSC::jsString(vm, String(desc##_s))); \
+ map->set(globalObject, JSC::jsNumber(value), arr); \
+ }
+
+ UV_ERRNO_MAP(PUT_PROPERTY)
+#undef PUT_PROPERTY
+
+ return JSValue::encode(map);
+}
+
+JSObject* create(VM& vm, JSGlobalObject* globalObject)
+{
+ auto bindingObject = JSC::constructEmptyObject(globalObject, globalObject->objectPrototype(), 0);
+
+ bindingObject->putDirect(vm, JSC::Identifier::fromString(vm, "errname"_s), JSC::JSFunction::create(vm, globalObject, 1, "errname"_s, jsErrname, ImplementationVisibility::Public));
+
+#define PUT_PROPERTY(name, value, desc) \
+ bindingObject->putDirect(vm, JSC::Identifier::fromString(vm, "UV_" #name##_s), JSC::jsNumber(value));
+
+ UV_ERRNO_MAP(PUT_PROPERTY)
+#undef PUT_PROPERTY
+
+ bindingObject->putDirect(vm, JSC::Identifier::fromString(vm, "getErrorMap"_s), JSC::JSFunction::create(vm, globalObject, 0, "getErrorMap"_s, jsGetErrorMap, ImplementationVisibility::Public));
+
+ return bindingObject;
+}
+
+} // namespace ProcessBindingUV
+} // namespace Bun \ No newline at end of file