#!/usr/bin/perl # -*- Mode: cperl -*- # Copyright (C) 2002 by Chmouel Boudjnah # Redistribution of this file is permitted under the terms of the GNU # Public License (GPL) # # Detect vga resolution we want. # # add better detection thanks to Olivier Blin idea to use argument from # make_boot_splash. use strict; my (%main, %entry, $vga, $initrd); if ($ARGV[0]) { $initrd = $ARGV[0]; $initrd =~ s,.*/,, } else { $vga = detect_from_cmdline(cat_('/proc/cmdline')); undef $vga if $vga =~ /x/; #lilo cmdline can't convert } detect_from_loader() if !$vga; if ($vga) { chomp $vga; $vga =~ s/vga=//; $vga = convert_vgamode(); } print $vga, "\n" if $vga; sub detect_from_cmdline {return (grep /vga=\d+/, split("[ \t]", shift))[0];} sub detect_from_loader { my $loader = `detectloader -q`;chomp $loader; if ($loader =~ m/lilo/i ) { parse_lilo_conf(); } elsif ($loader =~ /grub/i ) { parse_grub_conf(); } if ($initrd) { $vga = $main{initrd}{$initrd} } $vga ||= $entry{$main{default}}{vga}; $vga ||= $main{vga} } sub parse_grub_conf { my ($title); my $cnt = 0; my $grub_conf = "/boot/grub/menu.lst"; my $vga; return if not -f $grub_conf; open F, $grub_conf or die "Can't open $grub_conf\n"; while () { next if /^\s*#/; $main{default} = $1 if /^default (\d+)/; if (/^title\s+(.*)/) { $vga=0; $title=$1; $entry{$title}{cnt} = $cnt; $main{default} = $title if $entry{$title}{cnt} eq $main{default}; $cnt++; } if (m/kernel\s+\(.*\)[^\s]+/) { $vga = $1 if /vga=(\w*)/; $entry{$title}{vga} = $vga if ($title and $vga); } if (m,initrd\s+\(.*\)(?:.*/)?([^\s]+),){ $entry{$title}{initrd} = $1; $main{initrd}{$1} = $entry{$title}{vga} } } close F; } sub parse_lilo_conf { my $lilo_conf="/etc/lilo.conf"; my ($vga, $label, $loc_initrd); return if not -f $lilo_conf; open F, $lilo_conf or die "Can't open $lilo_conf\n"; while () { next if /^\s*#/; $main{default} = $1 if m/^default=(.*)/; $main{vga} = $1 if m/^vga=(.*)/; $vga = $1 if /vga=(.*)/; $label = $1 if /label=(.*)/; $loc_initrd = $1 if m,initrd=(?:.*/)?(.*),; $entry{$label}{vga} = $vga if ($label && $vga); if (/image/) { if ($loc_initrd && $label && $vga) { $entry{$label}{initrd} = $loc_initrd; if (!$main{initrd}{$loc_initrd} || $main{default} eq $label) { $main{initrd}{$loc_initrd} = $vga } } undef $vga,$label; } } if ($loc_initrd && $label && $vga) { $entry{$label}{initrd} = $loc_initrd; if (!$main{initrd}{$loc_initrd} || $main{default} eq $label) { $main{initrd}{$loc_initrd} = $vga } } close F; } sub convert_vgamode { my $v; #From drakx Xconfigurator_consts.pm my %vgamodes = ( '640xx8' => [ '769', '0x301' ], '640x480x8' => [ '769', '0x301' ], '800xx8' => [ '771', '0x303' ], '800x600x8' => [ '771', '0x303' ], '1024xx8' => [ '773', '0x305' ], '1024x768x8' => [ '773', '0x305' ], '1280xx8' => [ '775', '0x307' ], '1280x1024x8' => [ '775', '0x307' ], '1600xx8' => [ '777', '0x309' ], '1600x1200x8' => [ '777', '0x309' ], '640xx15' => [ '784', '0x310' ], '640x480x15' => [ '784', '0x310' ], '800xx15' => [ '787', '0x313' ], '800x600x15' => [ '787', '0x313' ], '1024xx15' => [ '790', '0x316' ], '1024x768x15' => [ '790', '0x316' ], '1280xx15' => [ '793', '0x319' ], '1280x1024x15' => [ '793', '0x319' ], '1600xx15' => [ '796', '0x31C' ], '1600x1200x15' => [ '796', '0x31C' ], '640xx16' => [ '785', '0x311' ], '640x480x16' => [ '785', '0x311' ], '800xx16' => [ '788', '0x314' ], '800x600x16' => [ '788', '0x314' ], '1024xx16' => [ '791', '0x317' ], '1024x768x16' => [ '791', '0x317' ], '1280xx16' => [ '794', '0x31A' ], '1280x1024x16' => [ '794', '0x31A' ], '1600xx16' => [ '797', '0x31D' ], '1600x1200x16' => [ '797', '0x31D' ], #- '640xx24' => 786, #- there is a problem with these resolutions since the BIOS may take 24 or 32 planes. #- '640x480x24' => 786, #- '800xx24' => 789, #- '800x600x24' => 789, #- '1024xx24' => 792, #- '1024x768x24' => 792, #- '1280xx24' => 795, #- '1280x1024x24' => 795, ); foreach my $k (keys %vgamodes) { $v = $k if grep { $_ eq $vga } @{$vgamodes{$k}} } undef $vga if not $v;return $v; } sub cat_ { local *F; open F, $_[0] or $_[1] ? die "cat of file $_[0] failed: $!\n" : return; my @l = ; wantarray ? @l : join '', @l }