Subversion Repositories HelenOS

Rev

Rev 3022 | Show entire file | Regard 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])
70
    "Recursive directory walk"
47
        return
-
 
48
   
71
   
49
    if (not sys.argv[1].isdigit()):
72
    for name in os.listdir(root):
50
        print "<ALIGNMENT> must be a number"
73
        canon = os.path.join(root, name)
51
        return
-
 
52
   
74
       
53
    align = int(sys.argv[1], 0)
-
 
54
    path = os.path.abspath(sys.argv[2])
75
        if (os.path.isfile(canon) and (not name in exclude_names)):
55
    if (not os.path.isdir(path)):
76
            size = os.path.getsize(canon)
56
        print "<PATH> must be a directory"
-
 
57
        return
-
 
58
   
77
           
59
    header_size = align_up(18, align)
-
 
60
    payload_size = 0
-
 
61
    outf = file(sys.argv[3], "w")
-
 
62
    outf.write(struct.pack("<" + ("%d" % header_size) + "x"))
78
            dentry = xstruct.create(DENTRY_FILE % len(name))
63
   
-
 
64
    for root, dirs, files in os.walk(path):
79
            dentry.kind = TMPFS_FILE
65
        relpath = root[len(path):len(root)]
80
            dentry.fname_len = len(name)
66
        for name in files:
81
            dentry.fname = name
67
            canon = os.path.join(relpath, name)
-
 
68
            outf.write(struct.pack("<BL" + ("%d" % len(canon)) + "s", 1, len(canon), canon))
-
 
69
            payload_size += 5 + len(canon)
82
            dentry.flen = size
70
           
83
           
71
            fn = os.path.join(root, name)
-
 
72
            size = os.path.getsize(fn)
-
 
73
            rd = 0;
-
 
74
            outf.write(struct.pack("<L", size))
84
            outf.write(dentry.pack())
75
            payload_size += 4
-
 
76
           
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
           
-
 
100
            outf.write(dentry.pack())
-
 
101
           
-
 
102
            recursion(canon, outf)
-
 
103
           
-
 
104
            dentry = xstruct.create(DENTRY_NONE)
-
 
105
            dentry.kind = TMPFS_NONE
-
 
106
            dentry.fname_len = 0
-
 
107
           
-
 
108
            outf.write(dentry.pack())
-
 
109
 
-
 
110
def main():
-
 
111
    if (len(sys.argv) < 3):
-
 
112
        usage(sys.argv[0])
-
 
113
        return
-
 
114
   
-
 
115
    path = os.path.abspath(sys.argv[1])
86
            canon = os.path.join(relpath, name)
116
    if (not os.path.isdir(path)):
87
            outf.write(struct.pack("<BL" + ("%d" % len(canon)) + "s", 2, len(canon), canon))
117
        print "<PATH> must be a directory"
-
 
118
        return
-
 
119
   
-
 
120
    outf = file(sys.argv[2], "w")
-
 
121
   
88
            payload_size += 5 + len(canon)
122
    header = xstruct.create(HEADER)
-
 
123
    header.tag = "TMPFS"
-
 
124
   
-
 
125
    outf.write(header.pack())
-
 
126
   
-
 
127
    recursion(path, outf)
89
   
128
   
90
    aligned_size = align_up(payload_size, align)
129
    dentry = xstruct.create(DENTRY_NONE)
-
 
130
    dentry.kind = TMPFS_NONE
-
 
131
    dentry.fname_len = 0
91
   
132
   
92
    if (aligned_size - payload_size > 0):
133
    outf.write(dentry.pack())
93
        outf.write(struct.pack("<" + ("%d" % (aligned_size - payload_size)) + "x"))
-
 
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()