Author: Pedro Lucas Porcellis <porcellis@eletrotupi.com>
server: write to clients
cmd/beterrabad/socket2.ha | 41 +++++++++++++++++++++++++++++++++++++++--
diff --git a/cmd/beterrabad/socket2.ha b/cmd/beterrabad/socket2.ha
index b4103a249fe406ce9c104be0bbe42cacf5770029..4a07c208df42e6c333964bbb12b5b550952f7ca5 100644
--- a/cmd/beterrabad/socket2.ha
+++ b/cmd/beterrabad/socket2.ha
@@ -26,8 +26,15 @@ type client2 = struct {
server: *server2,
sock: io::file,
pollfd: *poll::pollfd,
+ state: state2,
wbuf: []u8,
rbuf: []u8
+};
+
+type state2 = enum {
+ READ,
+ WRITE,
+ WRITE_ERROR,
};
fn bind2(fd: io::file) server2 = {
@@ -116,7 +123,33 @@ read_client(s, client);
};
if (cpollfd.revents & event::POLLOUT != 0) {
- log::println("Write to client");
+ write_client(s, client);
+ };
+};
+
+fn write_client(s: *server2, client: *client2) void = {
+ let sz = match (io::write(client.sock, client.wbuf)) {
+ case let z: size =>
+ yield z;
+ case errors::again =>
+ return;
+ case let err: io::error =>
+ log::printfln("Couldn't write to client sock due to {}", io::strerror(err));
+ disconnect_client(client);
+
+ return;
+ };
+
+ // Clean up the buffer
+ delete(client.wbuf[..sz]);
+
+ switch (client.state) {
+ case state2::WRITE =>
+ client.state = state2::READ;
+ client.pollfd.events = event::POLLIN | event::POLLHUP;
+ case state2::WRITE_ERROR =>
+ disconnect(client);
+ case => abort();
};
};
@@ -137,7 +170,11 @@ case utf8::invalid =>
log::fatal("invalid utf-8");
};
- log::printfln("Line: {}", line);
+ exec2(line);
+};
+
+fn exec2(command: str) void = {
+ // TODO: Flesh out command execution here
};
// TODO: Check if we reached max client connections first