Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python
- import sys, os, zlib, io
- from struct import pack, unpack
- if (len(sys.argv) > 1):
- hvfsdir = sys.argv[1]
- else:
- print "Use: hvfsmaker.py directory"
- sys.exit(0)
- f = open("hvfs.fs", "w+b")
- # Start creating our file
- f.write("HvFs")
- numfiles = 0
- totsize = 0
- totlen = 0
- files = []
- banner = "Tilera Hypervisor file system by ME!"
- totlen += (4 - (len(banner)%4)) + len(banner)
- for name in sorted(os.listdir(hvfsdir)):
- long = os.path.join(hvfsdir, name)
- filerealsize = os.stat(long).st_size
- filesize_align = (4 - (filerealsize%4)) + filerealsize
- namelen = (4 - (len(name)%4)) + len(name)
- numfiles += 1
- totsize += filerealsize
- totlen += namelen
- files.append((name,namelen,filesize_align,long,filerealsize))
- # (4_HVFS + 16_HEADER + ( 16_INODE * FILES))
- namebase = 4 + 16 + (16 * numfiles)
- # (NAMEBASE + lenght of all filenames, keeping 1 char empty per name)
- filebase = namebase + totlen
- print "Files to add %d" % numfiles
- print "Size to add %d" % totsize
- print "Starting names at %d" % namebase
- print "Starting files at %d" % filebase
- # Leave header empty for now
- f.seek(16,1)
- # Inserting banner, it's the first entry at namebase
- currentpos = f.tell()
- f.seek(namebase,0)
- f.write(banner)
- namebase += len(banner)+1
- f.seek(currentpos,0)
- print "Writing inodes and files"
- for file in files:
- print "Injecting file %s:name at %d and file at %d" % (file[0], namebase, filebase)
- # POS without 4_HVFS ident
- f.write(pack('<IIII', (namebase-4), (filebase-4), file[4], 0))
- currentpos = f.tell()
- # Put filename in the right place (empty trailer)
- f.seek(namebase,0)
- f.write(file[0])
- # Copy data from our file into HVFS
- f.seek(filebase,0)
- copy = file[4]
- f2 = open(file[3],'rb')
- while copy:
- block = min(1024,copy)
- data = f2.read(block)
- f.write(data)
- copy -= block
- f2.close()
- # Go back for the next file / inode
- f.seek(currentpos,0)
- namebase += file[1]
- filebase += file[2]
- f.seek(0, io.SEEK_END)
- fsend = f.tell()
- print "done with inodes and files at %d" % fsend
- # FS CRC might need to shift, create empty space if necessary (nasty hack)
- if (fsend-4)%4 != 0 :
- fsend += (4 - (fsend-4)%4)
- f.seek(fsend,0)
- f.write(pack("<I", 0))
- # Calculate and write header CRC (pos 5-20, we left this space empty)
- f.seek(4,0)
- headercrc = zlib.crc32(pack('<ccccIII',"H", "v", "F", "s", numfiles, (fsend-4), (16 + (16 * numfiles)))) & 0xffffffff
- f.write(pack('<IIII', numfiles, (fsend-4), (16 + (16 * numfiles)), headercrc))
- # Filesystem (skip 4_HVFS + 16_HEADER) (end of file)
- f.seek(20,0)
- fscrc = zlib.crc32(f.read(fsend-20)) & 0xffffffff
- f.seek(fsend,0)
- f.write(pack("<I", fscrc))
- print "Header CRC: %X" % headercrc
- print "Filesystem CRC: %X" % fscrc
- f.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement