Skip to content

Commit b9f50d9

Browse files
authored
Merge pull request #12 from sarnold/sdk-fix
fix sdk build
2 parents c0e7894 + 637cb60 commit b9f50d9

File tree

1 file changed

+328
-0
lines changed

1 file changed

+328
-0
lines changed

usr/gen_initramfs_list.sh

Lines changed: 328 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,328 @@
1+
#!/bin/sh
2+
# Copyright (C) Martin Schlemmer <azarah@nosferatu.za.org>
3+
# Copyright (C) 2006 Sam Ravnborg <sam@ravnborg.org>
4+
#
5+
# Released under the terms of the GNU GPL
6+
#
7+
# Generate a cpio packed initramfs. It uses gen_init_cpio to generate
8+
# the cpio archive, and then compresses it.
9+
# The script may also be used to generate the inputfile used for gen_init_cpio
10+
# This script assumes that gen_init_cpio is located in usr/ directory
11+
12+
# error out on errors
13+
set -e
14+
15+
usage() {
16+
cat << EOF
17+
Usage:
18+
$0 [-o <file>] [-u <uid>] [-g <gid>] {-d | <cpio_source>} ...
19+
-o <file> Create compressed initramfs file named <file> using
20+
gen_init_cpio and compressor depending on the extension
21+
-u <uid> User ID to map to user ID 0 (root).
22+
<uid> is only meaningful if <cpio_source> is a
23+
directory. "squash" forces all files to uid 0.
24+
-g <gid> Group ID to map to group ID 0 (root).
25+
<gid> is only meaningful if <cpio_source> is a
26+
directory. "squash" forces all files to gid 0.
27+
<cpio_source> File list or directory for cpio archive.
28+
If <cpio_source> is a .cpio file it will be used
29+
as direct input to initramfs.
30+
-d Output the default cpio list.
31+
32+
All options except -o and -l may be repeated and are interpreted
33+
sequentially and immediately. -u and -g states are preserved across
34+
<cpio_source> options so an explicit "-u 0 -g 0" is required
35+
to reset the root/group mapping.
36+
EOF
37+
}
38+
39+
# awk style field access
40+
# $1 - field number; rest is argument string
41+
field() {
42+
shift $1 ; echo $1
43+
}
44+
45+
list_default_initramfs() {
46+
# echo usr/kinit/kinit
47+
:
48+
}
49+
50+
default_initramfs() {
51+
cat <<-EOF >> ${output}
52+
# This is a very simple, default initramfs
53+
54+
dir /dev 0755 0 0
55+
nod /dev/console 0600 0 0 c 5 1
56+
dir /root 0700 0 0
57+
# file /kinit usr/kinit/kinit 0755 0 0
58+
# slink /init kinit 0755 0 0
59+
EOF
60+
}
61+
62+
filetype() {
63+
local argv1="$1"
64+
65+
# symlink test must come before file test
66+
if [ -L "${argv1}" ]; then
67+
echo "slink"
68+
elif [ -f "${argv1}" ]; then
69+
echo "file"
70+
elif [ -d "${argv1}" ]; then
71+
echo "dir"
72+
elif [ -b "${argv1}" -o -c "${argv1}" ]; then
73+
echo "nod"
74+
elif [ -p "${argv1}" ]; then
75+
echo "pipe"
76+
elif [ -S "${argv1}" ]; then
77+
echo "sock"
78+
else
79+
echo "invalid"
80+
fi
81+
return 0
82+
}
83+
84+
list_print_mtime() {
85+
:
86+
}
87+
88+
print_mtime() {
89+
local my_mtime="0"
90+
91+
if [ -e "$1" ]; then
92+
my_mtime=$(find "$1" -printf "%T@\n" | sort -r | head -n 1)
93+
fi
94+
95+
echo "# Last modified: ${my_mtime}" >> ${output}
96+
echo "" >> ${output}
97+
}
98+
99+
list_parse() {
100+
if [ -L "$1" ]; then
101+
return
102+
fi
103+
echo "$1" | sed 's/:/\\:/g; s/$/ \\/'
104+
}
105+
106+
# for each file print a line in following format
107+
# <filetype> <name> <path to file> <octal mode> <uid> <gid>
108+
# for links, devices etc the format differs. See gen_init_cpio for details
109+
parse() {
110+
local location="$1"
111+
local name="/${location#${srcdir}}"
112+
# change '//' into '/'
113+
name=$(echo "$name" | sed -e 's://*:/:g')
114+
local mode="$2"
115+
local uid="$3"
116+
local gid="$4"
117+
local ftype=$(filetype "${location}")
118+
# remap uid/gid to 0 if necessary
119+
[ "$root_uid" = "squash" ] && uid=0 || [ "$uid" -eq "$root_uid" ] && uid=0
120+
[ "$root_gid" = "squash" ] && gid=0 || [ "$gid" -eq "$root_gid" ] && gid=0
121+
local str="${mode} ${uid} ${gid}"
122+
123+
[ "${ftype}" = "invalid" ] && return 0
124+
[ "${location}" = "${srcdir}" ] && return 0
125+
126+
case "${ftype}" in
127+
"file")
128+
str="${ftype} ${name} ${location} ${str}"
129+
;;
130+
"nod")
131+
local dev=`LC_ALL=C ls -l "${location}"`
132+
local maj=`field 5 ${dev}`
133+
local min=`field 6 ${dev}`
134+
maj=${maj%,}
135+
136+
[ -b "${location}" ] && dev="b" || dev="c"
137+
138+
str="${ftype} ${name} ${str} ${dev} ${maj} ${min}"
139+
;;
140+
"slink")
141+
local target=`readlink "${location}"`
142+
str="${ftype} ${name} ${target} ${str}"
143+
;;
144+
*)
145+
str="${ftype} ${name} ${str}"
146+
;;
147+
esac
148+
149+
echo "${str}" >> ${output}
150+
151+
return 0
152+
}
153+
154+
unknown_option() {
155+
printf "ERROR: unknown option \"$arg\"\n" >&2
156+
printf "If the filename validly begins with '-', " >&2
157+
printf "then it must be prefixed\n" >&2
158+
printf "by './' so that it won't be interpreted as an option." >&2
159+
printf "\n" >&2
160+
usage >&2
161+
exit 1
162+
}
163+
164+
list_header() {
165+
:
166+
}
167+
168+
header() {
169+
printf "\n#####################\n# $1\n" >> ${output}
170+
}
171+
172+
# process one directory (incl sub-directories)
173+
dir_filelist() {
174+
${dep_list}header "$1"
175+
176+
srcdir=$(echo "$1" | sed -e 's://*:/:g')
177+
dirlist=$(find "${srcdir}" -printf "%p %m %U %G\n" | LANG=C sort)
178+
179+
# If $dirlist is only one line, then the directory is empty
180+
if [ "$(echo "${dirlist}" | wc -l)" -gt 1 ]; then
181+
${dep_list}print_mtime "$1"
182+
183+
echo "${dirlist}" | \
184+
while read x; do
185+
${dep_list}parse ${x}
186+
done
187+
fi
188+
}
189+
190+
# if only one file is specified and it is .cpio file then use it direct as fs
191+
# if a directory is specified then add all files in given direcotry to fs
192+
# if a regular file is specified assume it is in gen_initramfs format
193+
input_file() {
194+
source="$1"
195+
if [ -f "$1" ]; then
196+
${dep_list}header "$1"
197+
is_cpio="$(echo "$1" | sed 's/^.*\.cpio\(\..*\)\{0,1\}/cpio/')"
198+
if [ $2 -eq 0 -a ${is_cpio} = "cpio" ]; then
199+
cpio_file=$1
200+
echo "$1" | grep -q '^.*\.cpio\..*' && is_cpio_compressed="compressed"
201+
[ ! -z ${dep_list} ] && echo "$1"
202+
return 0
203+
fi
204+
if [ -z ${dep_list} ]; then
205+
print_mtime "$1" >> ${output}
206+
cat "$1" >> ${output}
207+
else
208+
echo "$1 \\"
209+
cat "$1" | while read type dir file perm ; do
210+
if [ "$type" = "file" ]; then
211+
echo "$file \\";
212+
fi
213+
done
214+
fi
215+
elif [ -d "$1" ]; then
216+
dir_filelist "$1"
217+
else
218+
echo " ${prog}: Cannot open '$1'" >&2
219+
exit 1
220+
fi
221+
}
222+
223+
prog=$0
224+
root_uid=0
225+
root_gid=0
226+
dep_list=
227+
cpio_file=
228+
cpio_list=
229+
output="/dev/stdout"
230+
output_file=""
231+
is_cpio_compressed=
232+
compr="gzip -n -9 -f"
233+
234+
arg="$1"
235+
case "$arg" in
236+
"-l") # files included in initramfs - used by kbuild
237+
dep_list="list_"
238+
echo "deps_initramfs := $0 \\"
239+
shift
240+
;;
241+
"-o") # generate compressed cpio image named $1
242+
shift
243+
output_file="$1"
244+
cpio_list="$(mktemp ${TMPDIR:-/tmp}/cpiolist.XXXXXX)"
245+
output=${cpio_list}
246+
echo "$output_file" | grep -q "\.gz$" \
247+
&& [ -x "`which gzip 2> /dev/null`" ] \
248+
&& compr="gzip -n -9 -f"
249+
echo "$output_file" | grep -q "\.bz2$" \
250+
&& [ -x "`which bzip2 2> /dev/null`" ] \
251+
&& compr="bzip2 -9 -f"
252+
echo "$output_file" | grep -q "\.lzma$" \
253+
&& [ -x "`which lzma 2> /dev/null`" ] \
254+
&& compr="lzma -9 -f"
255+
echo "$output_file" | grep -q "\.xz$" \
256+
&& [ -x "`which xz 2> /dev/null`" ] \
257+
&& compr="xz --check=crc32 --lzma2=dict=1MiB"
258+
echo "$output_file" | grep -q "\.lzo$" \
259+
&& [ -x "`which lzop 2> /dev/null`" ] \
260+
&& compr="lzop -9 -f"
261+
echo "$output_file" | grep -q "\.lz4$" \
262+
&& [ -x "`which lz4 2> /dev/null`" ] \
263+
&& compr="lz4 -l -9 -f"
264+
echo "$output_file" | grep -q "\.cpio$" && compr="cat"
265+
shift
266+
;;
267+
esac
268+
while [ $# -gt 0 ]; do
269+
arg="$1"
270+
shift
271+
case "$arg" in
272+
"-u") # map $1 to uid=0 (root)
273+
root_uid="$1"
274+
[ "$root_uid" = "-1" ] && root_uid=$(id -u || echo 0)
275+
shift
276+
;;
277+
"-g") # map $1 to gid=0 (root)
278+
root_gid="$1"
279+
[ "$root_gid" = "-1" ] && root_gid=$(id -g || echo 0)
280+
shift
281+
;;
282+
"-d") # display default initramfs list
283+
default_list="$arg"
284+
${dep_list}default_initramfs
285+
;;
286+
"-h")
287+
usage
288+
exit 0
289+
;;
290+
*)
291+
case "$arg" in
292+
"-"*)
293+
unknown_option
294+
;;
295+
*) # input file/dir - process it
296+
input_file "$arg" "$#"
297+
;;
298+
esac
299+
;;
300+
esac
301+
done
302+
303+
# If output_file is set we will generate cpio archive and compress it
304+
# we are careful to delete tmp files
305+
if [ ! -z ${output_file} ]; then
306+
if [ -z ${cpio_file} ]; then
307+
timestamp=
308+
if test -n "$KBUILD_BUILD_TIMESTAMP"; then
309+
timestamp="$(date -d"$KBUILD_BUILD_TIMESTAMP" +%s || :)"
310+
if test -n "$timestamp"; then
311+
timestamp="-t $timestamp"
312+
fi
313+
fi
314+
cpio_tfile="$(mktemp ${TMPDIR:-/tmp}/cpiofile.XXXXXX)"
315+
usr/gen_init_cpio $timestamp ${cpio_list} > ${cpio_tfile}
316+
else
317+
cpio_tfile=${cpio_file}
318+
fi
319+
rm ${cpio_list}
320+
if [ "${is_cpio_compressed}" = "compressed" ]; then
321+
cat ${cpio_tfile} > ${output_file}
322+
else
323+
(cat ${cpio_tfile} | ${compr} - > ${output_file}) \
324+
|| (rm -f ${output_file} ; false)
325+
fi
326+
[ -z ${cpio_file} ] && rm ${cpio_tfile}
327+
fi
328+
exit 0

0 commit comments

Comments
 (0)