Serenity Operating System
at master 78 lines 1.9 kB view raw
1/* 2 * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#include <AK/DeprecatedString.h> 8#include <AK/Optional.h> 9#include <LibCore/System.h> 10#include <LibMain/Main.h> 11#include <ctype.h> 12#include <signal.h> 13#include <stdio.h> 14#include <stdlib.h> 15#include <unistd.h> 16 17static void print_usage_and_exit() 18{ 19 warnln("usage: kill [-signal] <PID>"); 20 exit(1); 21} 22 23ErrorOr<int> serenity_main(Main::Arguments arguments) 24{ 25 26 TRY(Core::System::pledge("stdio proc")); 27 28 int argc = arguments.argc; 29 auto strings = arguments.strings; 30 31 if (argc == 2 && strings[1] == "-l") { 32 for (size_t i = 0; i < NSIG; ++i) { 33 if (i && !(i % 5)) 34 outln(""); 35 out("{:2}) {:10}", i, getsignalname(i)); 36 } 37 outln(""); 38 return 0; 39 } 40 41 if (argc != 2 && argc != 3) 42 print_usage_and_exit(); 43 unsigned signum = SIGTERM; 44 int pid_argi = 1; 45 if (argc == 3) { 46 pid_argi = 2; 47 if (strings[1][0] != '-') 48 print_usage_and_exit(); 49 50 Optional<unsigned> number; 51 52 if (isalpha(strings[1][1])) { 53 int value = getsignalbyname(&strings[1][1]); 54 if (value >= 0 && value < NSIG) 55 number = value; 56 } 57 58 if (!number.has_value()) 59 number = strings[1].substring_view(1, 1).to_uint(); 60 61 if (!number.has_value()) { 62 warnln("'{}' is not a valid signal name or number", &strings[1][1]); 63 return 2; 64 } 65 signum = number.value(); 66 } 67 auto pid_opt = strings[pid_argi].to_int(); 68 if (!pid_opt.has_value()) { 69 warnln("'{}' is not a valid PID", strings[pid_argi]); 70 return 3; 71 } 72 pid_t pid = pid_opt.value(); 73 74 int rc = kill(pid, signum); 75 if (rc < 0) 76 perror("kill"); 77 return 0; 78}