ztacacs/src/main.zig
2023-09-21 10:54:27 -05:00

58 lines
1.6 KiB
Zig

const std = @import("std");
const serde = @import("serde.zig");
const packet = @import("packet.zig");
pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
const allocator = gpa.allocator();
var socket = std.net.StreamServer.init(.{ .reuse_address = true, .reuse_port = true });
defer socket.deinit();
try socket.listen(std.net.Address.initIp4(.{ 127, 0, 0, 1 }, 4949));
while (true) {
const server = try allocator.create(Server);
server.* = Server{
.allocator = allocator,
.conn = try socket.accept(),
};
const thread = try std.Thread.spawn(.{ .allocator = allocator }, Server.run, .{server});
thread.detach();
}
}
const Server = struct {
allocator: std.mem.Allocator,
conn: std.net.StreamServer.Connection,
const Self = @This();
pub fn run(self: *Self) !void {
std.debug.print("starting: {}\n", .{self.conn.address});
defer self.deinit();
while (true) {
var buffer: [@sizeOf(packet.Header)]u8 = undefined;
const len = try self.conn.stream.read(buffer[0..]);
// if (len < @sizeOf(packet.Header)) break;
if (len == 0) break;
std.debug.print("{}\n", .{len});
_ = try self.conn.stream.write(buffer[0..len]);
}
std.debug.print("finished\n", .{});
}
fn deinit(self: *Self) void {
std.debug.print("start deinit\n", .{});
self.conn.stream.close();
self.allocator.destroy(self);
std.debug.print("end deinit\n", .{});
}
};
test "main" {
std.debug.print("hello\n", .{});
}