aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/bindings/Process.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/bun.js/bindings/Process.cpp')
-rw-r--r--src/bun.js/bindings/Process.cpp147
1 files changed, 112 insertions, 35 deletions
diff --git a/src/bun.js/bindings/Process.cpp b/src/bun.js/bindings/Process.cpp
index f9fb85b95..745be0e47 100644
--- a/src/bun.js/bindings/Process.cpp
+++ b/src/bun.js/bindings/Process.cpp
@@ -444,43 +444,43 @@ static HashMap<int, String>* signalNumberToNameMap = nullptr;
static HashMap<int, HashSet<uint32_t>>* signalToContextIdsMap = nullptr;
static Lock signalToContextIdsMapLock;
-static void onDidChangeListeners(EventEmitter& eventEmitter, const Identifier& eventName, bool isAdded)
+static const NeverDestroyed<String> signalNames[] = {
+ MAKE_STATIC_STRING_IMPL("SIGHUP"),
+ MAKE_STATIC_STRING_IMPL("SIGINT"),
+ MAKE_STATIC_STRING_IMPL("SIGQUIT"),
+ MAKE_STATIC_STRING_IMPL("SIGILL"),
+ MAKE_STATIC_STRING_IMPL("SIGTRAP"),
+ MAKE_STATIC_STRING_IMPL("SIGABRT"),
+ MAKE_STATIC_STRING_IMPL("SIGIOT"),
+ MAKE_STATIC_STRING_IMPL("SIGBUS"),
+ MAKE_STATIC_STRING_IMPL("SIGFPE"),
+ MAKE_STATIC_STRING_IMPL("SIGKILL"),
+ MAKE_STATIC_STRING_IMPL("SIGUSR1"),
+ MAKE_STATIC_STRING_IMPL("SIGSEGV"),
+ MAKE_STATIC_STRING_IMPL("SIGUSR2"),
+ MAKE_STATIC_STRING_IMPL("SIGPIPE"),
+ MAKE_STATIC_STRING_IMPL("SIGALRM"),
+ MAKE_STATIC_STRING_IMPL("SIGTERM"),
+ MAKE_STATIC_STRING_IMPL("SIGCHLD"),
+ MAKE_STATIC_STRING_IMPL("SIGCONT"),
+ MAKE_STATIC_STRING_IMPL("SIGSTOP"),
+ MAKE_STATIC_STRING_IMPL("SIGTSTP"),
+ MAKE_STATIC_STRING_IMPL("SIGTTIN"),
+ MAKE_STATIC_STRING_IMPL("SIGTTOU"),
+ MAKE_STATIC_STRING_IMPL("SIGURG"),
+ MAKE_STATIC_STRING_IMPL("SIGXCPU"),
+ MAKE_STATIC_STRING_IMPL("SIGXFSZ"),
+ MAKE_STATIC_STRING_IMPL("SIGVTALRM"),
+ MAKE_STATIC_STRING_IMPL("SIGPROF"),
+ MAKE_STATIC_STRING_IMPL("SIGWINCH"),
+ MAKE_STATIC_STRING_IMPL("SIGIO"),
+ MAKE_STATIC_STRING_IMPL("SIGINFO"),
+ MAKE_STATIC_STRING_IMPL("SIGSYS"),
+};
+
+static void loadSignalNumberMap()
{
- static const NeverDestroyed<String> signalNames[] = {
- MAKE_STATIC_STRING_IMPL("SIGHUP"),
- MAKE_STATIC_STRING_IMPL("SIGINT"),
- MAKE_STATIC_STRING_IMPL("SIGQUIT"),
- MAKE_STATIC_STRING_IMPL("SIGILL"),
- MAKE_STATIC_STRING_IMPL("SIGTRAP"),
- MAKE_STATIC_STRING_IMPL("SIGABRT"),
- MAKE_STATIC_STRING_IMPL("SIGIOT"),
- MAKE_STATIC_STRING_IMPL("SIGBUS"),
- MAKE_STATIC_STRING_IMPL("SIGFPE"),
- MAKE_STATIC_STRING_IMPL("SIGKILL"),
- MAKE_STATIC_STRING_IMPL("SIGUSR1"),
- MAKE_STATIC_STRING_IMPL("SIGSEGV"),
- MAKE_STATIC_STRING_IMPL("SIGUSR2"),
- MAKE_STATIC_STRING_IMPL("SIGPIPE"),
- MAKE_STATIC_STRING_IMPL("SIGALRM"),
- MAKE_STATIC_STRING_IMPL("SIGTERM"),
- MAKE_STATIC_STRING_IMPL("SIGCHLD"),
- MAKE_STATIC_STRING_IMPL("SIGCONT"),
- MAKE_STATIC_STRING_IMPL("SIGSTOP"),
- MAKE_STATIC_STRING_IMPL("SIGTSTP"),
- MAKE_STATIC_STRING_IMPL("SIGTTIN"),
- MAKE_STATIC_STRING_IMPL("SIGTTOU"),
- MAKE_STATIC_STRING_IMPL("SIGURG"),
- MAKE_STATIC_STRING_IMPL("SIGXCPU"),
- MAKE_STATIC_STRING_IMPL("SIGXFSZ"),
- MAKE_STATIC_STRING_IMPL("SIGVTALRM"),
- MAKE_STATIC_STRING_IMPL("SIGPROF"),
- MAKE_STATIC_STRING_IMPL("SIGWINCH"),
- MAKE_STATIC_STRING_IMPL("SIGIO"),
- MAKE_STATIC_STRING_IMPL("SIGINFO"),
- MAKE_STATIC_STRING_IMPL("SIGSYS"),
- };
-
static std::once_flag signalNameToNumberMapOnceFlag;
std::call_once(signalNameToNumberMapOnceFlag, [] {
signalNameToNumberMap = new HashMap<String, int>();
@@ -523,6 +523,11 @@ static void onDidChangeListeners(EventEmitter& eventEmitter, const Identifier& e
#endif
signalNameToNumberMap->add(signalNames[30], SIGSYS);
});
+}
+
+static void onDidChangeListeners(EventEmitter& eventEmitter, const Identifier& eventName, bool isAdded)
+{
+ loadSignalNumberMap();
static std::once_flag signalNumberToNameMapOnceFlag;
std::call_once(signalNumberToNameMapOnceFlag, [] {
@@ -1601,6 +1606,76 @@ JSC_DEFINE_HOST_FUNCTION(Process_functionCwd,
return JSC::JSValue::encode(result);
}
+JSC_DEFINE_HOST_FUNCTION(Process_functionReallyKill,
+ (JSC::JSGlobalObject * globalObject, JSC::CallFrame* callFrame))
+{
+ auto scope = DECLARE_THROW_SCOPE(globalObject->vm());
+
+ int pid = callFrame->argument(0).toInt32(globalObject);
+ RETURN_IF_EXCEPTION(scope, {});
+
+ int signal = callFrame->argument(1).toInt32(globalObject);
+ RETURN_IF_EXCEPTION(scope, {});
+
+ int result = kill(pid, signal);
+ if (result == -1) {
+ SystemError error;
+ error.errno_ = errno;
+ error.syscall = Bun::toString("kill"_s);
+ throwException(globalObject, scope, JSValue::decode(SystemError__toErrorInstance(&error, globalObject)));
+ return JSValue::encode(jsUndefined());
+ }
+
+ return JSValue::encode(jsUndefined());
+}
+JSC_DEFINE_HOST_FUNCTION(Process_functionKill,
+ (JSC::JSGlobalObject * globalObject, JSC::CallFrame* callFrame))
+{
+ auto scope = DECLARE_THROW_SCOPE(globalObject->vm());
+
+ int pid = callFrame->argument(0).toInt32(globalObject);
+ RETURN_IF_EXCEPTION(scope, {});
+ if (pid < 0) {
+ throwRangeError(globalObject, scope, "pid must be a positive integer"_s);
+ return JSValue::encode(jsUndefined());
+ }
+
+ JSC::JSValue signalValue = callFrame->argument(1);
+
+ int signal = SIGTERM;
+
+ if (signalValue.isNumber()) {
+ signal = signalValue.toInt32(globalObject);
+ RETURN_IF_EXCEPTION(scope, {});
+ } else if (signalValue.isString()) {
+ loadSignalNumberMap();
+ if (auto num = signalNameToNumberMap->get(signalValue.toWTFString(globalObject))) {
+ signal = num;
+ RETURN_IF_EXCEPTION(scope, {});
+ } else {
+ throwRangeError(globalObject, scope, "Unknown signal name"_s);
+ return JSValue::encode(jsUndefined());
+ }
+
+ RETURN_IF_EXCEPTION(scope, {});
+ } else if (!signalValue.isUndefinedOrNull()) {
+ throwTypeError(globalObject, scope, "signal must be a string or number"_s);
+ return JSValue::encode(jsUndefined());
+ }
+
+ int result = kill(pid, signal);
+
+ if (result == -1) {
+ SystemError error;
+ error.errno_ = errno;
+ error.syscall = Bun::toString("kill"_s);
+ throwException(globalObject, scope, JSValue::decode(SystemError__toErrorInstance(&error, globalObject)));
+ return JSValue::encode(jsUndefined());
+ }
+
+ return JSValue::encode(jsUndefined());
+}
+
/* Source for Process.lut.h
@begin processObjectTable
abort Process_functionAbort Function 1
@@ -1632,6 +1707,7 @@ JSC_DEFINE_HOST_FUNCTION(Process_functionCwd,
getuid Process_functiongetuid Function 0
hrtime constructProcessHrtimeObject PropertyCallback
isBun constructIsBun PropertyCallback
+ kill Process_functionKill Function 2
mainModule JSBuiltin ReadOnly|Builtin|Accessor|Function 0
memoryUsage constructMemoryUsage PropertyCallback
moduleLoadList Process_stubEmptyArray PropertyCallback
@@ -1663,6 +1739,7 @@ JSC_DEFINE_HOST_FUNCTION(Process_functionCwd,
_startProfilerIdleNotifier Process_stubEmptyFunction Function 0
_stopProfilerIdleNotifier Process_stubEmptyFunction Function 0
_tickCallback Process_stubEmptyFunction Function 0
+ _kill Process_functionReallyKill Function 2
@end
*/