From 7b146ef6adbf764e54b8f896258e7372c31a253f Mon Sep 17 00:00:00 2001 From: Julian Hurst Date: Wed, 8 Nov 2023 01:57:01 +0100 Subject: Add "list" command and change invalidquery -> error --- sync.ha | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/sync.ha b/sync.ha index 10ae57d..85cc302 100644 --- a/sync.ha +++ b/sync.ha @@ -5,6 +5,7 @@ use net::tcp; use net::ip; use types; use bufio; +use memio; use shlex; use io; use unix::poll; @@ -37,33 +38,45 @@ fn savepos(filename: str, position: str) (void | saveposerr) = { fmt::fprint(f, position)?; }; -fn handlequery(query: const []u8) (void | []u8 | quit | error) = { +fn handlequery(query: const []u8) (void | []u8 | str | quit | error) = { log::printfln("query: {}", strings::fromutf8_unsafe(query)); let s = strings::fromutf8(query)?; let spl = shlex::split(s)?; defer strings::freeall(spl); if (len(spl) == 0) { - return "Empty query": invalidquery; + return "Empty query": error; }; switch (spl[0]) { case "save" => if (len(spl) != 3) { - return "save takes 2 arguments (filename, position)": invalidquery; + return "save takes 2 arguments (filename, position)": error; }; savepos(spl[1], spl[2])?; case "get" => if (len(spl) != 2) { - return "get takes 1 argument (filename)": invalidquery; + return "get takes 1 argument (filename)": error; }; let pbuf = path::init(datafolder, spl[1])?; let f = os::open(path::string(&pbuf))?; let buf = io::drain(f)?; log::printfln("sending buf: {}", strings::fromutf8_unsafe(buf)); return buf; + case "list" => + let dirs = os::readdir(datafolder)?; + defer fs::dirents_free(dirs); + let buf = memio::dynamic(); + defer io::close(&buf)!; + let sep = ""; + for (let i = 0z; i < len(dirs); i += 1) { + let dir = dirs[i]; + memio::concat(&buf, sep, dir.name)?; + sep = "\n"; + }; + return strings::dup(memio::string(&buf)?); case "quit" => return quit; case => - return "Unknown query": invalidquery; + return "Unknown query": error; }; }; @@ -149,7 +162,7 @@ export fn main() void = { if (pollfds[j].revents & poll::event::POLLIN != 0) { let s = pollfds[j].fd; log::printfln("client at index {} with fd {}", j, s: int); - let line = match (bufio::scanline(s)) { + let line = match (bufio::read_line(s)) { case let line: []u8 => yield line; case io::EOF => @@ -179,6 +192,14 @@ export fn main() void = { case size => yield; }; + case let buf: str => + defer free(buf); + match (fmt::fprintfln(s, "{}", buf)) { + case let e: io::error => + log::println(io::strerror(e)); + case size => + yield; + }; }; }; }; -- cgit v1.2.3