X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fluci.git;a=blobdiff_plain;f=libs%2Fcore%2Fluasrc%2Ffs.lua;h=a81ff675d41c1b3abd22da6ba4108149288173fb;hp=0fc7193890126ff5d839f5905ddd7e9212c89d2e;hb=33fba71fc94b84c33b1e600da9b195eac49b2e31;hpb=f10b0e58e2ca9a3c3760965e83a1bcac0954407a diff --git a/libs/core/luasrc/fs.lua b/libs/core/luasrc/fs.lua index 0fc719389..a81ff675d 100644 --- a/libs/core/luasrc/fs.lua +++ b/libs/core/luasrc/fs.lua @@ -24,10 +24,16 @@ limitations under the License. ]]-- ---- LuCI filesystem library. -module("luci.fs", package.seeall) +local io = require "io" +local os = require "os" +local ltn12 = require "luci.ltn12" +local fs = require "nixio.fs" +local nutil = require "nixio.util" + +local type = type -require("posix") +--- LuCI filesystem library. +module "luci.fs" --- Test for file access permission on given path. -- @class function @@ -36,7 +42,7 @@ require("posix") -- @return Number containing the return code, 0 on sucess or nil on error -- @return String containing the error description (if any) -- @return Number containing the os specific errno (if any) -access = posix.access +access = fs.access --- Evaluate given shell glob pattern and return a table containing all matching -- file and directory entries. @@ -46,48 +52,53 @@ access = posix.access -- @return Table containing file and directory entries or nil if no matches -- @return String containing the error description (if no matches) -- @return Number containing the os specific errno (if no matches) -glob = posix.glob +function glob(...) + local iter, code, msg = fs.glob(...) + if iter then + return nutil.consume(iter) + else + return nil, code, msg + end +end --- Checks wheather the given path exists and points to a regular file. --- @param filename String containing the path of the file to read +-- @param filename String containing the path of the file to test -- @return Boolean indicating wheather given path points to regular file function isfile(filename) - return posix.stat(filename, "type") == "regular" + return fs.stat(filename, "type") == "reg" +end + +--- Checks wheather the given path exists and points to a directory. +-- @param dirname String containing the path of the directory to test +-- @return Boolean indicating wheather given path points to directory +function isdirectory(dirname) + return fs.stat(dirname, "type") == "dir" end --- Read the whole content of the given file into memory. -- @param filename String containing the path of the file to read -- @return String containing the file contents or nil on error -- @return String containing the error message on error -function readfile(filename) - local fp, err = io.open(filename) - - if fp == nil then - return nil, err - end - - local data = fp:read("*a") - fp:close() - return data -end +readfile = fs.readfile --- Write the contents of given string to given file. -- @param filename String containing the path of the file to read -- @param data String containing the data to write -- @return Boolean containing true on success or nil on error -- @return String containing the error message on error -function writefile(filename, data) - local fp, err = io.open(filename, "w") +writefile = fs.writefile - if fp == nil then - return nil, err - end - - fp:write(data) - fp:close() +--- Copies a file. +-- @param source Source file +-- @param dest Destination +-- @return Boolean containing true on success or nil on error +copy = fs.datacopy - return true -end +--- Renames a file. +-- @param source Source file +-- @param dest Destination +-- @return Boolean containing true on success or nil on error +rename = fs.move --- Get the last modification time of given file path in Unix epoch format. -- @param path String containing the path of the file or directory to read @@ -95,7 +106,18 @@ end -- @return String containing the error description (if any) -- @return Number containing the os specific errno (if any) function mtime(path) - return posix.stat(path, "mtime") + return fs.stat(path, "mtime") +end + +--- Set the last modification time of given file path in Unix epoch format. +-- @param path String containing the path of the file or directory to read +-- @param mtime Last modification timestamp +-- @param atime Last accessed timestamp +-- @return 0 in case of success nil on error +-- @return String containing the error description (if any) +-- @return Number containing the os specific errno (if any) +function utime(path, mtime, atime) + return fs.utimes(path, atime, mtime) end --- Return the last element - usually the filename - from the given path with @@ -105,7 +127,7 @@ end -- @param path String containing the path to strip -- @return String containing the base name of given path -- @see dirname -basename = posix.basename +basename = fs.basename --- Return the directory component of the given path with the last element -- stripped of. @@ -114,7 +136,7 @@ basename = posix.basename -- @param path String containing the path to strip -- @return String containing the directory component of given path -- @see basename -dirname = posix.dirname +dirname = fs.dirname --- Return a table containing all entries of the specified directory. -- @class function @@ -123,7 +145,17 @@ dirname = posix.dirname -- @return Table containing file and directory entries or nil on error -- @return String containing the error description on error -- @return Number containing the os specific errno on error -dir = posix.dir +function dir(...) + local iter, code, msg = fs.dir(...) + if iter then + local t = nutil.consume(iter) + t[#t+1] = "." + t[#t+1] = ".." + return t + else + return nil, code, msg + end +end --- Create a new directory, recursively on demand. -- @param path String with the name or path of the directory to create @@ -132,36 +164,7 @@ dir = posix.dir -- @return String containing the error description on error -- @return Number containing the os specific errno on error function mkdir(path, recursive) - if recursive then - local base = "." - - if path:sub(1,1) == "/" then - base = "" - path = path:gsub("^/+","") - end - - for elem in path:gmatch("([^/]+)/*") do - base = base .. "/" .. elem - - local stat = posix.stat( base ) - - if not stat then - local stat, errmsg, errno = posix.mkdir( base ) - - if type(stat) ~= "number" or stat ~= 0 then - return stat, errmsg, errno - end - else - if stat.type ~= "directory" then - return nil, base .. ": File exists", 17 - end - end - end - - return 0 - else - return posix.mkdir( path ) - end + return recursive and fs.mkdirr(path) or fs.mkdir(path) end --- Remove the given empty directory. @@ -171,8 +174,17 @@ end -- @return Number with the return code, 0 on sucess or nil on error -- @return String containing the error description on error -- @return Number containing the os specific errno on error -rmdir = posix.rmdir - +rmdir = fs.rmdir + +local stat_tr = { + reg = "regular", + dir = "directory", + lnk = "link", + chr = "character device", + blk = "block device", + fifo = "fifo", + sock = "socket" +} --- Get information about given file or directory. -- @class function -- @name stat @@ -180,7 +192,14 @@ rmdir = posix.rmdir -- @return Table containing file or directory properties or nil on error -- @return String containing the error description on error -- @return Number containing the os specific errno on error -stat = posix.stat +function stat(path, key) + local data, code, msg = fs.stat(path) + if data then + data.mode = data.modestr + data.type = stat_tr[data.type] or "?" + end + return key and data and data[key] or data, code, msg +end --- Set permissions on given file or directory. -- @class function @@ -190,17 +209,21 @@ stat = posix.stat -- @return Number with the return code, 0 on sucess or nil on error -- @return String containing the error description on error -- @return Number containing the os specific errno on error -chmod = posix.chmod +chmod = fs.chmod ---- Create a hardlink from given file to specified target file path. --- @class function --- @name link --- @param path1 String containing the source path of a file to hardlink --- @param path2 String containing the destination path for the link --- @return Number with the return code, 0 on sucess or nil on error --- @return String containing the error description on error --- @return Number containing the os specific errno on error -link = posix.link +--- Create a hard- or symlink from given file (or directory) to specified target +-- file (or directory) path. +-- @class function +-- @name link +-- @param path1 String containing the source path to link +-- @param path2 String containing the destination path for the link +-- @param symlink Boolean indicating wheather to create a symlink (optional) +-- @return Number with the return code, 0 on sucess or nil on error +-- @return String containing the error description on error +-- @return Number containing the os specific errno on error +function link(src, dest, sym) + return sym and fs.symlink(src, dest) or fs.link(src, dest) +end --- Remove the given file. -- @class function @@ -209,4 +232,13 @@ link = posix.link -- @return Number with the return code, 0 on sucess or nil on error -- @return String containing the error description on error -- @return Number containing the os specific errno on error -unlink = posix.unlink +unlink = fs.unlink + +--- Retrieve target of given symlink. +-- @class function +-- @name readlink +-- @param path String containing the path of the symlink to read +-- @return String containing the link target or nil on error +-- @return String containing the error description on error +-- @return Number containing the os specific errno on error +readlink = fs.readlink