-
Notifications
You must be signed in to change notification settings - Fork 22
/
bundle_fs.lua
66 lines (54 loc) · 1.36 KB
/
bundle_fs.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
--fs.dir() and fs.open() interfaces over mmapped tar-like files.
--Written by Cosmin Apreutesei. Public Domain.
local ffi = require'ffi'
local fs = require'fs'
local bundle = require'bundle'
local rat = {}
function rat:build(dir, write)
--TODO:
end
function rat:build_tofile(dir, file)
local f, err, errcode = fs.open(file, 'w')
if not f then
return nil, err, errcode
end
local function write(buf, sz)
return f:write(buf, sz)
end
local ok, err, errcode = rat:build(write)
f:close()
return ok, err, errcode
end
local mountpoint = {}
function rat:mount(buf, sz)
local mountpoint = {
data = ffi.cast('char*', buf),
size = sz,
_buffer = buf, --anchor it
__index = mountpoint,
}
local self = setmetatable(mountpoint, mountpoint)
self:init()
return self
end
function mountpoint:find_entry(path)
--TODO:
local ftype, offset, size
return ftype, offset, size
end
function mountpoint:init()
--TODO:
end
function mountpoint:dir(dir)
local ftype, offset, size = self:find_entry(dir)
local entries
local s = ftype == 'dir' and ffi.string(self.data + offset, size)
return bundle.open_dir_listing(dir, s)
end
function mountpoint:open(path, mode)
local ftype, offset, size = self:find_entry(path)
if not ftype then return nil, 'not_found' end
if ftype ~= 'file' then return nil, 'access_denied' end
return fs.open_buffer(self.data + offset, size)
end
return rat