diff options
Diffstat (limited to 'kernel/fs.rv')
| -rw-r--r-- | kernel/fs.rv | 49 |
1 files changed, 37 insertions, 12 deletions
diff --git a/kernel/fs.rv b/kernel/fs.rv index b23be7f..f732573 100644 --- a/kernel/fs.rv +++ b/kernel/fs.rv @@ -364,24 +364,24 @@ global fs = { const parent = self:resolve_parent(path) if parent == :nil do - puts("mkdir: #{path}: bad path\n") + fail("mkdir: #{path}: bad path\n") return :nil end if parent.name:len() > NAME_MAX do - puts("name too long (max #{NAME_MAX})\n") + fail("name too long (max #{NAME_MAX})\n") return :nil end if self:dir_lookup(parent.dir, parent.name) != :nil do - puts("mkdir: #{parent.name}: already exists\n") + fail("mkdir: #{parent.name}: already exists\n") return :nil end const new_block = self:fat_alloc() if new_block == 0 do - puts("disk full\n") + fail("disk full\n") return :nil end @@ -412,7 +412,7 @@ global fs = { if existing != :nil do if existing.type == T_DIR do - puts("#{parent.name}: is a directory\n") + fail("#{parent.name}: is a directory\n") return 0 end @@ -428,7 +428,7 @@ global fs = { const block = self:fat_alloc() if block == 0 do - puts("disk full\n") + fail("disk full\n") return 0 end @@ -534,6 +534,30 @@ global fs = { return entry.size end, + # TODO: ts needs a rewrite its not cheap and rewrites every file from scratch + fn write_at(self, path, offset, bytes) -> num do + const size = self:size(path) + let base = "" + + if size > 0 do base = self:read_bytes(path, 0, size) end + + let prefix = "" + + if offset <= base:len() do + prefix = base[0..offset] + end else do + prefix = base + while (prefix:len() < offset) do prefix = prefix ~ string.of_ascii(0) end + end + + const after = offset + bytes:len() + let tail = "" + + if after < base:len() do tail = base[after..] end + + return self:store(path, prefix ~ bytes ~ tail) + end, + fn cat(self, path) do if self:ensure() == :false do return :nil @@ -542,12 +566,12 @@ global fs = { const entry = self:resolve(path) if entry == :nil do - puts("cat: #{path}: no such file\n") + fail("cat: #{path}: no such file\n") return :nil end if entry.type == T_DIR do - puts("cat: #{path}: is a directory\n") + fail("cat: #{path}: is a directory\n") return :nil end @@ -582,7 +606,7 @@ global fs = { const entry = self:resolve(path) if entry == :nil do - puts("ls: #{path}: no such file\n") + fail("ls: #{path}: no such file\n") return -1 end @@ -630,19 +654,19 @@ global fs = { const parent = self:resolve_parent(path) if parent == :nil do - puts("rm: #{path}: no such file\n") + fail("rm: #{path}: no such file\n") return :nil end const entry = self:dir_lookup(parent.dir, parent.name) if entry == :nil do - puts("rm: #{path}: no such file\n") + fail("rm: #{path}: no such file\n") return :nil end if entry.type == T_DIR and self:dir_empty(entry.first) == :false do - puts("rm: #{parent.name}: directory not empty\n") + fail("rm: #{parent.name}: directory not empty\n") return :nil end @@ -718,3 +742,4 @@ global fs = { global fs_store = fn(name, text) fs:store(name, text) global fs_size = fn(name) fs:size(name) global fs_read_bytes = fn(name, offset, length) fs:read_bytes(name, offset, length) +global fs_write_at = fn(name, offset, bytes) fs:write_at(name, offset, bytes) |
