source: mainline/tools/mktmpfs.py@ 9b70394

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 9b70394 was 9b70394, checked in by Martin Decky <martin@…>, 17 years ago

recursive TMPFS image

  • Property mode set to 100755
File size: 3.4 KB
RevLine 
[5a55ae6]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"""
30TMPFS creator
31"""
32
33import sys
34import os
35import struct
36
[33c058d3]37def align_up(size, alignment):
[afb1e35]38 "Align upwards to a given alignment"
[33c058d3]39 return (((size) + ((alignment) - 1)) & ~((alignment) - 1))
40
[5a55ae6]41def usage(prname):
42 "Print usage syntax"
[33c058d3]43 print prname + " <ALIGNMENT> <PATH> <IMAGE>"
[5a55ae6]44
[9b70394]45def recursion(root, outf):
46 "Recursive directory walk"
47
48 payload_size = 0
49
50 for name in os.listdir(root):
51 canon = os.path.join(root, name)
52
53 if (os.path.isfile(canon)):
54 outf.write(struct.pack("<BL" + ("%d" % len(name)) + "s", 1, len(name), name))
55 payload_size += 5 + len(name)
56 size = os.path.getsize(canon)
57 rd = 0;
58 outf.write(struct.pack("<L", size))
59 payload_size += 4
60
61 inf = file(canon, "r")
62 while (rd < size):
63 data = inf.read(4096);
64 outf.write(data)
65 payload_size += len(data)
66 rd += len(data)
67 inf.close()
68
69 if (os.path.isdir(canon)):
70 outf.write(struct.pack("<BL" + ("%d" % len(name)) + "s", 2, len(name), name))
71 payload_size += 5 + len(name)
72 payload_size += recursion(canon, outf)
73 outf.write(struct.pack("<BL", 0, 0))
74 payload_size += 5
75
76 return payload_size
77
[5a55ae6]78def main():
[33c058d3]79 if (len(sys.argv) < 4):
[5a55ae6]80 usage(sys.argv[0])
81 return
82
[33c058d3]83 if (not sys.argv[1].isdigit()):
84 print "<ALIGNMENT> must be a number"
85 return
86
87 align = int(sys.argv[1], 0)
88 path = os.path.abspath(sys.argv[2])
[5a55ae6]89 if (not os.path.isdir(path)):
90 print "<PATH> must be a directory"
91 return
92
[33c058d3]93 header_size = align_up(18, align)
94 outf = file(sys.argv[3], "w")
[10ef329a]95 outf.write(struct.pack("<" + ("%d" % header_size) + "x"))
[5a55ae6]96
[9b70394]97 outf.write(struct.pack("<5s", "TMPFS"))
98 payload_size = 5
99
100 payload_size += recursion(path, outf)
[5a55ae6]101
[9b70394]102 outf.write(struct.pack("<BL", 0, 0))
103 payload_size += 5
[5a55ae6]104
[33c058d3]105 aligned_size = align_up(payload_size, align)
106
107 if (aligned_size - payload_size > 0):
108 outf.write(struct.pack("<" + ("%d" % (aligned_size - payload_size)) + "x"))
[9b70394]109
[10ef329a]110 outf.seek(0)
[33c058d3]111 outf.write(struct.pack("<4sBBLQ", "HORD", 1, 1, header_size, aligned_size))
[5a55ae6]112 outf.close()
113
114if __name__ == '__main__':
115 main()
Note: See TracBrowser for help on using the repository browser.