#!/bin/bash
#====================================================================
# This is a Source Mage script for generating initial ramdisks to be
# loaded by the kernel
#
# @Copyright Source Mage GNU/Linux Developers
#
# USAGE:
#
#   # mkinitrd -o /boot/initrd.img-2.6.20 2.6.20
#
#    -v|--version               displays usage version and exits
#    --enable-raid              force the usage of raid
#    --enable-lvm               force the usage of lvm
#    --disable-raid             don't use raid
#    --disable-lvm              don't use lvm
#    -f|--force                 if initrd file exists blow it away
#    --ignore-missing           ignore missing modules that may show up
#    -m|--with-module           add module to the initrd
#    -o|--output                output file 
#====================================================================

FORCE_RAID=${FORCE_RAID:=false}
FORCE_LVM=${FORCE_LVM:=false}
USE_RAID=${USE_RAID:=false}
USE_LVM=${USE_LVM:=false}
BREAK_ON_MISSING=${BREAK_ON_MISSING:=true}
REMOVE_OLD_INITRD=${REMOVE_OLD_INITRD:=false}

MODULES=${MODULES:=}
KVERSION=$(uname -r)
INITRD_FILE=${INITRD_FILE:=/boot/initrd.img-$KVERSION}

function usage()
{
	local usage=<<EOF
	$0 [OPTIONS] -o <initrdfile> <kernel-version>
EOF
	echo $usage
}

