diff options
| author | Nathan Reiner <nathan@nathanreiner.xyz> | 2025-11-13 17:23:58 +0100 |
|---|---|---|
| committer | Nathan Reiner <nathan@nathanreiner.xyz> | 2025-11-13 17:23:58 +0100 |
| commit | 464dc81c4214960ed7eb3ddf9c3238755cf148a1 (patch) | |
| tree | 9a80214ff625cc57fe17ee80a750266f66f66fe6 /src/main.zig | |
| parent | c7b02f02ad0a7e2888f2d7d3599719e59bbd1ee2 (diff) | |
add HandlerInfo
Diffstat (limited to 'src/main.zig')
| -rw-r--r-- | src/main.zig | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/src/main.zig b/src/main.zig index 2566120..be43352 100644 --- a/src/main.zig +++ b/src/main.zig @@ -7,14 +7,36 @@ pub const std_options = std.Options { const log = std.log.scoped(.main); +var net_server: std.net.Server = undefined; + +fn signal_handler(signo: i32) callconv(.c) void { + if (signo == std.os.linux.SIG.INT) { + log.info("shutdown", .{}); + net_server.deinit(); + std.process.exit(0); + } +} + +fn register_sigaction() void { + var sa = std.os.linux.Sigaction{ + .handler = .{ .handler = signal_handler }, + .mask = std.mem.zeroes(std.os.linux.sigset_t), + .flags = 0, + }; + + _ = std.os.linux.sigaction(std.os.linux.SIG.INT, &sa, null); +} + pub fn main() !void { + register_sigaction(); + var gpa = std.heap.GeneralPurposeAllocator(.{}){}; defer std.debug.assert(gpa.deinit() == .ok); const allocator = gpa.allocator(); - const address = try std.net.Address.parseIpAndPort("127.0.0.1:8080"); - var net_server = try address.listen(.{}); + const address = try std.net.Address.parseIpAndPort("0.0.0.0:8080"); + net_server = try address.listen(.{ .reuse_address = true }); defer net_server.deinit(); log.info("listening on {f}", .{address}); @@ -35,10 +57,7 @@ pub fn main() !void { var request = http_server.receiveHead() catch continue; log.info("{} {s}", .{request.head.method, request.head.target}); - const handler = memora.routes.get(request.head.target); - - handler(&request, allocator) catch |err| { - log.err("handler({s}): {}", .{request.head.target, err}); - }; + const handler_info = memora.routes.get(request.head.target); + try handler_info.handle(&request, allocator); } } |