On Thursday 24 March 2005 04:31, Sean Dague wrote:
> On Tue, Mar 22, 2005 at 04:49:45PM +0100, Erich Focht wrote:
> > The systemconfigurator kernel version recognition fails This is due to
> > the VERY simple way of detection of the kernel version in
> > /usr/lib/systemconfig/Initrd/Generic.pm. For the RHEL3-ia64 kernel the
> > the string 1.1.3 was recognized as version, which is obviously wrong.
...
> > -        if(/[^\/\-]([123]\.\d+\.[\w\-\.]+)/) {
> > +        if(/Linux version[^\/\-]([123]\.\d+\.[\w\-\.]+)/) {
...
> 
> This only works on Red Hat Kernels, for whatever reason, so you'll need a
> more generic patch before it should be included.

Hmmm, actually it only works with vmlinux-* kernels on ia32, not with
the bzImage-alike. On ia64 it is fine with any kernel I tried.

Attached is a more involved version recognition including the bzImage
kernels on ia32. Also I attached a perl program which can be used to
check whether kernels are recognized or not. Simply call
./sc_kernel_version.pl <your_favourite_kernel_file>
If it fails with any kernel, please tell me.

Regards,
Erich

Attachment: sc_kernel_version.pl
Description: Perl program

--- usr/lib/systemconfig/Initrd/Generic.pm.orig	2005-03-21 14:54:43.094022920 +0100
+++ usr/lib/systemconfig/Initrd/Generic.pm	2005-03-21 14:56:24.169657088 +0100
@@ -47,12 +47,24 @@
         
     while(<IN>) {
         # When Linux Kernel 4.0pre1 comes out, we'll have to change this
-        if(/[^\/\-]([123]\.\d+\.[\w\-\.]+)/) {
+        if(/Linux version ([123]\.\d+\.[\w\-\.]+)/) {
             verbose("Found version '$1' at line # $.");
             $version = $1;
             last;
         }
     }
+    if ($version eq "0.0.0") {
+	# trying ia32 bzImage kind of thing
+	my $buffer;
+	if (seek(IN, 0x202, 0) && (read(IN, $buffer, 4) == 4) 
+	    && (substr($buffer,0,4) eq "HdrS")
+	    && seek(IN, 0x20e, 0) && (read(IN, $buffer, 2) == 2)) {
+	    my $ofs = 0x200 + unpack("S", substr($buffer,0,2));
+	    if (seek(IN, $ofs, 0) && (read(IN, $buffer, 80) == 80)) {
+		$version = substr($buffer, 0, index($buffer, " "));
+	    }
+	}
+    }
     close(IN); 
 
     return $version;

Reply via email to