Skip to content

Commit d3bcd9b

Browse files
xeioexstefansundin
andcommitted
Introduced process.kill().
Co-authored-by: Stefan Sundin <git@stefansundin.com>
1 parent 352c2e5 commit d3bcd9b

File tree

7 files changed

+375
-152
lines changed

7 files changed

+375
-152
lines changed

external/njs_shell.c

+10-112
Original file line numberDiff line numberDiff line change
@@ -1901,15 +1901,17 @@ njs_qjs_clear_timeout(JSContext *ctx, JSValueConst this_val, int argc,
19011901
}
19021902

19031903

1904+
static JSValue
1905+
njs_qjs_console_to_string_tag(JSContext *ctx, JSValueConst this_val)
1906+
{
1907+
return JS_NewString(ctx, "Console");
1908+
}
1909+
1910+
19041911
static JSValue
19051912
njs_qjs_process_getter(JSContext *ctx, JSValueConst this_val)
19061913
{
1907-
char **ep;
1908-
JSAtom atom;
1909-
JSValue obj, val, str, name, env;
1910-
njs_int_t ret;
1911-
njs_uint_t i;
1912-
const char *entry, *value;
1914+
JSValue obj;
19131915
njs_console_t *console;
19141916

19151917
console = JS_GetRuntimeOpaque(JS_GetRuntime(ctx));
@@ -1918,106 +1920,8 @@ njs_qjs_process_getter(JSContext *ctx, JSValueConst this_val)
19181920
return JS_DupValue(ctx, console->process);
19191921
}
19201922

1921-
obj = JS_NewObject(ctx);
1922-
if (JS_IsException(obj)) {
1923-
return JS_EXCEPTION;
1924-
}
1925-
1926-
ret = qjs_set_to_string_tag(ctx, obj, "process");
1927-
if (ret == -1) {
1928-
JS_FreeValue(ctx, obj);
1929-
return JS_EXCEPTION;
1930-
}
1931-
1932-
val = JS_NewArray(ctx);
1933-
if (JS_IsException(val)) {
1934-
JS_FreeValue(ctx, obj);
1935-
return JS_EXCEPTION;
1936-
}
1937-
1938-
ret = JS_SetPropertyStr(ctx, obj, "argv", val);
1939-
if (ret == -1) {
1940-
JS_FreeValue(ctx, obj);
1941-
JS_FreeValue(ctx, val);
1942-
return JS_EXCEPTION;
1943-
}
1944-
1945-
for (i = 0; i < console->argc; i++) {
1946-
str = JS_NewStringLen(ctx, console->argv[i],
1947-
njs_strlen(console->argv[i]));
1948-
if (JS_IsException(str)) {
1949-
JS_FreeValue(ctx, obj);
1950-
return JS_EXCEPTION;
1951-
}
1952-
1953-
ret = JS_DefinePropertyValueUint32(ctx, val, i, str, JS_PROP_C_W_E);
1954-
if (ret == -1) {
1955-
JS_FreeValue(ctx, obj);
1956-
return JS_EXCEPTION;
1957-
}
1958-
}
1959-
1960-
env = JS_NewObject(ctx);
1923+
obj = qjs_process_object(ctx, console->argc, (const char **) console->argv);
19611924
if (JS_IsException(obj)) {
1962-
JS_FreeValue(ctx, obj);
1963-
return JS_EXCEPTION;
1964-
}
1965-
1966-
ret = JS_SetPropertyStr(ctx, obj, "env", env);
1967-
if (ret == -1) {
1968-
JS_FreeValue(ctx, obj);
1969-
JS_FreeValue(ctx, env);
1970-
return JS_EXCEPTION;
1971-
}
1972-
1973-
ep = environ;
1974-
1975-
while (*ep != NULL) {
1976-
entry = *ep++;
1977-
1978-
value = (const char *) njs_strchr(entry, '=');
1979-
if (njs_slow_path(value == NULL)) {
1980-
continue;
1981-
}
1982-
1983-
str = JS_UNDEFINED;
1984-
name = JS_NewStringLen(ctx, entry, value - entry);
1985-
if (JS_IsException(name)) {
1986-
goto error;
1987-
}
1988-
1989-
str = JS_NewStringLen(ctx, value, njs_strlen(value));
1990-
if (JS_IsException(str)) {
1991-
goto error;
1992-
}
1993-
1994-
atom = JS_ValueToAtom(ctx, name);
1995-
if (atom == JS_ATOM_NULL) {
1996-
goto error;
1997-
}
1998-
1999-
ret = JS_DefinePropertyValue(ctx, env, atom, str, JS_PROP_C_W_E);
2000-
JS_FreeAtom(ctx, atom);
2001-
if (ret == -1) {
2002-
error:
2003-
JS_FreeValue(ctx, name);
2004-
JS_FreeValue(ctx, str);
2005-
JS_FreeValue(ctx, obj);
2006-
return JS_EXCEPTION;
2007-
}
2008-
2009-
JS_FreeValue(ctx, name);
2010-
}
2011-
2012-
ret = JS_SetPropertyStr(ctx, obj, "pid", JS_NewInt32(ctx, getpid()));
2013-
if (ret == -1) {
2014-
JS_FreeValue(ctx, obj);
2015-
return JS_EXCEPTION;
2016-
}
2017-
2018-
ret = JS_SetPropertyStr(ctx, obj, "ppid", JS_NewInt32(ctx, getppid()));
2019-
if (ret == -1) {
2020-
JS_FreeValue(ctx, obj);
20211925
return JS_EXCEPTION;
20221926
}
20231927

