This file is indexed.

/usr/share/lua/5.1/syscall/lfs.lua is in lua-ljsyscall 0.12-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  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
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
-- this is intended to be compatible with luafilesystem https://github.com/keplerproject/luafilesystem

-- currently does not implement locks

local require, error, assert, tonumber, tostring,
setmetatable, pairs, ipairs, unpack, rawget, rawset,
pcall, type, table, string = 
require, error, assert, tonumber, tostring,
setmetatable, pairs, ipairs, unpack, rawget, rawset,
pcall, type, table, string

-- TODO allow use eg with rump kernel, needs an initialisation option
-- maybe return a table with a metatable that allows init or uses default if no init?
local S = require "syscall"

-- TODO not implemented
-- lfs.lock_dir
-- lfs.lock
-- unlock

local function lfswrap(f)
  return function(...)
    local ret, err = f(...)
    if not ret then return nil, tostring(err) end
    return ret
  end
end

local lfs = {}

lfs._VERSION = "ljsyscall lfs 1"

local attributes = {
  dev = "dev",
  ino = "ino",
  mode = "typename", -- not sure why lfs insists on calling this mode
  nlink = "nlink",
  uid = "uid",
  gid = "gid",
  rdev = "rdev",
  access = "access",
  modification = "modification",
  change = "change",
  size = "size",
  blocks = "blocks",
  blksize = "blksize",
}

local function attr(st, aname)
  if aname then
    aname = attributes[aname]
    return st[aname]
  end
  local ret = {}
  for k, v in pairs(attributes) do ret[k] = st[v] end
  return ret
end

function lfs.attributes(filepath, aname)
  local st, err = S.stat(filepath)
  if not st then return nil, tostring(err) end
  return attr(st, aname)
end
function lfs.symlinkattributes(filepath, aname)
  local st, err = S.lstat(filepath)
  if not st then return nil, tostring(err) end
  return attr(st, aname)
end

lfs.chdir = lfswrap(S.chdir)
lfs.currentdir = lfswrap(S.getcwd)
lfs.rmdir = lfswrap(S.rmdir)
lfs.touch = lfswrap(S.utime)

function lfs.mkdir(path)
  local ret, err = S.mkdir(path, "0777")
  if not ret then return nil, tostring(err) end
  return ret
end

local function dir_close(dir)
  dir.fd:close()
  dir.fd = nil
end

local function dir_next(dir)
  if not dir.fd then error "dir ended" end
  local d
  repeat
    if not dir.di then
      local err
      dir.di, err = dir.fd:getdents(dir.buf, dir.size)
      if not dir.di then
        dir_close(dir)
        error(tostring(err)) -- not sure how we are suppose to handle errors
      end
      dir.first = true
    end
    d = dir.di()
    if not d then
      dir.di = nil
      if dir.first then
        dir_close(dir)
        return nil
      end
    end
    dir.first = false
  until d
  return d.name
end

function lfs.dir(path)
  local size = 4096
  local buf = S.t.buffer(size)
  local fd, err = S.open(path, "directory, rdonly")
  if err then return nil, tostring(err) end
  return dir_next, {size = size, buf = buf, fd = fd, next = dir_next, close = dir_close}
end

local flink, fsymlink = lfswrap(S.link), lfswrap(S.symlink)

function lfs.link(old, new, symlink)
  if symlink then
    return fsymlink(old, new)
  else
    return flink(old, new)
  end
end

function lfs.setmode(file, mode) return true, "binary" end

return lfs