main.zig 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. const std = @import("std");
  2. const net = std.net;
  3. const posix = std.posix;
  4. const fmt = std.fmt;
  5. const socket = @import("socket.zig");
  6. const command = @import("command.zig");
  7. const persistence = @import("persistence.zig");
  8. const PORT = 8085;
  9. pub fn main() !void {
  10. const listener = try socket.init(PORT);
  11. defer posix.close(listener);
  12. std.debug.print("2025 pizzakv! TCP Listening on port {any}\n<danilo@fragoso.dev>\n---------\n", .{PORT});
  13. std.debug.print("Commands:\n\nread key\nwrite key|value\ndelete key\nstatus\n", .{});
  14. std.debug.print("---------\n", .{});
  15. try persistence.init();
  16. while (true) {
  17. var client_address: net.Address = undefined;
  18. var client_address_len: posix.socklen_t = @sizeOf(net.Address);
  19. const conn = posix.accept(listener, &client_address.any, &client_address_len, 0) catch |err| {
  20. std.debug.print("error accept: {any}", .{err});
  21. continue;
  22. };
  23. const thread = try std.Thread.spawn(.{}, handleConnection, .{conn});
  24. thread.detach();
  25. }
  26. }
  27. pub fn handleConnection(conn: posix.socket_t) !void {
  28. defer posix.close(conn);
  29. var requestBuffer: [1024 * 1024]u8 = undefined;
  30. var responseBuffer: [1024 * 1024]u8 = undefined;
  31. while (true) {
  32. const n = try socket.readUntilCR(conn, &requestBuffer);
  33. if (n == 0) {
  34. break;
  35. }
  36. const cmdResponse = command.parse(requestBuffer[0..n]) orelse {
  37. socket.write(conn, "error\r") catch |err| {
  38. std.debug.print("error writing: {any}", .{err});
  39. };
  40. continue;
  41. };
  42. @memcpy(responseBuffer[0..cmdResponse.len], cmdResponse);
  43. responseBuffer[cmdResponse.len] = '\r';
  44. socket.write(conn, responseBuffer[0 .. cmdResponse.len + 1]) catch |err| {
  45. std.debug.print("error writing: {any}", .{err});
  46. };
  47. }
  48. }