summaryrefslogtreecommitdiff
path: root/hook-functions
blob: fe10cfed4f79ec2a7e2eb343722c5712451050ec (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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
# -*- shell-script -*-

catenate_cpiogz() {
	# Sanity check
	if [ ! -e "${1}" ]; then
		echo "W:catenate_cpiogz: arg1='${1}' does not exist." >&2
		return
	fi

	cat "${1}" >>"${__TMPCPIOGZ}"
}

force_load()
{
		manual_add_modules ${@}
		echo "${@}" >>"${DESTDIR}/conf/modules"
}

# Takes a file containing a list of modules to be added as an
# argument, figures out dependancies, and adds them.
#
# Input file syntax:
#
#   # comment
#   modprobe_module_name [args ...]
#   [...]
#
add_modules_from_file()
{
	# Sanity check
	if [ ! -e "${1}" ]; then
		echo "W:add_modules_from_file: arg1='${1}' does not exist." >&2
		return
	fi

	sed -e '/^#/d' ${1} | while read module rest; do
		force_load "${module}" "${rest}"
	done
}

manual_add_modules()
{
	for mam_x in $(modprobe --set-version="${version}" --show-depends "${1}" 2>/dev/null | awk '/^insmod/ { print $2 }'); do
		# Prune duplicates
		if [ -e "${DESTDIR}/${mam_x}" ]; then
			continue
		fi

		mkdir -p "${DESTDIR}/$(dirname "${mam_x}")"
		ln -s "${mam_x}" "${DESTDIR}/$(dirname "${mam_x}")"
		if [ -n "${verbose}" -a "${verbose}" = "y" ]; then
			echo "Adding module ${mam_x}"
		fi
	done
}

# $1 is source
# $2 is relative destination
copy_exec() {
	final_destination=${DESTDIR}/${2}/`basename ${1}`
	if [ -L "$final_destination" ]; then
		if ! [ `readlink ${final_destination}` = "${1}" ]; then
			echo "W:copy_exec: Not copying ${1} to \$DESTDIR${2}/`basename ${1}`, which is already a copy of `readlink ${final_destination}`" >&2
			return
		fi
	else
		ln -s ${1} ${DESTDIR}/${2}
	fi

	# Copy the dependant libraries
	for x in $(ldd ${1} 2>/dev/null | sed -e '
	    /\//!d;
	    /linux-gate/d;
	    /=>/ {s/.*=>[[:blank:]]*\([^[:blank:]]*\).*/\1/};
	    s/[[:blank:]]*\([^[:blank:]]*\) (.*)/\1/' 2>/dev/null); do

		# Try to use non-optimised libraries where possible.
		# We assume that all HWCAP libraries will be in tls.
		nonoptlib=$(echo ${x} | sed -e 's#/lib/tls.*/\(lib.*\)#/lib/\1#')

		if [ -e ${nonoptlib} ]; then
			x=${nonoptlib}
		fi

		libname=$(basename ${x})
		dirname=$(dirname ${x})

		mkdir -p ${DESTDIR}/${dirname}
		if [ ! -e ${DESTDIR}/${dirname}/${libname} ]; then
			ln -s ${x} ${DESTDIR}/${dirname}
		fi
	done
}

# Copy entire subtrees to the initramfs
copy_modules_dir()
{
	tmpdir_modbase="${DESTDIR}/lib/modules/${version}"
	mkdir -p "$(dirname "${tmpdir_modbase}/${1}")"
	cp -a "${MODULESDIR}/${1}" "${tmpdir_modbase}/${1}"
}

dep_add_modules()
{

	# Things that are too hard to autodetect.
	for x in ext2 ext3 isofs jfs nfs reiserfs xfs af_packet; do
		manual_add_modules "${x}"
	done

	for x in /sys/bus/pci/devices/*; do
		if [ -e "${x}/modalias" ]; then
			manual_add_modules $(cat "${x}/modalias")
		fi
	done

	for x in /sys/bus/usb/devices/*; do
		if [ -e "${x}/modalias" ]; then
			manual_add_modules $(cat "${x}/modalias")
		fi
	done

	if [ -e /proc/ide ]; then
		for x in ide-generic ide-disk ide-cd; do
			manual_add_modules "${x}"
		done
	fi

	if [ -e /sys/bus/scsi/devices/ ]; then
		manual_add_modules sd_mod
	fi

	if [ -e /sys/bus/i2o/devices/ ]; then
		manual_add_modules i2o_block
	fi
}


# The modules "most" classes added per default to the initramfs
auto_add_modules()
{
	case "$1" in
	base)
		for x in ehci-hcd ohci-hcd uhci-hcd usbhid usb-storage ext2 \
		ext3 isofs jfs nfs reiserfs xfs af_packet atkbd i8042; do
			manual_add_modules "${x}"
		done
	;;
	net)
		for x in 3c59x 8139cp 8139too 8390 b44 bmac bnx2 defxx \
		dl2k e1000 e100 epic100 eql fealnx famachi forcedeth \
		hp100 mace mv643xx_eth natsemi ne2k-pci netconsole \
		ns83820 pcnet32 r8169 s2io sis900 skge slhc starfire \
		sundance sungem sungem_phy sunhme tg3 tlan de2104x \
		de4x5 dmfe tulip winbond-840 xircom_cb xircom_tulip_cb \
		typhon via-rhine via-velocity yellowfin; do
			manual_add_modules "${x}"
		done
	;;
	ide)
		for x in ide-cd ide-disk ide-generic aec62xx alim15x3 \
		amd74xx atiixp atuuxo cmd64x cs5520 cs5530 cy82c693 \
		generic hpt34x hpt366 it821x ns87415 opti621 pdc202xx_new \
		pdc202xx_old piix rz1000 sc1200 serverworks siimage \
		sis5513 slc82c105 slc90e66 triflex trm290 via82cxxx; do
			manual_add_modules "${x}"
		done
	;;
	scsi)
		for x in 3w-9xxx 3w-xxxx a100u2x aacraid advansys ahci \
		aic79xx aic7xxx arcmsr ata_piix atari_scsi atp870u BusLogic \
		cciss ch cpqarray dac960 dc395x dmx3191d dpt_i2o eata fdomain \
		gdth ibmvscsic initio ipr ips isp1020 lpfc max_scsi mac53c94 \
		megaraid megaraid_mbox megaraid_mm mesh mptfc mptscsih \
		mptsas mptspi nsp32 osst qla1280 qla2100 qla2200 qla2300 \
		qla2322 qla2xxx qla6312 qlogicfas408 qlogicfc sata_mv \
		sata_nv sata_promise sata_qstor sata_sil sata_sis sata_svw \
		sata_sx4 sata_uli sata_via sata_vsc scsi_mod \
		scsi_transport_fc scsi_transport_iscsi scsi_transport_spi \
		sd_mod sym53c8xx tmscsim zfcp; do
			manual_add_modules "${x}"
		done
	;;
	ieee1394)
		for x in ohci1394 sbp2; do
			manual_add_modules "${x}"
		done
	;;
	i2o)
		for x in i2o_block; do
			manual_add_modules "${x}"
		done
	;;
	dasd)
		for x in dasd_eckd_mod dasd_fba_mod; do
			manual_add_modules "${x}"
		done
	;;
	*)
		auto_add_modules base
		auto_add_modules net
		auto_add_modules ide
		auto_add_modules scsi
		auto_add_modules i2o
		auto_add_modules dasd
		auto_add_modules ieee1394
	;;
	esac
}

usage()
{
	cat >&2 << EOF

Usage: ${0} [OPTION]... <-o outfile> [version]

Options:
  -d confdir  Specify an alternative configuration directory.
  -k          Keep temporary directory used to make the image.
  -o outfile  Write to outfile.
  -r root     Override ROOT setting in mkinitrd.conf.

See mkinitramfs(8) for further details.
EOF
	exit 1

}

# minimal supported kernel version
check_minkver()
{
	curversion=${1}
	initdir=${2}
	set_initlist
	if [ -z ${initdir} ]; then
		DPKG_ARCH=`dpkg --print-installation-architecture`
		case ${DPKG_ARCH} in
			ia64|hppa)
				minversion="2.6.15"
			;;
			*)
				minversion="2.6.12"
			;;
		esac
		if dpkg --compare-versions "${curversion}" lt "${minversion}"; then
			echo "W: kernerl ${curversion} too old for initramfs on ${DPKG_ARCH}" >&2
			echo "W: not generating requested initramfs for kernel ${curversion}" >&2
			exit 2
		fi
	fi
	[ -z ${initdir} ] || for cm_x in ${initlist}; do
		tmp=$(eval echo $(grep ^MINKVER ${initdir}/${cm_x} | cut -d'=' -f2))
		if dpkg --compare-versions "${curversion}" lt "${tmp}"; then
			echo "W: ${cm_x} hook script requires at least kernel version ${tmp}" >&2
			echo "W: not generating requested initramfs for kernel ${curversion}" >&2
			exit 2
		fi
	done
}