hachem.wtf
aboutsummaryrefslogtreecommitdiff
path: root/kernel/fs.rv
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/fs.rv')
-rw-r--r--kernel/fs.rv49
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)