mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-16 16:56:09 +03:00
termio: clean up error handling for kill
This commit is contained in:
@ -16,6 +16,7 @@ const renderer = @import("../renderer.zig");
|
|||||||
const log = std.log.scoped(.io_exec);
|
const log = std.log.scoped(.io_exec);
|
||||||
|
|
||||||
const c = @cImport({
|
const c = @cImport({
|
||||||
|
@cInclude("errno.h");
|
||||||
@cInclude("signal.h");
|
@cInclude("signal.h");
|
||||||
@cInclude("unistd.h");
|
@cInclude("unistd.h");
|
||||||
});
|
});
|
||||||
@ -119,7 +120,8 @@ pub fn init(alloc: Allocator, opts: termio.Options) !Exec {
|
|||||||
|
|
||||||
pub fn deinit(self: *Exec) void {
|
pub fn deinit(self: *Exec) void {
|
||||||
// Kill our command
|
// Kill our command
|
||||||
self.killCommand();
|
self.killCommand() catch |err|
|
||||||
|
log.err("error sending SIGHUP to command, may hang: {}", .{err});
|
||||||
_ = self.command.wait() catch |err|
|
_ = self.command.wait() catch |err|
|
||||||
log.err("error waiting for command to exit: {}", .{err});
|
log.err("error waiting for command to exit: {}", .{err});
|
||||||
|
|
||||||
@ -130,15 +132,35 @@ pub fn deinit(self: *Exec) void {
|
|||||||
/// Kill the underlying subprocess. This closes the pty file handle and
|
/// Kill the underlying subprocess. This closes the pty file handle and
|
||||||
/// sends a SIGHUP to the child process. This doesn't wait for the child
|
/// sends a SIGHUP to the child process. This doesn't wait for the child
|
||||||
/// process to be exited.
|
/// process to be exited.
|
||||||
fn killCommand(self: *Exec) void {
|
fn killCommand(self: *Exec) !void {
|
||||||
// Close our PTY
|
// Close our PTY
|
||||||
self.pty.deinit();
|
self.pty.deinit();
|
||||||
|
|
||||||
// We need to get our process group ID and send a SIGHUP to it.
|
// We need to get our process group ID and send a SIGHUP to it.
|
||||||
if (self.command.pid) |pid| {
|
if (self.command.pid) |pid| {
|
||||||
const pgid = c.getpgid(pid);
|
const pgid_: ?c.pid_t = pgid: {
|
||||||
if (pgid > 0) {
|
const pgid = c.getpgid(pid);
|
||||||
_ = c.killpg(pgid, c.SIGHUP);
|
|
||||||
|
// Don't know why it would be zero but its not a valid pid
|
||||||
|
if (pgid == 0) break :pgid null;
|
||||||
|
|
||||||
|
// If the pid doesn't exist then... okay.
|
||||||
|
if (pgid == c.ESRCH) break :pgid null;
|
||||||
|
|
||||||
|
// If we have an error...
|
||||||
|
if (pgid < 0) {
|
||||||
|
log.warn("error getting pgid for kill", .{});
|
||||||
|
break :pgid null;
|
||||||
|
}
|
||||||
|
|
||||||
|
break :pgid pgid;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (pgid_) |pgid| {
|
||||||
|
if (c.killpg(pgid, c.SIGHUP) < 0) {
|
||||||
|
log.warn("error killing process group pgid={}", .{pgid});
|
||||||
|
return error.KillFailed;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user