summaryrefslogtreecommitdiffhomepage
path: root/libs/luci-lib-nixio/root/usr/lib/lua/nixio
diff options
context:
space:
mode:
Diffstat (limited to 'libs/luci-lib-nixio/root/usr/lib/lua/nixio')
-rw-r--r--libs/luci-lib-nixio/root/usr/lib/lua/nixio/fs.lua175
-rw-r--r--libs/luci-lib-nixio/root/usr/lib/lua/nixio/util.lua270
2 files changed, 445 insertions, 0 deletions
diff --git a/libs/luci-lib-nixio/root/usr/lib/lua/nixio/fs.lua b/libs/luci-lib-nixio/root/usr/lib/lua/nixio/fs.lua
new file mode 100644
index 0000000000..8883835f30
--- /dev/null
+++ b/libs/luci-lib-nixio/root/usr/lib/lua/nixio/fs.lua
@@ -0,0 +1,175 @@
+--[[
+nixio - Linux I/O library for lua
+
+Copyright 2009 Steven Barth <steven@midlink.org>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+$Id$
+]]--
+
+local table = require "table"
+local nixio = require "nixio"
+local type, ipairs, setmetatable = type, ipairs, setmetatable
+require "nixio.util"
+
+
+module ("nixio.fs", function(m) setmetatable(m, {__index = nixio.fs}) end)
+
+
+function readfile(path, limit)
+ local fd, code, msg = nixio.open(path, "r")
+ local data
+ if not fd then
+ return nil, code, msg
+ end
+
+ data, code, msg = fd:readall(limit)
+
+ fd:close()
+ return data, code, msg
+end
+
+
+function writefile(path, data)
+ local fd, code, msg, stat = nixio.open(path, "w")
+ if not fd then
+ return nil, code, msg
+ end
+
+ stat, code, msg = fd:writeall(data)
+
+ fd:close()
+ return stat, code, msg
+end
+
+function datacopy(src, dest, size)
+ local fdin, code, msg = nixio.open(src, "r")
+ if not fdin then
+ return nil, code, msg
+ end
+
+ local fdout, code, msg = nixio.open(dest, "w")
+ if not fdout then
+ return nil, code, msg
+ end
+
+ local stat, code, msg, sent = fdin:copy(fdout, size)
+ fdin:close()
+ fdout:close()
+
+ return stat, code, msg, sent
+end
+
+function copy(src, dest)
+ local stat, code, msg, res = nixio.fs.lstat(src)
+ if not stat then
+ return nil, code, msg
+ end
+
+ if stat.type == "dir" then
+ if nixio.fs.stat(dest, type) ~= "dir" then
+ res, code, msg = nixio.fs.mkdir(dest)
+ else
+ stat = true
+ end
+ elseif stat.type == "lnk" then
+ res, code, msg = nixio.fs.symlink(nixio.fs.readlink(src), dest)
+ elseif stat.type == "reg" then
+ res, code, msg = datacopy(src, dest)
+ end
+
+ if not res then
+ return nil, code, msg
+ end
+
+ nixio.fs.utimes(dest, stat.atime, stat.mtime)
+
+ if nixio.fs.lchown then
+ nixio.fs.lchown(dest, stat.uid, stat.gid)
+ end
+
+ if stat.type ~= "lnk" then
+ nixio.fs.chmod(dest, stat.modedec)
+ end
+
+ return true
+end
+
+function move(src, dest)
+ local stat, code, msg = nixio.fs.rename(src, dest)
+ if not stat and code == nixio.const.EXDEV then
+ stat, code, msg = copy(src, dest)
+ if stat then
+ stat, code, msg = nixio.fs.unlink(src)
+ end
+ end
+ return stat, code, msg
+end
+
+function mkdirr(dest, mode)
+ if nixio.fs.stat(dest, "type") == "dir" then
+ return true
+ else
+ local stat, code, msg = nixio.fs.mkdir(dest, mode)
+ if not stat and code == nixio.const.ENOENT then
+ stat, code, msg = mkdirr(nixio.fs.dirname(dest), mode)
+ if stat then
+ stat, code, msg = nixio.fs.mkdir(dest, mode)
+ end
+ end
+ return stat, code, msg
+ end
+end
+
+local function _recurse(cb, src, dest)
+ local type = nixio.fs.lstat(src, "type")
+ if type ~= "dir" then
+ return cb(src, dest)
+ else
+ local stat, se, code, msg, s, c, m = true, nixio.const.sep
+ if dest then
+ s, c, m = cb(src, dest)
+ stat, code, msg = stat and s, c or code, m or msg
+ end
+
+ for e in nixio.fs.dir(src) do
+ if dest then
+ s, c, m = _recurse(cb, src .. se .. e, dest .. se .. e)
+ else
+ s, c, m = _recurse(cb, src .. se .. e)
+ end
+ stat, code, msg = stat and s, c or code, m or msg
+ end
+
+ if not dest then -- Postfix
+ s, c, m = cb(src)
+ stat, code, msg = stat and s, c or code, m or msg
+ end
+
+ return stat, code, msg
+ end
+end
+
+function copyr(src, dest)
+ return _recurse(copy, src, dest)
+end
+
+function mover(src, dest)
+ local stat, code, msg = nixio.fs.rename(src, dest)
+ if not stat and code == nixio.const.EXDEV then
+ stat, code, msg = _recurse(copy, src, dest)
+ if stat then
+ stat, code, msg = _recurse(nixio.fs.remove, src)
+ end
+ end
+ return stat, code, msg
+end
+
+function remover(src)
+ return _recurse(nixio.fs.remove, src)
+end \ No newline at end of file
diff --git a/libs/luci-lib-nixio/root/usr/lib/lua/nixio/util.lua b/libs/luci-lib-nixio/root/usr/lib/lua/nixio/util.lua
new file mode 100644
index 0000000000..63d2f62147
--- /dev/null
+++ b/libs/luci-lib-nixio/root/usr/lib/lua/nixio/util.lua
@@ -0,0 +1,270 @@
+--[[
+nixio - Linux I/O library for lua
+
+Copyright 2009 Steven Barth <steven@midlink.org>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+$Id$
+]]--
+
+local table = require "table"
+local nixio = require "nixio"
+local getmetatable, assert, pairs, type = getmetatable, assert, pairs, type
+local tostring = tostring
+
+module "nixio.util"
+
+local BUFFERSIZE = nixio.const.buffersize
+local ZIOBLKSIZE = 65536
+local socket = nixio.meta_socket
+local tls_socket = nixio.meta_tls_socket
+local file = nixio.meta_file
+local uname = nixio.uname()
+local ZBUG = uname.sysname == "Linux" and uname.release:sub(1, 3) == "2.4"
+
+function consume(iter, append)
+ local tbl = append or {}
+ if iter then
+ for obj in iter do
+ tbl[#tbl+1] = obj
+ end
+ end
+ return tbl
+end
+
+local meta = {}
+
+function meta.is_socket(self)
+ return (getmetatable(self) == socket)
+end
+
+function meta.is_tls_socket(self)
+ return (getmetatable(self) == tls_socket)
+end
+
+function meta.is_file(self)
+ return (getmetatable(self) == file)
+end
+
+function meta.readall(self, len)
+ local block, code, msg = self:read(len or BUFFERSIZE)
+
+ if not block then
+ return nil, code, msg, ""
+ elseif #block == 0 then
+ return "", nil, nil, ""
+ end
+
+ local data, total = {block}, #block
+
+ while not len or len > total do
+ block, code, msg = self:read(len and (len - total) or BUFFERSIZE)
+
+ if not block then
+ return nil, code, msg, table.concat(data)
+ elseif #block == 0 then
+ break
+ end
+
+ data[#data+1], total = block, total + #block
+ end
+
+ local data = #data > 1 and table.concat(data) or data[1]
+ return data, nil, nil, data
+end
+meta.recvall = meta.readall
+
+function meta.writeall(self, data)
+ data = tostring(data)
+ local sent, code, msg = self:write(data)
+
+ if not sent then
+ return nil, code, msg, 0
+ end
+
+ local total = sent
+
+ while total < #data do
+ sent, code, msg = self:write(data, total)
+
+ if not sent then
+ return nil, code, msg, total
+ end
+
+ total = total + sent
+ end
+
+ return total, nil, nil, total
+end
+meta.sendall = meta.writeall
+
+function meta.linesource(self, limit)
+ limit = limit or BUFFERSIZE
+ local buffer = ""
+ local bpos = 0
+ return function(flush)
+ local line, endp, _
+
+ if flush then
+ line = buffer:sub(bpos + 1)
+ buffer = type(flush) == "string" and flush or ""
+ bpos = 0
+ return line
+ end
+
+ while not line do
+ _, endp, line = buffer:find("(.-)\r?\n", bpos + 1)
+ if line then
+ bpos = endp
+ return line
+ elseif #buffer < limit + bpos then
+ local newblock, code, msg = self:read(limit + bpos - #buffer)
+ if not newblock then
+ return nil, code, msg
+ elseif #newblock == 0 then
+ return nil
+ end
+ buffer = buffer:sub(bpos + 1) .. newblock
+ bpos = 0
+ else
+ return nil, 0
+ end
+ end
+ end
+end
+
+function meta.blocksource(self, bs, limit)
+ bs = bs or BUFFERSIZE
+ return function()
+ local toread = bs
+ if limit then
+ if limit < 1 then
+ return nil
+ elseif limit < toread then
+ toread = limit
+ end
+ end
+
+ local block, code, msg = self:read(toread)
+
+ if not block then
+ return nil, code, msg
+ elseif #block == 0 then
+ return nil
+ else
+ if limit then
+ limit = limit - #block
+ end
+
+ return block
+ end
+ end
+end
+
+function meta.sink(self, close)
+ return function(chunk, src_err)
+ if not chunk and not src_err and close then
+ if self.shutdown then
+ self:shutdown()
+ end
+ self:close()
+ elseif chunk and #chunk > 0 then
+ return self:writeall(chunk)
+ end
+ return true
+ end
+end
+
+function meta.copy(self, fdout, size)
+ local source = self:blocksource(nil, size)
+ local sink = fdout:sink()
+ local sent, chunk, code, msg = 0
+
+ repeat
+ chunk, code, msg = source()
+ sink(chunk, code, msg)
+ sent = chunk and (sent + #chunk) or sent
+ until not chunk
+ return not code and sent or nil, code, msg, sent
+end
+
+function meta.copyz(self, fd, size)
+ local sent, lsent, code, msg = 0
+ local splicable
+
+ if not ZBUG and self:is_file() then
+ local ftype = self:stat("type")
+ if nixio.sendfile and fd:is_socket() and ftype == "reg" then
+ repeat
+ lsent, code, msg = nixio.sendfile(fd, self, size or ZIOBLKSIZE)
+ if lsent then
+ sent = sent + lsent
+ size = size and (size - lsent)
+ end
+ until (not lsent or lsent == 0 or (size and size == 0))
+ if lsent or (not lsent and sent == 0 and
+ code ~= nixio.const.ENOSYS and code ~= nixio.const.EINVAL) then
+ return lsent and sent, code, msg, sent
+ end
+ elseif nixio.splice and not fd:is_tls_socket() and ftype == "fifo" then
+ splicable = true
+ end
+ end
+
+ if nixio.splice and fd:is_file() and not splicable then
+ splicable = not self:is_tls_socket() and fd:stat("type") == "fifo"
+ end
+
+ if splicable then
+ repeat
+ lsent, code, msg = nixio.splice(self, fd, size or ZIOBLKSIZE)
+ if lsent then
+ sent = sent + lsent
+ size = size and (size - lsent)
+ end
+ until (not lsent or lsent == 0 or (size and size == 0))
+ if lsent or (not lsent and sent == 0 and
+ code ~= nixio.const.ENOSYS and code ~= nixio.const.EINVAL) then
+ return lsent and sent, code, msg, sent
+ end
+ end
+
+ return self:copy(fd, size)
+end
+
+if tls_socket then
+ function tls_socket.close(self)
+ return self.socket:close()
+ end
+
+ function tls_socket.getsockname(self)
+ return self.socket:getsockname()
+ end
+
+ function tls_socket.getpeername(self)
+ return self.socket:getpeername()
+ end
+
+ function tls_socket.getsockopt(self, ...)
+ return self.socket:getsockopt(...)
+ end
+ tls_socket.getopt = tls_socket.getsockopt
+
+ function tls_socket.setsockopt(self, ...)
+ return self.socket:setsockopt(...)
+ end
+ tls_socket.setopt = tls_socket.setsockopt
+end
+
+for k, v in pairs(meta) do
+ file[k] = v
+ socket[k] = v
+ if tls_socket then
+ tls_socket[k] = v
+ end
+end