From 4fdf95cb92b1937115888e5077d35ff120fe1a9b Mon Sep 17 00:00:00 2001 From: Yuta Imazu Date: Sun, 1 Sep 2024 06:39:33 +0900 Subject: [PATCH] kill: add signum argument --- userland/kill.c | 46 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/userland/kill.c b/userland/kill.c index 06a0249a..252c1bb4 100644 --- a/userland/kill.c +++ b/userland/kill.c @@ -1,20 +1,46 @@ #include #include #include +#include #include -int main(int argc, char* argv[]) { - if (argc != 2) { - dprintf(STDERR_FILENO, "Usage: kill PID\n"); - return EXIT_FAILURE; +static void usage(void) { + dprintf(STDERR_FILENO, "Usage: kill [-SIGNUM] PID\n"); + exit(EXIT_FAILURE); +} + +static int parse_signum(const char* s) { + if (str_is_uint(s)) + return atoi(s); + for (int i = 0; i < NSIG; ++i) { + if (!strcmp(s, sys_signame[i])) + return i; } - const char* pid_str = argv[1]; - if (!str_is_uint(pid_str)) { - dprintf(STDERR_FILENO, "Illegal pid: %s\n", pid_str); - return EXIT_FAILURE; + return -1; +} + +int main(int argc, char* argv[]) { + if (argc < 2) + usage(); + + pid_t pid = -1; + int signum = SIGTERM; + for (int i = 1; i < argc; ++i) { + const char* arg = argv[i]; + if (arg[0] == '-') { + signum = parse_signum(arg + 1); + if (signum < 0 || signum >= NSIG) + usage(); + } else if (str_is_uint(arg)) { + pid = atoi(arg); + } else { + usage(); + } } - pid_t pid = atoi(pid_str); - if (kill(pid, SIGTERM) < 0) { + if (pid < 0) + usage(); + + if (kill(pid, signum) < 0) { perror("kill"); return EXIT_FAILURE; }