local sys = require 'lx.sys' local sysdef = require 'lx.sysdef' local _cwd = 'root:/' function explode_path(path) local _, _, dr, p = string.find(path, '^(%w+):(.*)$') if not dr or not p then dr, p = nil, path end local pp = string.split(p, '/') if #pp > 1 and pp[#pp] == '' then table.remove(pp) end return dr, pp end function implode_path(dr, p) assert(p[1] == '', 'bad first path component') return dr .. ':' .. table.concat(p, '/') end function pathcat(path1, path2) assert(path1, "invalid argument") if not path2 then return path1 end local dr2, p2 = explode_path(path2) if dr2 then return implode_path(dr2, p2) else local dr, p1 = explode_path(path1) assert(p1[1] == '', 'bad path1!') local p = p1 if p2[1] == '' then p = {} end for _, v in pairs(p2) do if v == '..' then table.remove(p) elseif v ~= '.' then table.insert(p, v) end end return implode_path(dr, p) end end function cd(path) -- TODO path simplification etc local newcwd = pathcat(_cwd, path) local s = sys.stat(newcwd) if not s then print("not found: " .. newcwd) elseif s.type & sysdef.FT_DIR == 0 then print("not a directory: " .. newcwd) else _cwd = newcwd print(_cwd) end end function cwd() return _cwd end function ls(path) path = pathcat(_cwd, path) local fd = sys.open(path, sysdef.FM_READDIR) if not fd then print("Could not open " .. path) else local i = 0 while true do x = sys.readdir(fd, i) if not x then break end if x.type & sysdef.FT_DIR ~= 0 then x.name = x.name .. '/' end print(x.type, x.access, x.size, x.name) i = i + 1 end sys.close(fd) end end function run(path) path = pathcat(_cwd, path) local s = sys.stat(path) if not s then print("not found: " .. path) elseif s.type & sysdef.FT_DIR == 0 then print("not a directory: " .. s) else local mainlua = pathcat(path, 'main.lua') local s2 = sys.stat(mainlua) if not s2 then print("not found: " .. mainlua) else local pid = sys.new_proc() sys.bind_fs(pid, "sys", "sys") local _, _, dr, p = string.find(path, '^(%w+):(.*)$') sys.bind_subfs(pid, "app", dr, p, sysdef.FM_READ | sysdef.FM_READDIR) sys.bind_fd(pid, sysdef.STD_FD_TTY_STDIO, sysdef.STD_FD_TTY_STDIO) sys.proc_exec(pid, "sys:/bin/lx.bin") local st = sys.proc_wait(pid, true) print(st) end end end