function linuxrc_pre()
{
	cat <<-EOF
#!/bin/sh.shared

for module in \`cat /modules.lst\`
do
/sbin/insmod \$module
done
EOF
}

function linuxrc_raid()
{
	if $USE_RAID || $FORCE_RAID
	then
	cat <<-EOF
/sbin/mdadm --assemble --scan
EOF
	fi
}

function linuxrc_lvm()
{
	if $USE_LVM || $FORCE_LVM
	then
	cat <<-EOF
/sbin/mount -t proc proc /proc
/sbin/dmsetup mknodes
/sbin/vgscan --ignorelockingfailure --mknodes
/sbin/vgchange -ay --ignorelockingfailure
EOF
	fi
}

function linuxrc_pre_kinit()
{
	[ -x /etc/linux-initramfs/pre_kinit.sh ] && 
	. /etc/linux-initramfs/pre_kinit.sh
}

function linuxrc_post()
{
	cat <<-EOF
exec /bin/kinit "\$@"
EOF
}

function default_parts()
{
	cat <<-EOF
dir /dev 0755 0 0
nod /dev/console 0600 0 0 c 5 1
dir /root 0700 0 0
slink /init linuxrc 0755 0 0
file /linuxrc /tmp/linuxrc 0755 0 0
EOF
}

function dir_parts()
{
	cat <<-EOF
slink /sbin bin 0755 0 0
dir /bin 0755 0 0
slink /usr/sbin bin 0755 0 0
dir /usr/bin 0755 0 0
dir /lib 0755 0 0
dir /proc 0755 0 0
dir /sys 0755 0 0
dir /etc 0755 0 0
dir /modules 0755 0 0
EOF
}

function user_parts()
{
	local file
	[ -f /etc/linux-initramfs/add-files.lst ] &&
	for file in `cat /etc/linux-initramfs/add-files.lst`
	do
		if [[ -f $file ]]
		then
			local mode=$(stat -c %a $file)
			local O=$(stat -c %o $file)
			local G=$(stat -c %g $file)
			cat <<-EOF
			file $file $file $mode $O $G
			EOF
		fi
	done
}

function dev_parts()
{
	cat <<-EOF
nod /dev/sda 660 0 6 b 8 0
nod /dev/sda1 660 0 6 b 8 1
nod /dev/sda10 660 0 6 b 8 10
nod /dev/sda11 660 0 6 b 8 11
nod /dev/sda12 660 0 6 b 8 12
nod /dev/sda13 660 0 6 b 8 13
nod /dev/sda14 660 0 6 b 8 14
nod /dev/sda15 660 0 6 b 8 15
nod /dev/sda2 660 0 6 b 8 2
nod /dev/sda3 660 0 6 b 8 3
nod /dev/sda4 660 0 6 b 8 4
nod /dev/sda5 660 0 6 b 8 5
nod /dev/sda6 660 0 6 b 8 6
nod /dev/sda7 660 0 6 b 8 7
nod /dev/sda8 660 0 6 b 8 8
nod /dev/sda9 660 0 6 b 8 9
nod /dev/sdb 660 0 6 b 8 16
nod /dev/sdb1 660 0 6 b 8 17
nod /dev/sdb10 660 0 6 b 8 26
nod /dev/sdb11 660 0 6 b 8 27
nod /dev/sdb12 660 0 6 b 8 28
nod /dev/sdb13 660 0 6 b 8 29
nod /dev/sdb14 660 0 6 b 8 30
nod /dev/sdb15 660 0 6 b 8 31
nod /dev/sdb2 660 0 6 b 8 18
nod /dev/sdb3 660 0 6 b 8 19
nod /dev/sdb4 660 0 6 b 8 20
nod /dev/sdb5 660 0 6 b 8 21
nod /dev/sdb6 660 0 6 b 8 22
nod /dev/sdb7 660 0 6 b 8 23
nod /dev/sdb8 660 0 6 b 8 24
nod /dev/sdb9 660 0 6 b 8 25
nod /dev/sdc 660 0 6 b 8 32
nod /dev/sdc1 660 0 6 b 8 33
nod /dev/sdc10 660 0 6 b 8 42
nod /dev/sdc11 660 0 6 b 8 43
nod /dev/sdc12 660 0 6 b 8 44
nod /dev/sdc13 660 0 6 b 8 45
nod /dev/sdc14 660 0 6 b 8 46
nod /dev/sdc15 660 0 6 b 8 47
nod /dev/sdc2 660 0 6 b 8 34
nod /dev/sdc3 660 0 6 b 8 35
nod /dev/sdc4 660 0 6 b 8 36
nod /dev/sdc5 660 0 6 b 8 37
nod /dev/sdc6 660 0 6 b 8 38
nod /dev/sdc7 660 0 6 b 8 39
nod /dev/sdc8 660 0 6 b 8 40
nod /dev/sdc9 660 0 6 b 8 41
nod /dev/sdd 660 0 6 b 8 48
nod /dev/sdd1 660 0 6 b 8 49
nod /dev/sdd10 660 0 6 b 8 58
nod /dev/sdd11 660 0 6 b 8 59
nod /dev/sdd12 660 0 6 b 8 60
nod /dev/sdd13 660 0 6 b 8 61
nod /dev/sdd14 660 0 6 b 8 62
nod /dev/sdd15 660 0 6 b 8 63
nod /dev/sdd2 660 0 6 b 8 50
nod /dev/sdd3 660 0 6 b 8 51
nod /dev/sdd4 660 0 6 b 8 52
nod /dev/sdd5 660 0 6 b 8 53
nod /dev/sdd6 660 0 6 b 8 54
nod /dev/sdd7 660 0 6 b 8 55
nod /dev/sdd8 660 0 6 b 8 56
nod /dev/sdd9 660 0 6 b 8 57
nod /dev/sde 660 0 6 b 8 64
nod /dev/sde1 660 0 6 b 8 65
nod /dev/sde10 660 0 6 b 8 74
nod /dev/sde11 660 0 6 b 8 75
nod /dev/sde12 660 0 6 b 8 76
nod /dev/sde13 660 0 6 b 8 77
nod /dev/sde14 660 0 6 b 8 78
nod /dev/sde15 660 0 6 b 8 79
nod /dev/sde2 660 0 6 b 8 66
nod /dev/sde3 660 0 6 b 8 67
nod /dev/sde4 660 0 6 b 8 68
nod /dev/sde5 660 0 6 b 8 69
nod /dev/sde6 660 0 6 b 8 70
nod /dev/sde7 660 0 6 b 8 71
nod /dev/sde8 660 0 6 b 8 72
nod /dev/sde9 660 0 6 b 8 73
nod /dev/sdf 660 0 6 b 8 80
nod /dev/sdf1 660 0 6 b 8 81
nod /dev/sdf10 660 0 6 b 8 90
nod /dev/sdf11 660 0 6 b 8 91
nod /dev/sdf12 660 0 6 b 8 92
nod /dev/sdf13 660 0 6 b 8 93
nod /dev/sdf14 660 0 6 b 8 94
nod /dev/sdf15 660 0 6 b 8 95
nod /dev/sdf2 660 0 6 b 8 82
nod /dev/sdf3 660 0 6 b 8 83
nod /dev/sdf4 660 0 6 b 8 84
nod /dev/sdf5 660 0 6 b 8 85
nod /dev/sdf6 660 0 6 b 8 86
nod /dev/sdf7 660 0 6 b 8 87
nod /dev/sdf8 660 0 6 b 8 88
nod /dev/sdf9 660 0 6 b 8 89
nod /dev/sdh 660 0 6 b 8 112
nod /dev/sdh1 660 0 6 b 8 113
nod /dev/sdh10 660 0 6 b 8 122
nod /dev/sdh11 660 0 6 b 8 123
nod /dev/sdh12 660 0 6 b 8 124
nod /dev/sdh13 660 0 6 b 8 125
nod /dev/sdh14 660 0 6 b 8 126
nod /dev/sdh15 660 0 6 b 8 127
nod /dev/sdh2 660 0 6 b 8 114
nod /dev/sdh3 660 0 6 b 8 115
nod /dev/sdh4 660 0 6 b 8 116
nod /dev/sdh5 660 0 6 b 8 117
nod /dev/sdh6 660 0 6 b 8 118
nod /dev/sdh7 660 0 6 b 8 119
nod /dev/sdh8 660 0 6 b 8 120
nod /dev/sdh9 660 0 6 b 8 121
nod /dev/sdi 660 0 6 b 8 128
nod /dev/sdi1 660 0 6 b 8 129
nod /dev/sdi10 660 0 6 b 8 138
nod /dev/sdi11 660 0 6 b 8 139
nod /dev/sdi12 660 0 6 b 8 140
nod /dev/sdi13 660 0 6 b 8 141
nod /dev/sdi14 660 0 6 b 8 142
nod /dev/sdi15 660 0 6 b 8 143
nod /dev/sdi2 660 0 6 b 8 130
nod /dev/sdi3 660 0 6 b 8 131
nod /dev/sdi4 660 0 6 b 8 132
nod /dev/sdi5 660 0 6 b 8 133
nod /dev/sdi6 660 0 6 b 8 134
nod /dev/sdi7 660 0 6 b 8 135
nod /dev/sdi8 660 0 6 b 8 136
nod /dev/sdi9 660 0 6 b 8 137
nod /dev/sdj 660 0 6 b 8 144
nod /dev/sdj1 660 0 6 b 8 145
nod /dev/sdj10 660 0 6 b 8 154
nod /dev/sdj11 660 0 6 b 8 155
nod /dev/sdj12 660 0 6 b 8 156
nod /dev/sdj13 660 0 6 b 8 157
nod /dev/sdj14 660 0 6 b 8 158
nod /dev/sdj15 660 0 6 b 8 159
nod /dev/sdj2 660 0 6 b 8 146
nod /dev/sdj3 660 0 6 b 8 147
nod /dev/sdj4 660 0 6 b 8 148
nod /dev/sdj5 660 0 6 b 8 149
nod /dev/sdj6 660 0 6 b 8 150
nod /dev/sdj7 660 0 6 b 8 151
nod /dev/sdj8 660 0 6 b 8 152
nod /dev/sdj9 660 0 6 b 8 153
nod /dev/sdk 660 0 6 b 8 160
nod /dev/sdk1 660 0 6 b 8 161
nod /dev/sdk10 660 0 6 b 8 170
nod /dev/sdk11 660 0 6 b 8 171
nod /dev/sdk12 660 0 6 b 8 172
nod /dev/sdk13 660 0 6 b 8 173
nod /dev/sdk14 660 0 6 b 8 174
nod /dev/sdk15 660 0 6 b 8 175
nod /dev/sdk2 660 0 6 b 8 162
nod /dev/sdk3 660 0 6 b 8 163
nod /dev/sdk4 660 0 6 b 8 164
nod /dev/sdk5 660 0 6 b 8 165
nod /dev/sdk6 660 0 6 b 8 166
nod /dev/sdk7 660 0 6 b 8 167
nod /dev/sdk8 660 0 6 b 8 168
nod /dev/sdk9 660 0 6 b 8 169
nod /dev/sdl 660 0 6 b 8 176
nod /dev/sdl1 660 0 6 b 8 177
nod /dev/sdl10 660 0 6 b 8 186
nod /dev/sdl11 660 0 6 b 8 187
nod /dev/sdl12 660 0 6 b 8 188
nod /dev/sdl13 660 0 6 b 8 189
nod /dev/sdl14 660 0 6 b 8 190
nod /dev/sdl15 660 0 6 b 8 191
nod /dev/sdl2 660 0 6 b 8 178
nod /dev/sdl3 660 0 6 b 8 179
nod /dev/sdl4 660 0 6 b 8 180
nod /dev/sdl5 660 0 6 b 8 181
nod /dev/sdl6 660 0 6 b 8 182
nod /dev/sdl7 660 0 6 b 8 183
nod /dev/sdl8 660 0 6 b 8 184
nod /dev/sdl9 660 0 6 b 8 185
nod /dev/hda 660 0 6 b 3 0
nod /dev/hda1 660 0 6 b 3 1
nod /dev/hda10 660 0 6 b 3 10
nod /dev/hda11 660 0 6 b 3 11
nod /dev/hda12 660 0 6 b 3 12
nod /dev/hda13 660 0 6 b 3 13
nod /dev/hda14 660 0 6 b 3 14
nod /dev/hda15 660 0 6 b 3 15
nod /dev/hda16 660 0 6 b 3 16
nod /dev/hda17 660 0 6 b 3 17
nod /dev/hda18 660 0 6 b 3 18
nod /dev/hda19 660 0 6 b 3 19
nod /dev/hda2 660 0 6 b 3 2
nod /dev/hda20 660 0 6 b 3 20
nod /dev/hda3 660 0 6 b 3 3
nod /dev/hda4 660 0 6 b 3 4
nod /dev/hda5 660 0 6 b 3 5
nod /dev/hda6 660 0 6 b 3 6
nod /dev/hda7 660 0 6 b 3 7
nod /dev/hda8 660 0 6 b 3 8
nod /dev/hda9 660 0 6 b 3 9
nod /dev/hdb 660 0 6 b 3 64
nod /dev/hdb1 660 0 6 b 3 65
nod /dev/hdb10 660 0 6 b 3 74
nod /dev/hdb11 660 0 6 b 3 75
nod /dev/hdb12 660 0 6 b 3 76
nod /dev/hdb13 660 0 6 b 3 77
nod /dev/hdb14 660 0 6 b 3 78
nod /dev/hdb15 660 0 6 b 3 79
nod /dev/hdb16 660 0 6 b 3 80
nod /dev/hdb17 660 0 6 b 3 81
nod /dev/hdb18 660 0 6 b 3 82
nod /dev/hdb19 660 0 6 b 3 83
nod /dev/hdb2 660 0 6 b 3 66
nod /dev/hdb20 660 0 6 b 3 84
nod /dev/hdb3 660 0 6 b 3 67
nod /dev/hdb4 660 0 6 b 3 68
nod /dev/hdb5 660 0 6 b 3 69
nod /dev/hdb6 660 0 6 b 3 70
nod /dev/hdb7 660 0 6 b 3 71
nod /dev/hdb8 660 0 6 b 3 72
nod /dev/hdb9 660 0 6 b 3 73
nod /dev/hdc 660 0 6 b 22 0
nod /dev/hdc1 660 0 6 b 22 1
nod /dev/hdc10 660 0 6 b 22 10
nod /dev/hdc11 660 0 6 b 22 11
nod /dev/hdc12 660 0 6 b 22 12
nod /dev/hdc13 660 0 6 b 22 13
nod /dev/hdc14 660 0 6 b 22 14
nod /dev/hdc15 660 0 6 b 22 15
nod /dev/hdc16 660 0 6 b 22 16
nod /dev/hdc17 660 0 6 b 22 17
nod /dev/hdc18 660 0 6 b 22 18
nod /dev/hdc19 660 0 6 b 22 19
nod /dev/hdc2 660 0 6 b 22 2
nod /dev/hdc20 660 0 6 b 22 20
nod /dev/hdc3 660 0 6 b 22 3
nod /dev/hdc4 660 0 6 b 22 4
nod /dev/hdc5 660 0 6 b 22 5
nod /dev/hdc6 660 0 6 b 22 6
nod /dev/hdc7 660 0 6 b 22 7
nod /dev/hdc8 660 0 6 b 22 8
nod /dev/hdc9 660 0 6 b 22 9
nod /dev/hdd 660 0 6 b 22 64
nod /dev/hdd1 660 0 6 b 22 65
nod /dev/hdd10 660 0 6 b 22 74
nod /dev/hdd11 660 0 6 b 22 75
nod /dev/hdd12 660 0 6 b 22 76
nod /dev/hdd13 660 0 6 b 22 77
nod /dev/hdd14 660 0 6 b 22 78
nod /dev/hdd15 660 0 6 b 22 79
nod /dev/hdd16 660 0 6 b 22 80
nod /dev/hdd17 660 0 6 b 22 81
nod /dev/hdd18 660 0 6 b 22 82
nod /dev/hdd19 660 0 6 b 22 83
nod /dev/hdd2 660 0 6 b 22 66
nod /dev/hdd20 660 0 6 b 22 84
nod /dev/hdd3 660 0 6 b 22 67
nod /dev/hdd4 660 0 6 b 22 68
nod /dev/hdd5 660 0 6 b 22 69
nod /dev/hdd6 660 0 6 b 22 70
nod /dev/hdd7 660 0 6 b 22 71
nod /dev/hdd8 660 0 6 b 22 72
nod /dev/hdd9 660 0 6 b 22 73
nod /dev/hde 660 0 6 b 33 0
nod /dev/hde1 660 0 6 b 33 1
nod /dev/hde10 660 0 6 b 33 10
nod /dev/hde11 660 0 6 b 33 11
nod /dev/hde12 660 0 6 b 33 12
nod /dev/hde13 660 0 6 b 33 13
nod /dev/hde14 660 0 6 b 33 14
nod /dev/hde15 660 0 6 b 33 15
nod /dev/hde16 660 0 6 b 33 16
nod /dev/hde17 660 0 6 b 33 17
nod /dev/hde18 660 0 6 b 33 18
nod /dev/hde19 660 0 6 b 33 19
nod /dev/hde2 660 0 6 b 33 2
nod /dev/hde20 660 0 6 b 33 20
nod /dev/hde3 660 0 6 b 33 3
nod /dev/hde4 660 0 6 b 33 4
nod /dev/hde5 660 0 6 b 33 5
nod /dev/hde6 660 0 6 b 33 6
nod /dev/hde7 660 0 6 b 33 7
nod /dev/hde8 660 0 6 b 33 8
nod /dev/hde9 660 0 6 b 33 9
nod /dev/hdf 660 0 6 b 33 64
nod /dev/hdf1 660 0 6 b 33 65
nod /dev/hdf10 660 0 6 b 33 74
nod /dev/hdf11 660 0 6 b 33 75
nod /dev/hdf12 660 0 6 b 33 76
nod /dev/hdf13 660 0 6 b 33 77
nod /dev/hdf14 660 0 6 b 33 78
nod /dev/hdf15 660 0 6 b 33 79
nod /dev/hdf16 660 0 6 b 33 80
nod /dev/hdf17 660 0 6 b 33 81
nod /dev/hdf18 660 0 6 b 33 82
nod /dev/hdf19 660 0 6 b 33 83
nod /dev/hdf2 660 0 6 b 33 66
nod /dev/hdf20 660 0 6 b 33 84
nod /dev/hdf3 660 0 6 b 33 67
nod /dev/hdf4 660 0 6 b 33 68
nod /dev/hdf5 660 0 6 b 33 69
nod /dev/hdf6 660 0 6 b 33 70
nod /dev/hdf7 660 0 6 b 33 71
nod /dev/hdf8 660 0 6 b 33 72
nod /dev/hdf9 660 0 6 b 33 73
nod /dev/hdg 660 0 6 b 34 0
nod /dev/hdg1 660 0 6 b 34 1
nod /dev/hdg10 660 0 6 b 34 10
nod /dev/hdg11 660 0 6 b 34 11
nod /dev/hdg12 660 0 6 b 34 12
nod /dev/hdg13 660 0 6 b 34 13
nod /dev/hdg14 660 0 6 b 34 14
nod /dev/hdg15 660 0 6 b 34 15
nod /dev/hdg16 660 0 6 b 34 16
nod /dev/hdg17 660 0 6 b 34 17
nod /dev/hdg18 660 0 6 b 34 18
nod /dev/hdg19 660 0 6 b 34 19
nod /dev/hdg2 660 0 6 b 34 2
nod /dev/hdg20 660 0 6 b 34 20
nod /dev/hdg3 660 0 6 b 34 3
nod /dev/hdg4 660 0 6 b 34 4
nod /dev/hdg5 660 0 6 b 34 5
nod /dev/hdg6 660 0 6 b 34 6
nod /dev/hdg7 660 0 6 b 34 7
nod /dev/hdg8 660 0 6 b 34 8
nod /dev/hdg9 660 0 6 b 34 9
nod /dev/hdh 660 0 6 b 34 64
nod /dev/hdh1 660 0 6 b 34 65
nod /dev/hdh10 660 0 6 b 34 74
nod /dev/hdh11 660 0 6 b 34 75
nod /dev/hdh12 660 0 6 b 34 76
nod /dev/hdh13 660 0 6 b 34 77
nod /dev/hdh14 660 0 6 b 34 78
nod /dev/hdh15 660 0 6 b 34 79
nod /dev/hdh16 660 0 6 b 34 80
nod /dev/hdh17 660 0 6 b 34 81
nod /dev/hdh18 660 0 6 b 34 82
nod /dev/hdh19 660 0 6 b 34 83
nod /dev/hdh2 660 0 6 b 34 66
nod /dev/hdh20 660 0 6 b 34 84
nod /dev/hdh3 660 0 6 b 34 67
nod /dev/hdh4 660 0 6 b 34 68
nod /dev/hdh5 660 0 6 b 34 69
nod /dev/hdh6 660 0 6 b 34 70
nod /dev/hdh7 660 0 6 b 34 71
nod /dev/hdh8 660 0 6 b 34 72
nod /dev/hdh9 660 0 6 b 34 73
nod /dev/loop0 660 0 6 b 7 0
nod /dev/loop1 660 0 6 b 7 1
nod /dev/loop10 660 0 6 b 7 10
nod /dev/loop11 660 0 6 b 7 11
nod /dev/loop12 660 0 6 b 7 12
nod /dev/loop13 660 0 6 b 7 13
nod /dev/loop14 660 0 6 b 7 14
nod /dev/loop15 660 0 6 b 7 15
nod /dev/loop2 660 0 6 b 7 2
nod /dev/loop3 660 0 6 b 7 3
nod /dev/loop4 660 0 6 b 7 4
nod /dev/loop5 660 0 6 b 7 5
nod /dev/loop6 660 0 6 b 7 6
nod /dev/loop7 660 0 6 b 7 7
nod /dev/loop8 660 0 6 b 7 8
nod /dev/loop9 660 0 6 b 7 9
nod /dev/ram0 660 0 6 b 1 0
nod /dev/ram1 660 0 6 b 1 1
nod /dev/ram2 660 0 6 b 1 2
nod /dev/ram3 660 0 6 b 1 3
EOF
}

function module_parts()
{
	local module
	local full_path_module
	rm -f /tmp/modules.lst
	touch /tmp/modules.lst
	echo "file /modules.lst /tmp/modules.lst 0644 0 0"
	for module in $MODULES
	do
		full_path_module=$(grep "/$module.ko:\|/${module//-/_}.ko:\|/${module//_/-}.ko:" /lib/modules/$KVERSION/modules.dep | cut -d: -f1 | head -n 1)
		echo /modules/$(basename $full_path_module) >> /tmp/modules.lst
		cat <<-EOF
		file /modules/$(basename $full_path_module) $full_path_module 0644 0 0
		EOF
	done
}

function klibc_parts()
{
	local file
	for file in /usr/lib/klibc/bin/*
	do
		echo "file /bin/$(basename $file) $file 0755 0 0"
	done
	for file in /usr/lib/klibc/lib/*
	do
		echo "file /lib/$(basename $file) $file 0755 0 0"
	done
}

function raid_parts()
{
	if $USE_RAID || $FORCE_RAID
	then
	cat <<-EOF
file /sbin/mdadm /sbin/mdadm.static 0755 0 0
file /etc/mdadm.conf /etc/mdadm.conf 0644 0 0
EOF
	fi
}

function lvm_parts()
{
	if $USE_LVM || $FORCE_LVM
	then
	cat <<-EOF
dir /etc/lvm 0755 0 0
file /etc/lvm/lvm.conf /etc/lvm/lvm.conf 0644 0 0
file /sbin/lvm /usr/sbin/lvm.static 0755 0 0
EOF
	local link
	for link in lvs pvs vgs vgck lvconvert lvdisplay pvchange pvcreate \
		vgmknodes pvremove pvresize lvmchange lvmdump lvmsadc \
		vgcfgrestore lvmdiskscan pvdisplay lvmsar lvscan vgchange \
		vgcreate pvmove pvscan vgexport vgextend vgimport vgscan \
		vgmerge vgsplit lvchange lvcreate lvextend vgreduce vgrename \
		vgremove vgconvert vgcfgbackup lvreduce lvrename lvremove \
		lvresize vgdisplay 
	do
		echo "slink /sbin/$link lvm 0755 0 0"
	done
	echo "file /sbin/dmsetup /sbin/dmsetup.static 0755 0 0"
	fi
}

function rec_fill_modules()
{
	local dep_modules
	local module=$1
	local dep_module
	dep_modules=$(grep "/$module.ko:\|/${module//-/_}.ko:\|/${module//_/-}.ko:" /lib/modules/$KVERSION/modules.dep)
	if [[ -z $dep_modules ]]
	then
		echo "# Bahh!!! couldn't find dependent module $module"
		if $BREAK_ON_MISSING
		then
			exit -1
		else
			return 0
		fi
	fi
	dep_modules=$(echo $dep_modules | cut -d: -f2-)
	if ! echo $MODULES | grep -q " $module"
	then
		if [[ $dep_modules ]]
		then
			for dep_module in $dep_modules
			do
				dep_module=$(basename $dep_module)
				rec_fill_modules ${dep_module/.ko}
			done
		fi
		MODULES="${MODULES} $module"
	fi
}

function fill_root_driver()
{
	local module
	# there should be a better way to 'detect' what this is but...
	for module in `cat /etc/linux-initramfs/modules.lst`
	do
		if ! echo $MODULES | grep -q " $module"
		then
			rec_fill_modules ${module}
		fi
	done
}

function fill_root_filesystem()
{
	local filesystem=$(mount | grep ' / ' | tail -n 1 | cut -d' ' -f5)
	rec_fill_modules $filesystem
}

function fill_modules()
{
	if $USE_RAID || $FORCE_RAID
	then
		rec_fill_modules raid0
		rec_fill_modules raid1
		rec_fill_modules raid10
		rec_fill_modules raid5
		rec_fill_modules raid6
		rec_fill_modules raid456
	fi
	if $USE_LVM || $FORCE_LVM
	then
		rec_fill_modules dm-mod
	fi
	fill_root_driver
	fill_root_filesystem
}

function check_raid()
{
	if [[ -f /etc/mdadm.conf && -x /sbin/mdadm.static ]]
	then
		USE_RAID=true
	else
		USE_RAID=false
	fi
}

function check_lvm()
{
	if [[ -f /etc/lvm/lvm.conf && -x /usr/sbin/lvm.static && -x /sbin/dmsetup.static ]]
	then
		USE_LVM=true
	else
		USE_LVM=false
	fi
}

while [[ $1 ]]
do
	case $1 in
		-v|--version)
			echo "Source Mage GNU/Linux mkinitrd v0.1"
			usage
			exit 0
		;;
		--enable-raid)
			FORCE_RAID=true
		;;
		--enable-lvm)
			FORCE_LVM=true
		;;
		--disable-raid)
			FORCE_RAID=false
		;;
		--disable-lvm)
			FORCE_LVM=false
		;;
		-f|--force)
			REMOVE_OLD_INITRD=true
		;;
		--ignore-missing)
			BREAK_ON_MISSING=false
		;;
		-m|--with-module)
			MODULES="${MODULES} ${2}"
			shift
		;;
		-o|--output)
			INITRD_FILE="${2}"
			shift
		;;
		2.[46]*)
			KVERSION=$1
		;;
		*)
			echo "Caught a second option that looks like the file"
			usage
			exit 1
		;;

	esac &&
	shift
done

depmod -a $KVERSION
check_raid
check_lvm
fill_modules
(
	default_parts
	dev_parts
	dir_parts
	module_parts
	klibc_parts
	raid_parts
	lvm_parts
	user_parts	
) > /tmp/initrd.lst
(
	linuxrc_pre
	linuxrc_raid
	linuxrc_lvm
	linuxrc_pre_kinit
	linuxrc_post
) > /tmp/linuxrc
if ! [[ -x /lib/modules/$KVERSION/build/usr/gen_init_cpio ]]
then
  echo "Bah!!! can't find the gen_init_cpio file is your kernel built?"
  usage
  exit -1
fi &&
if [[ -f $INITRD_FILE && ! $REMOVE_OLD_INITRD ]]
then
	echo "Refusing to blow away original initrd"
	usage
	exit -1
fi &&
/lib/modules/$KVERSION/build/usr/gen_init_cpio /tmp/initrd.lst | gzip -c > $INITRD_FILE

#---------------------------------------------------------------------
##=back
##
##=head1 LICENSE
##
## This software is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 2 of the License, or
## (at your option) any later version.
##
## This software is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with this software; if not, write to the Free Software
## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
##
#---------------------------------------------------------------------
