2 nixio - Linux I/O library for lua
4 Copyright 2009 Steven Barth <steven@midlink.org>
6 Licensed under the Apache License, Version 2.0 (the "License");
7 you may not use this file except in compliance with the License.
8 You may obtain a copy of the License at
10 http://www.apache.org/licenses/LICENSE-2.0
15 local table = require "table"
16 local nixio = require "nixio"
17 local type, ipairs, setmetatable = type, ipairs, setmetatable
21 module ("nixio.fs", function(m) setmetatable(m, {__index = nixio.fs}) end)
24 function readfile(path, limit)
25 local fd, code, msg = nixio.open(path, "r")
31 data, code, msg = fd:readall(limit)
34 return data, code, msg
38 function writefile(path, data)
39 local fd, code, msg, stat = nixio.open(path, "w")
44 stat, code, msg = fd:writeall(data)
47 return stat, code, msg
50 function datacopy(src, dest, size)
51 local fdin, code, msg = nixio.open(src, "r")
56 local fdout, code, msg = nixio.open(dest, "w")
61 local stat, code, msg, sent = fdin:copy(fdout, size)
65 return stat, code, msg, sent
68 function copy(src, dest)
69 local stat, code, msg, res = nixio.lstat(src)
74 if stat.type == "dir" then
75 if nixio.stat(dest, type) ~= "dir" then
76 res, code, msg = nixio.mkdir(dest)
80 elseif stat.type == "lnk" then
81 res, code, msg = nixio.symlink(nixio.readlink(src), dest)
83 res, code, msg = datacopy(src, dest)
90 nixio.utimes(dest, stat.atime, stat.mtime)
93 nixio.lchown(dest, stat.uid, stat.gid)
96 if stat.type ~= "lnk" then
97 nixio.chmod(dest, stat.modedec)
103 function move(src, dest)
104 local stat, code, msg = nixio.rename(src, dest)
105 if not stat and code == nixio.const.EXDEV then
106 stat, code, msg = nixio.copy(src, dest)
108 stat, code, msg = nixio.unlink(src)
111 return stat, code, msg
114 function mkdirr(dest, mode)
115 if nixio.stat(dest, "type") == "dir" then
118 local stat, code, msg = nixio.mkdir(dest, mode)
119 if not stat and code == nixio.const.ENOENT then
120 stat, code, msg = mkdirr(nixio.dirname(dest), mode)
122 stat, code, msg = nixio.mkdir(dest, mode)
125 return stat, code, msg
129 local function _recurse(cb, src, dest)
130 local type = nixio.lstat(src, "type")
131 if type ~= "dir" then
134 local stat, se, code, msg, s, c, m = true, nixio.const.sep
136 s, c, m = cb(src, dest)
137 stat, code, msg = stat and s, c or code, m or msg
140 for e in nixio.dir(src) do
142 s, c, m = _recurse(cb, src .. se .. e, dest .. se .. e)
144 s, c, m = _recurse(cb, src .. se .. e)
146 stat, code, msg = stat and s, c or code, m or msg
149 if not dest then -- Postfix
151 stat, code, msg = stat and s, c or code, m or msg
154 return stat, code, msg
158 function copyr(src, dest)
159 return _recurse(copy, src, dest)
162 function mover(src, dest)
163 local stat, code, msg = nixio.rename(src, dest)
164 if not stat and code == nixio.const.EXDEV then
165 stat, code, msg = _recurse(copy, src, dest)
167 stat, code, msg = _recurse(nixio.remove, src)
170 return stat, code, msg
173 function remover(src)
174 return _recurse(nixio.remove, src)