X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fluci.git;a=blobdiff_plain;f=libs%2Fcore%2Fluasrc%2Ffs.lua;h=a81ff675d41c1b3abd22da6ba4108149288173fb;hp=56108db953194c958c7edc4bc02e6f7d22c9b8d5;hb=33fba71fc94b84c33b1e600da9b195eac49b2e31;hpb=0c5dc7bc77a4fd7d7f0d965e3185e2df4c608f05 diff --git a/libs/core/luasrc/fs.lua b/libs/core/luasrc/fs.lua index 56108db95..a81ff675d 100644 --- a/libs/core/luasrc/fs.lua +++ b/libs/core/luasrc/fs.lua @@ -24,8 +24,12 @@ limitations under the License. ]]-- -local posix = require "posix" 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 --- LuCI filesystem library. @@ -38,7 +42,7 @@ module "luci.fs" -- @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. @@ -48,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 @@ -97,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 @@ -107,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. @@ -116,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 @@ -125,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 @@ -134,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. @@ -173,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 @@ -182,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 @@ -192,7 +209,7 @@ 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 hard- or symlink from given file (or directory) to specified target -- file (or directory) path. @@ -204,7 +221,9 @@ chmod = posix.chmod -- @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 +function link(src, dest, sym) + return sym and fs.symlink(src, dest) or fs.link(src, dest) +end --- Remove the given file. -- @class function @@ -213,7 +232,7 @@ 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 @@ -222,4 +241,4 @@ unlink = posix.unlink -- @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 = posix.readlink +readlink = fs.readlink