@@ -2583,6 +2487,7 @@ static const JSCFunctionListEntry njs_qjs_global_proto[] = {
25832487

25842488

25852489
static const JSCFunctionListEntry njs_qjs_console_proto[] = {
2490+
JS_CGETSET_DEF("[Symbol.toStringTag]", njs_qjs_console_to_string_tag, NULL),
25862491
JS_CFUNC_MAGIC_DEF("error", 0, njs_qjs_console_log, NJS_LOG_ERROR),
25872492
JS_CFUNC_MAGIC_DEF("info", 0, njs_qjs_console_log, NJS_LOG_INFO),
25882493
JS_CFUNC_MAGIC_DEF("log", 0, njs_qjs_console_log, NJS_LOG_INFO),
@@ -2759,13 +2664,6 @@ njs_engine_qjs_init(njs_engine_t *engine, njs_opts_t *opts)
27592664
goto done;
27602665
}
27612666

2762-
ret = qjs_set_to_string_tag(ctx, obj, "Console");
2763-
if (ret == -1) {
2764-
njs_stderror("qjs_set_to_string_tag() failed\n");
2765-
ret = NJS_ERROR;
2766-
goto done;
2767-
}
2768-
27692667
JS_SetOpaque(obj, &njs_console);
27702668

27712669
JS_SetPropertyFunctionList(ctx, obj, njs_qjs_console_proto,

src/njs_builtin.c

+95
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88

99
#include <njs_main.h>
10+
#include <signal.h>
1011

1112

1213
typedef struct {
@@ -22,6 +23,12 @@ typedef struct {
2223
} njs_builtin_traverse_t;
2324

2425

26+
typedef struct {
27+
njs_str_t name;
28+
int value;
29+
} njs_signal_entry_t;
30+
31+
2532
static njs_int_t njs_global_this_prop_handler(njs_vm_t *vm,
2633
njs_object_prop_t *self, njs_value_t *global, njs_value_t *setval,
2734
njs_value_t *retval);
@@ -99,6 +106,31 @@ static const njs_object_type_init_t *const
99106
};
100107

101108

109+
/* P1990 signals from `man 7 signal` are supported */
110+
static njs_signal_entry_t njs_signals_table[] = {
111+
{ njs_str("ABRT"), SIGABRT },
112+
{ njs_str("ALRM"), SIGALRM },
113+
{ njs_str("CHLD"), SIGCHLD },
114+
{ njs_str("CONT"), SIGCONT },
115+
{ njs_str("FPE"), SIGFPE },
116+
{ njs_str("HUP"), SIGHUP },
117+
{ njs_str("ILL"), SIGILL },
118+
{ njs_str("INT"), SIGINT },
119+
{ njs_str("KILL"), SIGKILL },
120+
{ njs_str("PIPE"), SIGPIPE },
121+
{ njs_str("QUIT"), SIGQUIT },
122+
{ njs_str("SEGV"), SIGSEGV },
123+
{ njs_str("STOP"), SIGSTOP },
124+
{ njs_str("TSTP"), SIGTSTP },
125+
{ njs_str("TERM"), SIGTERM },
126+
{ njs_str("TTIN"), SIGTTIN },
127+
{ njs_str("TTOU"), SIGTTOU },
128+
{ njs_str("USR1"), SIGUSR1 },
129+
{ njs_str("USR2"), SIGUSR2 },
130+
{ njs_null_str, 0 }
131+
};
132+
133+
102134
njs_inline njs_int_t
103135
njs_object_hash_init(njs_vm_t *vm, njs_lvlhsh_t *hash,
104136
const njs_object_init_t *init)
@@ -1380,6 +1412,67 @@ njs_process_object_ppid(njs_vm_t *vm, njs_object_prop_t *prop,
13801412
}
13811413

13821414

1415+
static njs_int_t
1416+
njs_ext_process_kill(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
1417+
njs_index_t magic, njs_value_t *retval)
1418+
{
1419+
int signal;
1420+
njs_str_t str;
1421+
njs_uint_t pid;
1422+
njs_value_t *arg;
1423+
njs_signal_entry_t *s;
1424+
1425+
arg = njs_arg(args, nargs, 1);
1426+
if (!njs_value_is_number(arg)) {
1427+
njs_vm_type_error(vm, "\"pid\" is not a number");
1428+
return NJS_ERROR;
1429+
}
1430+
1431+
pid = njs_value_number(arg);
1432+
signal = SIGTERM;
1433+
1434+
arg = njs_arg(args, nargs, 2);
1435+
if (njs_value_is_number(arg)) {
1436+
signal = njs_value_number(arg);
1437+
1438+
} else if (njs_value_is_string(arg)) {
1439+
njs_value_string_get(arg, &str);
1440+
1441+
if (str.length < 3 || memcmp(str.start, "SIG", 3) != 0) {
1442+
njs_vm_type_error(vm, "\"signal\" unknown value: \"%V\"", &str);
1443+
return NJS_ERROR;
1444+
}
1445+
1446+
str.start += 3;
1447+
str.length -= 3;
1448+
1449+
for (s = &njs_signals_table[0]; s->name.length != 0; s++) {
1450+
if (njs_strstr_eq(&str, &s->name)) {
1451+
signal = s->value;
1452+
break;
1453+
}
1454+
}
1455+
1456+
if (s->name.length == 0) {
1457+
njs_vm_type_error(vm, "\"signal\" unknown value");
1458+
return NJS_ERROR;
1459+
}
1460+
1461+
} else if (!njs_value_is_undefined(arg)) {
1462+
njs_vm_type_error(vm, "\"signal\" invalid type");
1463+
return NJS_ERROR;
1464+
}
1465+
1466+
if (kill(pid, signal) < 0) {
1467+
njs_vm_error(vm, "kill failed with (%d:%s)", errno, strerror(errno));
1468+
return NJS_ERROR;
1469+
}
1470+
1471+
njs_set_boolean(retval, 1);
1472+
return NJS_OK;
1473+
}
1474+
1475+
13831476
static const njs_object_prop_t njs_process_object_properties[] =
13841477
{
13851478
{
@@ -1396,6 +1489,8 @@ static const njs_object_prop_t njs_process_object_properties[] =
13961489
NJS_DECLARE_PROP_HANDLER("pid", njs_process_object_pid, 0, 0, 0),
13971490

13981491
NJS_DECLARE_PROP_HANDLER("ppid", njs_process_object_ppid, 0, 0, 0),
1492+
1493+
NJS_DECLARE_PROP_NATIVE("kill", njs_ext_process_kill, 2, 0),
13991494
};
14001495

14011496

0 commit comments

Comments
 (0)