Subversion Repositories HelenOS

Rev

Rev 3022 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3022 Rev 4055
Line 30... Line 30...
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 xstruct
36
 
36
 
37
def align_up(size, alignment):
37
exclude_names = set(['.svn'])
-
 
38
 
-
 
39
HEADER = """little:
-
 
40
    char tag[5]  /* 'TMPFS' */
-
 
41
"""
-
 
42
 
-
 
43
DENTRY_NONE = """little:
-
 
44
    uint8_t kind        /* NONE */
-
 
45
    uint32_t fname_len  /* 0 */
-
 
46
"""
-
 
47
 
-
 
48
DENTRY_FILE = """little:
-
 
49
    uint8_t kind        /* FILE */
38
    return (((size) + ((alignment) - 1)) & ~((alignment) - 1))
50
    uint32_t fname_len  /* filename length */
-
 
51
    char fname[%d]      /* filename */
-
 
52
    uint32_t flen       /* file length */
-
 
53
"""
-
 
54
 
-
 
55
DENTRY_DIRECTORY = """little:
-
 
56
    uint8_t kind        /* DIRECTORY */
-
 
57
    uint32_t fname_len  /* filename length */
-
 
58
    char fname[%d]      /* filename */
-
 
59
"""
-
 
60
 
-
 
61
TMPFS_NONE = 0
-
 
62
TMPFS_FILE = 1
-
 
63
TMPFS_DIRECTORY = 2
39
 
64
 
40
def usage(prname):
65
def usage(prname):
41
    "Print usage syntax"
66
    "Print usage syntax"
42
    print prname + " <ALIGNMENT> <PATH> <IMAGE>"
67
    print prname + " <PATH> <IMAGE>"
43
 
68
 
44
def main():
-
 
45
    if (len(sys.argv) < 4):
69
def recursion(root, outf):
46
        usage(sys.argv[0])
-
 
47
        return
-
 
48
   
-
 
49
    if (not sys.argv[1].isdigit()):
-
 
50
        print "<ALIGNMENT> must be a number"
-
 
51
        return
-
 
52
   
-
 
53
    align = int(sys.argv[1], 0)
-
 
54
    path = os.path.abspath(sys.argv[2])
-
 
55
    if (not os.path.isdir(path)):
-
 
56
        print "<PATH> must be a directory"
70
    "Recursive directory walk"
57
        return
-
 
58
   
71
   
59
    header_size = align_up(18, align)
72
    for name in os.listdir(root):
60
    payload_size = 0
-
 
61
    outf = file(sys.argv[3], "w")
73
        canon = os.path.join(root, name)
62
    outf.write(struct.pack("<" + ("%d" % header_size) + "x"))
-
 
63
   
74
       
64
    for root, dirs, files in os.walk(path):
75
        if (os.path.isfile(canon) and (not name in exclude_names)):
65
        relpath = root[len(path):len(root)]
-
 
66
        for name in files:
-
 
67
            canon = os.path.join(relpath, name)
76
            size = os.path.getsize(canon)
68
            outf.write(struct.pack("<BL" + ("%d" % len(canon)) + "s", 1, len(canon), canon))
-
 
69
            payload_size += 5 + len(canon)
-
 
70
           
77
           
71
            fn = os.path.join(root, name)
78
            dentry = xstruct.create(DENTRY_FILE % len(name))
72
            size = os.path.getsize(fn)
79
            dentry.kind = TMPFS_FILE
73
            rd = 0;
80
            dentry.fname_len = len(name)
74
            outf.write(struct.pack("<L", size))
81
            dentry.fname = name
75
            payload_size += 4
82
            dentry.flen = size
76
           
83
           
-
 
84
            outf.write(dentry.pack())
-
 
85
           
77
            inf = file(fn, "r")
86
            inf = file(canon, "r")
-
 
87
            rd = 0;
78
            while (rd < size):
88
            while (rd < size):
79
                data = inf.read(4096);
89
                data = inf.read(4096);
80
                outf.write(data)
90
                outf.write(data)
81
                payload_size += len(data)
-
 
82
                rd += len(data)
91
                rd += len(data)
83
            inf.close()
92
            inf.close()
84
       
93
       
-
 
94
        if (os.path.isdir(canon) and (not name in exclude_names)):
-
 
95
            dentry = xstruct.create(DENTRY_DIRECTORY % len(name))
-
 
96
            dentry.kind = TMPFS_DIRECTORY
-
 
97
            dentry.fname_len = len(name)
85
        for name in dirs:
98
            dentry.fname = name
-
 
99
           
86
            canon = os.path.join(relpath, name)
100
            outf.write(dentry.pack())
-
 
101
           
-
 
102
            recursion(canon, outf)
-
 
103
           
87
            outf.write(struct.pack("<BL" + ("%d" % len(canon)) + "s", 2, len(canon), canon))
104
            dentry = xstruct.create(DENTRY_NONE)
-
 
105
            dentry.kind = TMPFS_NONE
-
 
106
            dentry.fname_len = 0
-
 
107
           
88
            payload_size += 5 + len(canon)
108
            outf.write(dentry.pack())
-
 
109
 
-
 
110
def main():
-
 
111
    if (len(sys.argv) < 3):
-
 
112
        usage(sys.argv[0])
-
 
113
        return
89
   
114
   
-
 
115
    path = os.path.abspath(sys.argv[1])
-
 
116
    if (not os.path.isdir(path)):
-
 
117
        print "<PATH> must be a directory"
-
 
118
        return
-
 
119
   
90
    aligned_size = align_up(payload_size, align)
120
    outf = file(sys.argv[2], "w")
-
 
121
   
-
 
122
    header = xstruct.create(HEADER)
-
 
123
    header.tag = "TMPFS"
91
   
124
   
-
 
125
    outf.write(header.pack())
-
 
126
   
-
 
127
    recursion(path, outf)
-
 
128
   
92
    if (aligned_size - payload_size > 0):
129
    dentry = xstruct.create(DENTRY_NONE)
-
 
130
    dentry.kind = TMPFS_NONE
-
 
131
    dentry.fname_len = 0
-
 
132
   
93
        outf.write(struct.pack("<" + ("%d" % (aligned_size - payload_size)) + "x"))
133
    outf.write(dentry.pack())
94
   
134
   
95
    outf.seek(0)
-
 
96
    outf.write(struct.pack("<4sBBLQ", "HORD", 1, 1, header_size, aligned_size))
-
 
97
    outf.close()
135
    outf.close()
98
 
136
   
99
if __name__ == '__main__':
137
if __name__ == '__main__':
100
    main()
138
    main()