aboutsummaryrefslogtreecommitdiff
path: root/scripts/embedded_scripts
blob: b7a023ce04e537916c30c0ff094b526da1b62cfb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#!/bin/sh

target="$1"
custom_loc="$2"
applet_loc="$3"

test "$target" || exit 1
test "$SED" || SED=sed
test "$DD" || DD=dd

# Some people were bitten by their system lacking a (proper) od
od -v -b </dev/null >/dev/null
if test $? != 0; then
	echo 'od tool is not installed or cannot accept "-v -b" options'
	exit 1
fi

custom_scripts=""
if [ -d "$custom_loc" ]
then
	custom_scripts=$(cd $custom_loc; ls * 2>/dev/null)
fi
all_scripts=$(applets/busybox.mkscripts)

# all_scripts includes applet scripts and custom scripts, sort them out
applet_scripts=""
for i in $all_scripts
do
    found=0
	for j in $custom_scripts
	do
		if [ "$i" = "$j" ]
		then
			found=1
			break;
		fi
	done
	if [ $found -eq 0 ]
	then
		# anything that isn't a custom script is an applet script
		applet_scripts="$applet_scripts $i"
	fi
done

# we know the custom scripts are present but applet scripts might have
# become detached from their configuration
for i in $applet_scripts
do
	#if [ ! -f "$applet_loc/$i" -a ! -f "$custom_loc/$i" ]
	if [ ! -f "$applet_loc/$i" ]
	then
		echo "missing applet script $i"
		exit 1
	fi
done

n=$(echo $custom_scripts $applet_scripts | wc -w)
nall=$(echo $all_scripts | wc -w)

if [ $n -ne $nall ]
then
	echo "script mismatch $n != $nall"
	exit 1
fi

concatenate_scripts() {
	for i in $custom_scripts
	do
		cat $custom_loc/$i
		printf '\000'
	done
	for i in $applet_scripts
	do
		cat $applet_loc/$i
		printf '\000'
	done
}

exec >"$target.$$"

if [ $n -ne 0 ]
then
	printf '#ifdef DEFINE_SCRIPT_DATA\n'
	if [ $n -ne 0 ]
	then
		printf 'const uint16_t applet_numbers[] = {\n'
		for i in $custom_scripts $applet_scripts
		do
			# TODO support applets with names including invalid characters
			printf '\tAPPLET_NO_%s,\n' $i
		done
		printf '};\n'
	fi
	printf '#else\n'
	if [ $n -ne 0 ]
	then
		printf 'extern const uint16_t applet_numbers[];\n'
	fi
	printf '#endif\n'
fi

printf "\n"
printf '#define NUM_SCRIPTS %d\n' $n
printf "\n"

if [ $n -ne 0 ]
then
	printf '#define UNPACKED_SCRIPTS_LENGTH '
	concatenate_scripts | wc -c

	printf '#define PACKED_SCRIPTS \\\n'
	concatenate_scripts | bzip2 -1 | $DD bs=2 skip=1 2>/dev/null | \
	od -v -b \
	| grep -v '^ ' \
	| $SED -e 's/^[^ ]*//' \
		-e 's/ //g' \
		-e '/^$/d' \
		-e 's/\(...\)/0\1,/g' \
		-e 's/$/ \\/'
	printf '\n'
fi

mv -- "$target.$$" "$target"