local io={} function io.close(file) return(file or io.output()):close() end function io.flush() return io.output():flush() end function io.lines(filename,...) if filename then local file,reason=io.open(filename) if not file then error(reason,2) end local args=table.pack(...) return function() local result=table.pack(file:read(table.unpack(args,1,args.n))) if not result[1]then if result[2]then error(result[2],2) else file:close() return nil end end return table.unpack(result,1,result.n) end else return io.input():lines() end end function io.open(path,mode) local resolved_path=require("shell").resolve(path) local stream,result=require("filesystem").open(resolved_path,mode) if stream then return require("buffer").new(mode,stream) else return nil,result end end function io.stream(fd,file,mode) checkArg(1,fd,'number') checkArg(2,file,"table","string","nil") assert(fd>=0,'fd must be >= 0. 0 is input, 1 is stdout, 2 is stderr') local dio=require("process").info().data.io if file then if type(file)=="string"then file=assert(io.open(file,mode)) end dio[fd]=file end return dio[fd] end function io.input(file) return io.stream(0,file,'r') end function io.output(file) return io.stream(1,file,'w') end function io.error(file) return io.stream(2,file,'w') end function io.popen(prog,mode,env) return require("pipe").popen(prog,mode,env) end function io.read(...) return io.input():read(...) end function io.tmpfile() local name=os.tmpname() if name then return io.open(name,"a") end end function io.type(object) if type(object)=="table"then if getmetatable(object)=="file"then if object.stream.handle then return"file" else return"closed file" end end end return nil end function io.write(...) return io.output():write(...) end local dup_mt={__index=function(dfd,key) local fd_value=dfd.fd[key] if key~="close"and type(fd_value)~="function"then return fd_value end return function(self,...) if key=="close"or self._closed then self._closed=true return end return fd_value(self.fd,...) end end,__newindex=function(dfd,key,value) dfd.fd[key]=value end} function io.dup(fd) return setmetatable({fd=fd,_closed=false},dup_mt) end return io