Subversion Repositories HelenOS

Rev

Rev 3263 | Blame | Last modification | View Log | Download | RSS feed

  1. #!/usr/bin/env python
  2. #
  3. # Copyright (c) 2008 Martin Decky
  4. # All rights reserved.
  5. #
  6. # Redistribution and use in source and binary forms, with or without
  7. # modification, are permitted provided that the following conditions
  8. # are met:
  9. #
  10. # - Redistributions of source code must retain the above copyright
  11. #   notice, this list of conditions and the following disclaimer.
  12. # - Redistributions in binary form must reproduce the above copyright
  13. #   notice, this list of conditions and the following disclaimer in the
  14. #   documentation and/or other materials provided with the distribution.
  15. # - The name of the author may not be used to endorse or promote products
  16. #   derived from this software without specific prior written permission.
  17. #
  18. # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  19. # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  20. # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  21. # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  22. # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  23. # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  24. # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  25. # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  26. # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  27. # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  28. #
  29. """
  30. TMPFS creator
  31. """
  32.  
  33. import sys
  34. import os
  35. import xstruct
  36.  
  37. HEADER = """little:
  38.     char tag[5]  /* 'TMPFS' */
  39. """
  40.  
  41. DENTRY_NONE = """little:
  42.     uint8_t kind        /* NONE */
  43.     uint32_t fname_len  /* 0 */
  44. """
  45.  
  46. DENTRY_FILE = """little:
  47.     uint8_t kind        /* FILE */
  48.     uint32_t fname_len  /* filename length */
  49.     char fname[%d]      /* filename */
  50.     uint32_t flen       /* file length */
  51. """
  52.  
  53. DENTRY_DIRECTORY = """little:
  54.     uint8_t kind        /* DIRECTORY */
  55.     uint32_t fname_len  /* filename length */
  56.     char fname[%d]      /* filename */
  57. """
  58.  
  59. TMPFS_NONE = 0
  60. TMPFS_FILE = 1
  61. TMPFS_DIRECTORY = 2
  62.  
  63. def usage(prname):
  64.     "Print usage syntax"
  65.     print prname + " <PATH> <IMAGE>"
  66.  
  67. def recursion(root, outf):
  68.     "Recursive directory walk"
  69.    
  70.     for name in os.listdir(root):
  71.         canon = os.path.join(root, name)
  72.        
  73.         if (os.path.isfile(canon)):
  74.             size = os.path.getsize(canon)
  75.            
  76.             dentry = xstruct.create(DENTRY_FILE % len(name))
  77.             dentry.kind = TMPFS_FILE
  78.             dentry.fname_len = len(name)
  79.             dentry.fname = name
  80.             dentry.flen = size
  81.            
  82.             outf.write(dentry.pack())
  83.            
  84.             inf = file(canon, "r")
  85.             rd = 0;
  86.             while (rd < size):
  87.                 data = inf.read(4096);
  88.                 outf.write(data)
  89.                 rd += len(data)
  90.             inf.close()
  91.        
  92.         if (os.path.isdir(canon)):
  93.             dentry = xstruct.create(DENTRY_DIRECTORY % len(name))
  94.             dentry.kind = TMPFS_DIRECTORY
  95.             dentry.fname_len = len(name)
  96.             dentry.fname = name
  97.            
  98.             outf.write(dentry.pack())
  99.            
  100.             recursion(canon, outf)
  101.            
  102.             dentry = xstruct.create(DENTRY_NONE)
  103.             dentry.kind = TMPFS_NONE
  104.             dentry.fname_len = 0
  105.            
  106.             outf.write(dentry.pack())
  107.  
  108. def main():
  109.     if (len(sys.argv) < 3):
  110.         usage(sys.argv[0])
  111.         return
  112.    
  113.     path = os.path.abspath(sys.argv[1])
  114.     if (not os.path.isdir(path)):
  115.         print "<PATH> must be a directory"
  116.         return
  117.    
  118.     outf = file(sys.argv[2], "w")
  119.    
  120.     header = xstruct.create(HEADER)
  121.     header.tag = "TMPFS"
  122.    
  123.     outf.write(header.pack())
  124.    
  125.     recursion(path, outf)
  126.    
  127.     dentry = xstruct.create(DENTRY_NONE)
  128.     dentry.kind = TMPFS_NONE
  129.     dentry.fname_len = 0
  130.    
  131.     outf.write(dentry.pack())
  132.    
  133.     outf.close()
  134.    
  135. if __name__ == '__main__':
  136.     main()
  137.