#!/usr/bin/perl @ARGV == 1 or die "usage: remove-splash \n"; my $magic = 'BOOTSPL3'; my $buffer_size = 15; my ($initrd) = @ARGV; # FIXME it must have a clear way to do that in perl if (!system("/bin/zcat $initrd 2> /dev/null | /bin/cpio -t &> /dev/null")) { print STDERR "remove-boot-splash: initrd in initramfs format\n"; chomp(my $tmp_dir = `mktemp -d`); chdir $tmp_dir; system("/bin/zcat $initrd 2>/dev/null | /bin/cpio -id 2>/dev/null"); if (-d "$tmp_dir/usr/share/plymouth") { system("rm -fr $tmp_dir/usr/share/plymouth $tmp_dir/usr/lib/plymouth $tmp_dir/usr/lib/libply* $tmp_dir/lib/libply* $tmp_dir/bin/plymouthd $tmp_dir/bin/plymouth $tmp_dir/etc/splashy $tmp_dir/usr/share/splashy"); print STDERR "remove-boot-splash: removing plymouth from initrd\n"; system("/bin/find . -print | /bin/cpio --quiet -c -o 2> /dev/null | gzip -c > $initrd") } else { print STDERR "ERROR remove-boot-splash: plymouth not found in $initrd\n" } system("rm -rf $tmp_dir"); exit } open(my $F, "+< $initrd") or die "can't open $initrd: $!\n"; while (1) { my $got = read($F, my $buffer, $buffer_size); $got > length($magic) or last; my $index = index($buffer, $magic); if ($index >= 0) { my $offset = $index + tell($F) - $got; seek($F, $offset + 12, 0) && read($F, my $tmp, 4) or last; my $splash_size = unpack("V", $tmp) + 38; my $initrd_size = seek($F, 0, 2) && tell($F); if ($offset + $splash_size == $initrd_size) { truncate($F, $offset); exit 0; } else { warn "bootsplash found at offset $offset, but it is not at the end ($offset + $splash_size != $initrd_size)\n"; } } seek($F, -length($magic), 1); # handle the case BOOTSPL3 when overlaps between buffers } warn "bootsplash not found in $initrd\n";