diff options
Diffstat (limited to 'Userland/kill.cpp')
-rw-r--r-- | Userland/kill.cpp | 39 |
1 files changed, 28 insertions, 11 deletions
diff --git a/Userland/kill.cpp b/Userland/kill.cpp index 573b58fe4c..10cc9c1b62 100644 --- a/Userland/kill.cpp +++ b/Userland/kill.cpp @@ -1,6 +1,7 @@ -#include <LibC/unistd.h> -#include <LibC/stdio.h> -#include <LibC/signal.h> +#include <unistd.h> +#include <stdio.h> +#include <signal.h> +#include <stdlib.h> #include <AK/String.h> static unsigned parseUInt(const String& str, bool& ok) @@ -18,20 +19,36 @@ static unsigned parseUInt(const String& str, bool& ok) return value; } +static void print_usage_and_exit() +{ + printf("usage: kill [-signal] <PID>\n"); + exit(1); +} + int main(int argc, char** argv) { - if (argc < 2) { - printf("usage: kill <PID>\n"); - return 1; - } + if (argc != 2 && argc != 3) + print_usage_and_exit(); bool ok; - unsigned value = parseUInt(argv[1], ok); + unsigned signum = SIGTERM; + int pid_argi = 1; + if (argc == 3) { + pid_argi = 2; + if (argv[1][0] != '-') + print_usage_and_exit(); + signum = parseUInt(&argv[1][1], ok); + if (!ok) { + printf("%s is not a valid signal number\n", &argv[1][1]); + return 2; + } + } + unsigned pid = parseUInt(argv[pid_argi], ok); if (!ok) { - printf("%s is not a valid PID\n", argv[1]); - return 2; + printf("%s is not a valid PID\n", argv[pid_argi]); + return 3; } - kill((pid_t)value, SIGKILL); + kill((pid_t)pid, signum); return 0; } |