Advertisement
Guest User

hvfsmaker.py

a guest
Mar 5th, 2017
255
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.73 KB | None | 0 0
  1. #!/usr/bin/python
  2.  
  3. import sys, os, zlib, io
  4. from struct import pack, unpack
  5.  
  6. if (len(sys.argv) > 1):
  7.     hvfsdir  = sys.argv[1]
  8. else:
  9.     print "Use: hvfsmaker.py directory"
  10.     sys.exit(0)
  11.  
  12. f = open("hvfs.fs", "w+b")
  13.  
  14. # Start creating our file
  15. f.write("HvFs")
  16.  
  17. numfiles = 0
  18. totsize = 0
  19. totlen = 0
  20.  
  21. files = []
  22.  
  23. banner = "Tilera Hypervisor file system by ME!"
  24. totlen += (4 - (len(banner)%4)) + len(banner)
  25.  
  26. for name in sorted(os.listdir(hvfsdir)):
  27.     long = os.path.join(hvfsdir, name)
  28.     filerealsize = os.stat(long).st_size
  29.     filesize_align = (4 - (filerealsize%4)) + filerealsize
  30.     namelen = (4 - (len(name)%4)) + len(name)
  31.     numfiles += 1
  32.     totsize += filerealsize
  33.     totlen += namelen
  34.     files.append((name,namelen,filesize_align,long,filerealsize))
  35.  
  36. # (4_HVFS + 16_HEADER + ( 16_INODE * FILES))
  37. namebase = 4 + 16 + (16 * numfiles)
  38.  
  39. # (NAMEBASE + lenght of all filenames, keeping 1 char empty per name)
  40. filebase = namebase + totlen
  41.  
  42. print "Files to add %d" % numfiles
  43. print "Size to add %d" % totsize
  44. print "Starting names at %d" % namebase
  45. print "Starting files at %d" % filebase
  46.  
  47. # Leave header empty for now
  48. f.seek(16,1)
  49.  
  50. # Inserting banner, it's the first entry at namebase
  51. currentpos = f.tell()
  52. f.seek(namebase,0)
  53. f.write(banner)
  54. namebase += len(banner)+1
  55. f.seek(currentpos,0)
  56.  
  57. print "Writing inodes and files"
  58. for file in files:
  59.     print "Injecting file %s:name at %d and file at %d" % (file[0], namebase, filebase)
  60.     # POS without 4_HVFS ident
  61.     f.write(pack('<IIII', (namebase-4), (filebase-4), file[4], 0))
  62.     currentpos = f.tell()
  63.  
  64.     # Put filename in the right place (empty trailer)
  65.     f.seek(namebase,0)
  66.     f.write(file[0])
  67.  
  68.     # Copy data from our file into HVFS
  69.     f.seek(filebase,0)
  70.     copy = file[4]
  71.     f2 = open(file[3],'rb')
  72.     while copy:
  73.         block = min(1024,copy)
  74.         data = f2.read(block)
  75.         f.write(data)
  76.         copy -= block
  77.     f2.close()
  78.  
  79.     # Go back for the next file / inode
  80.     f.seek(currentpos,0)
  81.     namebase += file[1]
  82.     filebase += file[2]
  83.  
  84. f.seek(0, io.SEEK_END)
  85. fsend = f.tell()
  86. print "done with inodes and files at %d" % fsend
  87.  
  88. # FS CRC might need to shift, create empty space if necessary (nasty hack)
  89. if (fsend-4)%4 != 0 :
  90.     fsend += (4 - (fsend-4)%4)
  91.     f.seek(fsend,0)
  92.     f.write(pack("<I", 0))
  93.  
  94. # Calculate and write header CRC (pos 5-20, we left this space empty)
  95. f.seek(4,0)
  96. headercrc = zlib.crc32(pack('<ccccIII',"H", "v", "F", "s", numfiles, (fsend-4), (16 + (16 * numfiles)))) & 0xffffffff
  97. f.write(pack('<IIII', numfiles, (fsend-4), (16 + (16 * numfiles)), headercrc))
  98.  
  99. # Filesystem (skip 4_HVFS + 16_HEADER) (end of file)
  100. f.seek(20,0)
  101. fscrc = zlib.crc32(f.read(fsend-20)) & 0xffffffff
  102. f.seek(fsend,0)
  103. f.write(pack("<I", fscrc))
  104.  
  105. print "Header CRC: %X" % headercrc
  106. print "Filesystem CRC: %X" % fscrc
  107.  
  108. f.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement