3 # Copyright (c) 2008 Martin Decky
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
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.
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.
37 from imgutil
import listdir_items
, chunks
40 char tag[5] /* 'TMPFS' */
43 DENTRY_NONE
= """little:
44 uint8_t kind /* NONE */
45 uint32_t fname_len /* 0 */
48 DENTRY_FILE
= """little:
49 uint8_t kind /* FILE */
50 uint32_t fname_len /* filename length */
51 char fname[%d] /* filename */
52 uint32_t flen /* file length */
55 DENTRY_DIRECTORY
= """little:
56 uint8_t kind /* DIRECTORY */
57 uint32_t fname_len /* filename length */
58 char fname[%d] /* filename */
67 print(prname
+ " <PATH> <IMAGE>")
69 def recursion(root
, outf
):
70 "Recursive directory walk"
72 for item
in listdir_items(root
):
74 dentry
= xstruct
.create(DENTRY_FILE
% len(item
.name
))
75 dentry
.kind
= TMPFS_FILE
76 dentry
.fname_len
= len(item
.name
)
77 dentry
.fname
= item
.name
.encode('ascii')
78 dentry
.flen
= item
.size
80 outf
.write(dentry
.pack())
82 for data
in chunks(item
, 4096):
86 dentry
= xstruct
.create(DENTRY_DIRECTORY
% len(item
.name
))
87 dentry
.kind
= TMPFS_DIRECTORY
88 dentry
.fname_len
= len(item
.name
)
89 dentry
.fname
= item
.name
.encode('ascii')
91 outf
.write(dentry
.pack())
93 recursion(item
.path
, outf
)
95 dentry
= xstruct
.create(DENTRY_NONE
)
96 dentry
.kind
= TMPFS_NONE
99 outf
.write(dentry
.pack())
102 if (len(sys
.argv
) < 3):
106 path
= os
.path
.abspath(sys
.argv
[1])
107 if (not os
.path
.isdir(path
)):
108 print("<PATH> must be a directory")
111 outf
= open(sys
.argv
[2], "wb")
113 header
= xstruct
.create(HEADER
)
114 header
.tag
= b
"TMPFS"
116 outf
.write(header
.pack())
118 recursion(path
, outf
)
120 dentry
= xstruct
.create(DENTRY_NONE
)
121 dentry
.kind
= TMPFS_NONE
124 outf
.write(dentry
.pack())
128 if __name__
== '__main__':