summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Hurst <ark@mansus.space>2023-11-08 01:57:01 +0100
committerJulian Hurst <ark@mansus.space>2023-11-08 01:57:01 +0100
commit7b146ef6adbf764e54b8f896258e7372c31a253f (patch)
treecb28e7b01ff0f13b721639a61c3aae1e21708a20
parent857b01a24136917b64d985932fd454ae081bd37c (diff)
downloadmediasync-7b146ef6adbf764e54b8f896258e7372c31a253f.tar.gz
Add "list" command and change invalidquery -> error
-rw-r--r--sync.ha33
1 files 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;
+ };
};
};
};