summaryrefslogtreecommitdiff
path: root/Userland/kill.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Userland/kill.cpp')
-rw-r--r--Userland/kill.cpp39
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;
}