diff --git a/os/mingw.c b/os/mingw.c index 7317dfb2..f4215c1d 100644 --- a/os/mingw.c +++ b/os/mingw.c @@ -2774,6 +2774,23 @@ int os_term(pid_t pid) return 0; } +int os_kill(pid_t pid) +{ + if (pid <= 0) { + errno = EINVAL; + return -1; + } + + HANDLE h = (void*)pid; + + if (!TerminateProcess(h, 1)) { + windows_errno(GetLastError()); + return -1; + } + + return 0; +} + int os_command(const char* command, const char* run_as_user, const char* stdin_text) { wchar_t conv[CONV_MAX]; diff --git a/os/os.h b/os/os.h index 16e4bbd1..a1f822b9 100644 --- a/os/os.h +++ b/os/os.h @@ -140,6 +140,13 @@ pid_t os_wait(pid_t pid, int* status); */ int os_term(pid_t pid); +/** + * Forcibly terminate a process. + * \param pid Process ID of the process to kill. + * \return 0 on success, -1 on failure. + */ +int os_kill(pid_t pid); + /** * Fork and execute a verified executable, discarding all I/O. * diff --git a/os/unix.c b/os/unix.c index ed5a74d3..32466ae7 100644 --- a/os/unix.c +++ b/os/unix.c @@ -1300,6 +1300,11 @@ int os_wait(pid_t pid, int* status) int os_term(pid_t pid) { + if (pid <= 0) { + errno = EINVAL; + return -1; + } + /* * Send signal to the negative PID to target the entire Process Group. * This ensures that SnapRAID and any programs it may have spawned are @@ -1308,6 +1313,17 @@ int os_term(pid_t pid) return kill(-pid, SIGTERM); } +int os_kill(pid_t pid) +{ + if (pid <= 0) { + errno = EINVAL; + return -1; + } + + /* Send SIGKILL signal to the negative PID to target the entire Process Group */ + return kill(-pid, SIGKILL); +} + int os_spawn_and_wait(const char** argv) { pid_t pid = os_spawn((char**)argv, 0, 0, 0);