X-Git-Url: https://git.archive.openwrt.org/?a=blobdiff_plain;f=libs%2Fcore%2Fluasrc%2Ffs.lua;h=a81ff675d41c1b3abd22da6ba4108149288173fb;hb=4fec63df9e4a52ae8bb21b4cac87728ce073554f;hp=276e04ec4f396e032a84f42d666a791ad00082ff;hpb=74408bbb74c184b311ffebfbb4db38429c8247c0;p=project%2Fluci.git diff --git a/libs/core/luasrc/fs.lua b/libs/core/luasrc/fs.lua index 276e04ec4..a81ff675d 100644 --- a/libs/core/luasrc/fs.lua +++ b/libs/core/luasrc/fs.lua @@ -27,7 +27,8 @@ limitations under the License. local io = require "io" local os = require "os" local ltn12 = require "luci.ltn12" -local posix = require "posix" +local fs = require "nixio.fs" +local nutil = require "nixio.util" local type = type @@ -41,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. @@ -51,67 +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") - - if fp == nil then - return nil, err - end - - fp:write(data) - fp:close() - - return true -end +writefile = fs.writefile --- Copies a file. -- @param source Source file -- @param dest Destination -- @return Boolean containing true on success or nil on error -function copy(source, dest) - return ltn12.pump.all( - ltn12.source.file(io.open(source)), - ltn12.sink.file(io.open(dest, "w")) - ) -end +copy = fs.datacopy --- Renames a file. -- @param source Source file -- @param dest Destination -- @return Boolean containing true on success or nil on error -function rename(source, dest) - return os.rename(source, dest) -end +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 @@ -119,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 @@ -129,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. @@ -138,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 @@ -147,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 @@ -156,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. @@ -195,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 @@ -204,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 @@ -214,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. @@ -226,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 @@ -235,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 @@ -244,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