97 lines
2.8 KiB
Plaintext
97 lines
2.8 KiB
Plaintext
--:Minify:--
|
|
local name = syscall.getTask(syscall.getpid()).name
|
|
local cloptions = { s = false, f = false, help = false }
|
|
local args = {}
|
|
|
|
for _, v in ipairs({ ... }) do
|
|
if v:sub(1, 2) == "--" then
|
|
local opt = v:sub(3)
|
|
if cloptions[opt] == nil then
|
|
print(name .. ": unrecognized option '" .. v .. "'")
|
|
print("try '" .. name .. " --help' for more information.")
|
|
syscall.exit(1); return
|
|
end
|
|
cloptions[opt] = true
|
|
elseif v:sub(1, 1) == "-" then
|
|
for i = 2, #v do
|
|
local opt = v:sub(i, i)
|
|
if cloptions[opt] == nil then
|
|
print(name .. ": invalid option '-" .. opt .. "'")
|
|
print("try '" .. name .. " --help' for more information.")
|
|
syscall.exit(1); return
|
|
end
|
|
cloptions[opt] = true
|
|
end
|
|
else
|
|
table.insert(args, v)
|
|
end
|
|
end
|
|
|
|
if cloptions.help then
|
|
print("Usage: " .. name .. " [OPTION]... TARGET LINK_NAME")
|
|
print(" " .. name .. " [OPTION]... TARGET... DIRECTORY")
|
|
print("Create links between files.")
|
|
print("")
|
|
print("Options:")
|
|
print(" -s make symbolic links instead of hard links")
|
|
print(" -f remove existing destination files")
|
|
print(" --help display this help and exit")
|
|
print("")
|
|
print("With no -s, hard links are not supported (filesystem limitation).")
|
|
print("Use -s for symbolic links.")
|
|
return
|
|
end
|
|
|
|
if #args < 2 then
|
|
print(name .. ": missing operand")
|
|
print("try '" .. name .. " --help' for more information.")
|
|
syscall.exit(1); return
|
|
end
|
|
|
|
if not cloptions.s then
|
|
print(name .. ": hard links are not supported; use -s for symbolic links")
|
|
syscall.exit(1); return
|
|
end
|
|
|
|
local dest = args[#args]
|
|
local destDir = syscall.type(dest) == "directory"
|
|
|
|
local function cwd()
|
|
local d = syscall.getcwd()
|
|
if d:sub(-1) ~= "/" then d = d .. "/" end
|
|
return d
|
|
end
|
|
|
|
local function absPath(p)
|
|
if p:sub(1,1) ~= "/" then p = cwd() .. p end
|
|
return p
|
|
end
|
|
|
|
for i = 1, #args - 1 do
|
|
local target = args[i]
|
|
local linkPath
|
|
|
|
if destDir then
|
|
local basename = target:match("[^/]+$") or target
|
|
linkPath = absPath(dest)
|
|
if linkPath:sub(-1) ~= "/" then linkPath = linkPath .. "/" end
|
|
linkPath = linkPath .. basename
|
|
else
|
|
linkPath = absPath(dest)
|
|
end
|
|
|
|
if cloptions.f and syscall.exists(linkPath) then
|
|
local ok, err = pcall(syscall.remove, linkPath)
|
|
if not ok then
|
|
print(name .. ": cannot remove '" .. linkPath .. "': " .. tostring(err))
|
|
syscall.exit(1); return
|
|
end
|
|
end
|
|
|
|
local ok, err = pcall(syscall.symlink, target, linkPath)
|
|
if not ok then
|
|
print(name .. ": failed to create symlink '" .. linkPath .. "' -> '" .. target .. "': " .. tostring(err))
|
|
syscall.exit(1); return
|
|
end
|
|
end
|