Advertisement
Guest User

uncpio.lua

a guest
Jun 2nd, 2019
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 1.49 KB | None | 0 0
  1. local args = {...}
  2. local file = io.open(args[1], "rb")
  3.  
  4. local dent = {
  5.     magic = 0,
  6.     dev = 0,
  7.     ino = 0,
  8.     mode = 0,
  9.     uid = 0,
  10.     gid = 0,
  11.     nlink = 0,
  12.     rdev = 0,
  13.     mtime = 0,
  14.     namesize = 0,
  15.     filesize = 0,
  16. }
  17.  
  18. local function readint(amt, rev)
  19.     local tmp = 0
  20.     for i=(rev and amt) or 1, (rev and 1) or amt, (rev and -1) or 1 do
  21.         tmp = tmp | (file:read(1):byte() << ((i-1)*8))
  22.     end
  23.     return tmp
  24. end
  25.  
  26. local filesystem = filesystem or require("filesystem")
  27.  
  28. local function fwrite()
  29.     local dir = dent.name:match("(.+)/.*%.?.+")
  30.     if (dir) then
  31.         filesystem.makeDirectory(os.getenv("PWD").."/"..dir)
  32.     end
  33.     local hand = io.open(dent.name, "w")
  34.     hand:write(file:read(dent.filesize))
  35.     hand:close()
  36. end
  37.  
  38. while true do
  39.     dent.magic = readint(2)
  40.     local rev = false
  41.     if (dent.magic ~= tonumber("070707", 8)) then rev = true end
  42.     dent.dev = readint(2)
  43.     dent.ino = readint(2)
  44.     dent.mode = readint(2)
  45.     dent.uid = readint(2)
  46.     dent.gid = readint(2)
  47.     dent.nlink = readint(2)
  48.     dent.rdev = readint(2)
  49.     dent.mtime = (readint(2) << 16) | readint(2)
  50.     dent.namesize = readint(2)
  51.     dent.filesize = (readint(2) << 16) | readint(2)
  52.     local name = file:read(dent.namesize):sub(1, dent.namesize-1)
  53.     if (name == "TRAILER!!!") then break end
  54.     --for k, v in pairs(dent) do
  55.     --  print(k, v)
  56.     --end
  57.     dent.name = name
  58.     print(name)
  59.     if (dent.namesize % 2 ~= 0) then
  60.         file:seek("cur", 1)
  61.     end
  62.     if (dent.mode & 32768 ~= 0) then
  63.         fwrite()
  64.     end
  65.     if (dent.filesize % 2 ~= 0) then
  66.         file:seek("cur", 1)
  67.     end
  68. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement