|
- local minitel = require "minitel"
- local serial = require "serialization"
-
- local cfg = {["path"]="/boot/srv/frequest",["port"]=70}
-
- f=io.open("/boot/cfg/fserv.cfg","rb")
- if f then
- local ncfg = serial.unserialize(f:read("*a"))
- f:close()
- for k,v in pairs(ncfg) do
- cfg[k] = v
- end
- end
-
- local function fileHandler(socket,rtype,path)
- syslog(string.format("[%s:%d] %s %s",socket.addr,socket.port,rtype,path),syslog.info,"fserv")
- if rtype == "t" then
- if fs.exists(path) and fs.isDirectory(path) then
- socket:write("d")
- for _,file in ipairs(fs.list(path)) do
- socket:write(file.."\n")
- end
- elseif fs.exists(path) and not fs.isDirectory(path) then
- local f,err = io.open(path,"rb")
- if f then
- socket:write("y")
- while true do
- local c = f:read(4096)
- if not c or c == "" then break end
- socket:write(c)
- end
- else
- socket:write("fFailed to open file: "..err)
- end
- else
- socket:write("nFile not found")
- end
- elseif rtype == "s" then
- if fs.exists(path) then
- local ftype = "f"
- if fs.isDirectory(path) then
- ftype = "d"
- end
- socket:write(string.format("y%s\n%d",ftype,fs.size(path)))
- else
- socket:write("nFile not found.")
- end
- else
- socket:write("fUnknown request type")
- end
- socket:close()
- end
- local function httpHandler(socket,rtype,path)
- socket:write("fHTTP requests are not yet implemented.")
- socket:close()
- end
-
- local function socketHandler(socket)
- return function()
- local line = nil
- repeat
- coroutine.yield()
- line = socket:read()
- until line
- local rtype, path = line:match("(.)(.+)")
- if path:sub(1,6) == "/http/" or path:sub(1,5) == "http/" then
- httpHandler(socket,rtype,path)
- else
- path = (cfg.path .. "/" .. path:gsub("../","")):gsub("/+","/")
- fileHandler(socket,rtype,path)
- end
- socket:close()
- end
- end
-
- while true do
- os.spawn(socketHandler(minitel.listen(70)))
- end
|