1,luci在openwrt上使用的是uhttpd服务器,了解不多,uhttpd会将lua的默认io修改连接到uhttpd,当调用io.write时会传到uhttpd中!所以想写到web上,直接把html代码调用io.write就可以显示!
2,入口在/www文件下,lua的入口程序在sgi/cgi.lua中的run函数,在这里会建立httpdispatch的协程,当协程没dead就会不停地调用!所以实际的函数运作在httpdispatch中!以下是run中的程序,在httpdispatch中调用yeild协程,就会把数据返回到这里,分为6种!id=4,传递HTML代码到uhttpd;id=5,刷新缓冲区;id=1,响应消息比如200OK;id=3,4写消息头字段。
if active then
if id == 1 then
io.write("Status: " .. tostring(data1) .. " " .. data2 .. "\r\n")
elseif id == 2 then
hcache = hcache .. data1 .. ": " .. data2 .. "\r\n"
elseif id == 3 then
io.write(hcache)
io.write("\r\n")
elseif id == 4 then
io.write(tostring(data1 or ""))
elseif id == 5 then
io.flush()
io.close()
active = false
elseif id == 6 then
data1:copyz(nixio.stdout, data2)
data1:close()
end
end
3,接下在进入httpdispatch中,在这里调用dispatch中,这是真正实际运作的程序!
这里要介绍一下util.coxpcall程序,在此之后还会继续出现,当调用这个函数时,会为传递的参数(一个函数)再建立一个协程,当协程中的协程yield时,会递归的把上一级直到dispatch这个协程yield,作用待会在说。
local stat, err = util.coxpcall(function()
dispatch(context.request)
end, error500)
4,接下来进入dispatch函数,
第一步,调用createtree函数建立node-tree(结点是非常重要的之后再说)。