Subversion Repositories HelenOS

Rev

Rev 3244 | Rev 3260 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3244 Rev 3259
1
#!/usr/bin/env python
1
#!/usr/bin/env python
2
#
2
#
3
# Copyright (c) 2008 Martin Decky
3
# Copyright (c) 2008 Martin Decky
4
# All rights reserved.
4
# All rights reserved.
5
#
5
#
6
# Redistribution and use in source and binary forms, with or without
6
# Redistribution and use in source and binary forms, with or without
7
# modification, are permitted provided that the following conditions
7
# modification, are permitted provided that the following conditions
8
# are met:
8
# are met:
9
#
9
#
10
# - Redistributions of source code must retain the above copyright
10
# - Redistributions of source code must retain the above copyright
11
#   notice, this list of conditions and the following disclaimer.
11
#   notice, this list of conditions and the following disclaimer.
12
# - Redistributions in binary form must reproduce the above copyright
12
# - Redistributions in binary form must reproduce the above copyright
13
#   notice, this list of conditions and the following disclaimer in the
13
#   notice, this list of conditions and the following disclaimer in the
14
#   documentation and/or other materials provided with the distribution.
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
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.
16
#   derived from this software without specific prior written permission.
17
#
17
#
18
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
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
19
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
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
24
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
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
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.
27
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
#
28
#
29
"""
29
"""
30
TMPFS creator
30
TMPFS creator
31
"""
31
"""
32
 
32
 
33
import sys
33
import sys
34
import os
34
import os
35
import struct
35
import struct
-
 
36
import xstruct
-
 
37
 
-
 
38
HEADER = xstruct.convert("little: char[5]")
-
 
39
DENTRY = xstruct.convert("little: uint8_t uint32_t")
-
 
40
SIZE = xstruct.convert("little: uint32_t")
-
 
41
 
-
 
42
DENTRY_NONE = 0
-
 
43
DENTRY_FILE = 1
-
 
44
DENTRY_DIRECTORY = 2
36
 
45
 
37
def usage(prname):
46
def usage(prname):
38
    "Print usage syntax"
47
    "Print usage syntax"
39
    print prname + " <ALIGNMENT> <PATH> <IMAGE>"
48
    print prname + " <PATH> <IMAGE>"
40
 
49
 
41
def recursion(root, outf):
50
def recursion(root, outf):
42
    "Recursive directory walk"
51
    "Recursive directory walk"
43
   
52
   
44
    payload_size = 0
-
 
45
   
-
 
46
    for name in os.listdir(root):
53
    for name in os.listdir(root):
47
        canon = os.path.join(root, name)
54
        canon = os.path.join(root, name)
48
       
55
       
49
        if (os.path.isfile(canon)):
56
        if (os.path.isfile(canon)):
50
            outf.write(struct.pack("<BL" + ("%d" % len(name)) + "s", 1, len(name), name))
57
            outf.write(struct.pack(DENTRY, DENTRY_FILE, len(name)))
51
            payload_size += 5 + len(name)
58
            outf.write(xstruct.little_string(name))
52
            size = os.path.getsize(canon)
59
            size = os.path.getsize(canon)
53
            rd = 0;
60
            rd = 0;
54
            outf.write(struct.pack("<L", size))
61
            outf.write(struct.pack(SIZE, size))
55
            payload_size += 4
-
 
56
           
62
           
57
            inf = file(canon, "r")
63
            inf = file(canon, "r")
58
            while (rd < size):
64
            while (rd < size):
59
                data = inf.read(4096);
65
                data = inf.read(4096);
60
                outf.write(data)
66
                outf.write(data)
61
                payload_size += len(data)
-
 
62
                rd += len(data)
67
                rd += len(data)
63
            inf.close()
68
            inf.close()
64
       
69
       
65
        if (os.path.isdir(canon)):
70
        if (os.path.isdir(canon)):
66
            outf.write(struct.pack("<BL" + ("%d" % len(name)) + "s", 2, len(name), name))
71
            outf.write(struct.pack(DENTRY, DENTRY_DIRECTORY, len(name)))
67
            payload_size += 5 + len(name)
72
            outf.write(xstruct.little_string(name))
68
            payload_size += recursion(canon, outf)
73
            recursion(canon, outf)
69
            outf.write(struct.pack("<BL", 0, 0))
74
            outf.write(struct.pack(DENTRY, DENTRY_NONE, 0))
70
            payload_size += 5
-
 
71
   
-
 
72
    return payload_size
-
 
73
 
75
 
74
def main():
76
def main():
75
    if (len(sys.argv) < 3):
77
    if (len(sys.argv) < 3):
76
        usage(sys.argv[0])
78
        usage(sys.argv[0])
77
        return
79
        return
78
   
80
   
79
    path = os.path.abspath(sys.argv[1])
81
    path = os.path.abspath(sys.argv[1])
80
    if (not os.path.isdir(path)):
82
    if (not os.path.isdir(path)):
81
        print "<PATH> must be a directory"
83
        print "<PATH> must be a directory"
82
        return
84
        return
83
   
85
   
84
    outf = file(sys.argv[2], "w")
86
    outf = file(sys.argv[2], "w")
85
   
87
   
86
    outf.write(struct.pack("<5s", "TMPFS"))
88
    outf.write(struct.pack(HEADER, "TMPFS"))
87
    recursion(path, outf)
89
    recursion(path, outf)
88
    outf.write(struct.pack("<BL", 0, 0))
90
    outf.write(struct.pack(DENTRY, DENTRY_NONE, 0))
89
 
91
 
90
    outf.close()
92
    outf.close()
91
       
93
       
92
if __name__ == '__main__':
94
if __name__ == '__main__':
93
    main()
95
    main()
94
 
96