aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIsaac Freund <ifreund@ifreund.xyz>2020-07-05 14:49:34 +0200
committerIsaac Freund <ifreund@ifreund.xyz>2020-07-05 14:49:34 +0200
commit9dd18c6373cd68a978a4994a9cb7219d4d748471 (patch)
tree352c05bda31187d157ed8814e84207c6e02042c7
parent86386e84bc9c252dca9bf00917d8755ec51ad8d6 (diff)
downloadriver-9dd18c6373cd68a978a4994a9cb7219d4d748471.tar.gz
river-9dd18c6373cd68a978a4994a9cb7219d4d748471.tar.xz
server: exit cleanly on SIGINT and SIGTERM
-rw-r--r--river/main.zig19
1 files changed, 18 insertions, 1 deletions
diff --git a/river/main.zig b/river/main.zig
index 6bf769f..d7875da 100644
--- a/river/main.zig
+++ b/river/main.zig
@@ -32,6 +32,8 @@ const usage: []const u8 =
\\
;
+var server: Server = undefined;
+
pub fn main() anyerror!void {
var startup_command: ?[]const u8 = null;
{
@@ -69,7 +71,15 @@ pub fn main() anyerror!void {
log.info(.server, "initializing", .{});
- var server: Server = undefined;
+ // Setup a handler for SIGINT and SIGTERM so we can clean up properly
+ var act = std.os.Sigaction{
+ .sigaction = handleSignal,
+ .mask = std.os.empty_sigset,
+ .flags = 0,
+ };
+ std.os.sigaction(std.os.SIGINT, &act, null);
+ std.os.sigaction(std.os.SIGTERM, &act, null);
+
try server.init();
defer server.deinit();
@@ -94,3 +104,10 @@ fn printErrorExit(comptime format: []const u8, args: var) noreturn {
stderr.print(format ++ "\n", args) catch std.os.exit(1);
std.os.exit(1);
}
+
+fn handleSignal(sig: i32, info: *const std.os.siginfo_t, ctx_ptr: ?*const c_void) callconv(.C) void {
+ switch (sig) {
+ std.os.SIGINT, std.os.SIGTERM => c.wl_display_terminate(server.wl_display),
+ else => unreachable,
+ }
+}