On Sun, Oct 16, 2005 at 08:18:02AM +0200, Sven Luther wrote:
> On Sat, Oct 15, 2005 at 10:16:48PM +0200, Mattia Dongili wrote:
> > On Sat, Oct 15, 2005 at 08:36:11PM +0200, Sven Luther wrote:
> > > I would be extremely grateful if someone could take the time and implement
> > > this ASAP, as we need this to upload 2.6.13-2 and finish the support.
> >
> > It's not entirely clear to me but the following might help. I'm missing
> > some bits but if you can give me more insight I'll fix the wrong stuff
> > (sorry I never played seriously with initrd :) )
>
> Thanks Mattia, i am extremely thankful for your help. Let's me go over this
> proposed code with you to see if i understood well, and add places where it
> did not work out.
>
> > #!/usr/bin/perl
> > use strict;
> >
> > chomp (my $unamedashr = `uname -r`);
>
> We get the kernel version.
>
> > #
> > # is lexical comparison enough ?? <---------
> > # 2.6.13-rc1 will result in being greater than 2.6.13
>
> We need to use dpkg --compare-versions here, so probably :
>
> > #
> > my $ramdisk = '/usr/sbin/initramfs' if ($unamedashr lt "2.6.13");
>
> my $ramdisk = '/usr/sbin/mkinitramfs' if (system ("dpkg --compare-versions $unamedashr lt 2.6.13 1>/dev/null 2>&1") == 0)
right
> or something such, but i suppose that this line is precedded by a more generic :
> my $ramdisk = '/usr/sbin/mkinitrd', right ?
>
> > $ramdisk = "$1" if /ramdisk\s*=\s*(\S+)/ig;
>
> Does this one not cut at the first space ? I was told to use split instead, or
> something such.
Aaah! I see the point now. I was missing the usefullness of that
statement in fact!
Yes, the above regex assigns to $ramdisk only the first element in a
space separated list.
We might rework it this way (I'm borrowing your comments to the code)
then:
#!/usr/bin/perl
use strict;
# We get the kernel version.
chomp (my $unamedashr = `uname -r`);
# slurp the ramdisk option if present or default 'initramfs' for kernels
# prior 2.6.13 or default to 'mkinitrd' if none of the previous apply
my $ramdiskopts = (/ramdisk\s*=\s*(.+)/ig ? "$1" :
(system("dpkg --compare-versions $unamedashr lt 2.6.13 1>/dev/null 2>&1") == 0 ?
"/usr/sbin/initramfs" : "/usr/sbin/mkinitrd"));
# Ok, so we try -x and the call, over the space separadet ramdisk list.
# The remaining list won't have those items failing the tests.
my @ramdisklist =
grep {
-x and
system ("$_ --supported-host-version=$unamedashr 1>/dev/null 2>&1") == 0
}
split (/ /, $ramdiskopts);
# We define ramdisk to the first element of the list, and die if it is empty.
defined (my $ramdisk = shift @ramdisklist)
|| die "Dear user I failed to find an usable tool to create inital ram fs";
# And we do the ramdisk call, as normal.
my $ret = system("$ramdisk " .
($mkimage ? "-m '$mkimage' " : "") .
"-o $initrd_path.new $modules_base/$version");
> This sounds very nice and very near what i wanted to do, so again, i express
> my extreme thanks for you jumping in. So if the first line change is ok, and
> the ramdisk = "$1" ... thingy indeed pulls in space also, we have something
> which can be uploaded.
Take a look at the above corrected version, it should do what you want
now :)
Oh, I'm sorry for the code style, it could be made clearer by separating
some statements, but... you know perl is not for clean code ;)
--
mattia
:wq!
Attachment:
signature.asc
Description: Digital signature