Hello community, here is the log from the commit of package FirmwareUpdateKit checked in at Mon Oct 6 18:48:11 CEST 2008. -------- --- arch/i386/FirmwareUpdateKit/FirmwareUpdateKit.changes 2008-08-25 10:50:32.000000000 +0200 +++ /mounts/work_src_done/STABLE/FirmwareUpdateKit/FirmwareUpdateKit.changes 2008-10-06 17:58:34.000000000 +0200 @@ -1,0 +2,6 @@ +Mon Oct 6 17:56:49 CEST 2008 - snwint@suse.de + +- added '--image' and '--run' options +- now really accepts more than one file as arg + +------------------------------------------------------------------- calling whatdependson for head-i586 Old: ---- FirmwareUpdateKit-1.0.tar.bz2 New: ---- FirmwareUpdateKit-1.1.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ FirmwareUpdateKit.spec ++++++ --- /var/tmp/diff_new_pack.qH9261/_old 2008-10-06 18:47:51.000000000 +0200 +++ /var/tmp/diff_new_pack.qH9261/_new 2008-10-06 18:47:51.000000000 +0200 @@ -1,5 +1,5 @@ # -# spec file for package FirmwareUpdateKit (Version 1.0) +# spec file for package FirmwareUpdateKit (Version 1.1) # # Copyright (c) 2008 SUSE LINUX Products GmbH, Nuernberg, Germany. # Copyright (c) 2008 Steffen Winterfeldt @@ -25,7 +25,7 @@ Requires: syslinux master-boot-code genisoimage dosfstools mtools AutoReqProv: on Summary: Assist with DOS-based firmware updates -Version: 1.0 +Version: 1.1 Release: 1 Obsoletes: dosbootdisk Provides: dosbootdisk @@ -63,5 +63,8 @@ %doc doc/* %changelog +* Mon Oct 06 2008 snwint@suse.de +- added '--image' and '--run' options +- now really accepts more than one file as arg * Mon Jun 16 2008 snwint@suse.de - initial version ++++++ FirmwareUpdateKit-1.0.tar.bz2 -> FirmwareUpdateKit-1.1.tar.bz2 ++++++ diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/FirmwareUpdateKit-1.0/fuk new/FirmwareUpdateKit-1.1/fuk --- old/FirmwareUpdateKit-1.0/fuk 2008-06-16 14:54:43.000000000 +0200 +++ new/FirmwareUpdateKit-1.1/fuk 2008-10-06 17:53:30.000000000 +0200 @@ -1,7 +1,7 @@ #! /usr/bin/perl # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# FirmwareUpdateKit version 1.0 +# FirmwareUpdateKit version 1.1 # # Create bootable DOS system to assist with DOS-based firmware updates. # @@ -12,7 +12,7 @@ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# package HDImage version 1.2 +# package HDImage version 1.7 # # Create disk image with partition table and a single partition. # @@ -26,7 +26,7 @@ package HDImage; use strict 'vars'; - use integer; + use bigint; sub new { @@ -44,13 +44,6 @@ $self->{verbose} = shift; } - sub no_pt - { - my $self = shift; - - $self->{no_pt} = shift; - } - sub mbr { my $self = shift; @@ -122,7 +115,7 @@ $self->{s} = $s; if($c == 0 && $self->{size}) { - $c = ($self->{size} + $h * $s) / $h / $s; + $c = ($self->{size} + $h * $s - 1) / $h / $s; } if($c > 0) { @@ -136,17 +129,24 @@ sub size { my $self = shift; - my $size = shift; + my $size = $self->parse_size(shift); $self->{size} = $size; if($self->{h} && $self->{s}) { - $self->{c} = ($self->{size} + $self->{h} * $self->{s}) / $self->{h} / $self->{s}; + $self->{c} = ($self->{size} + $self->{h} * $self->{s} - 1) / $self->{h} / $self->{s}; $self->{size} = $self->{c} * $self->{h} * $self->{s}; } return $self->{size}; } + sub extra_size + { + my $self = shift; + + $self->{extra_size} = $self->parse_size(shift); + } + sub type { my $self = shift; @@ -154,6 +154,13 @@ $self->{type} = shift; } + sub fit_size + { + my $self = shift; + + $self->{fit_size} = shift; + } + sub label { my $self = shift; @@ -171,11 +178,18 @@ sub add_files { my $self = shift; + my $s; local $_; for (@_) { if(-f || -d) { push @{$self->{files}}, $_; + if($self->{fit_size}) { + $s = `du --apparent-size -k -s $_ 2>/dev/null`; + $s =~ s/\s.*$//; + $s <<= 1; + $self->{fit_size_acc} += $s; + } } else { print STDERR "$_: no such file or directory\n"; @@ -201,19 +215,39 @@ return $t; } + sub partition_ofs + { + my $self = shift; + + $self->{part_ofs} = $self->parse_size(shift) if @_; + + return defined($self->{part_ofs}) ? $self->{part_ofs} : $self->{s}; + } + sub write { my $self = shift; local $_; - return unless @_; + return undef unless @_; my $file = shift; + $self->{image_name} = $file; + + $self->chs(0, 255, 63) unless $self->{s}; + + $self->size($self->{size} + $self->{fit_size_acc}) if $self->{fit_size_acc}; + + my $p_size = $self->{size} - $self->partition_ofs - $self->{extra_size}; + return undef if $p_size < 0; + my $c = $self->{c}; my $h = $self->{h}; my $s = $self->{s}; my $type = $self->{type}; - my $pt_size = $self->{no_pt} ? 0 : $s; + + my $pt_size = $self->partition_ofs; + my $p_end = $p_size + $pt_size - 1; $type = 0x83 unless defined $type; @@ -221,100 +255,151 @@ print "- writing mbr\n" if $self->{verbose} && $self->{mbr}; - $c = 1024 if $c > 1024; + $c = 1023 if $c > 1023; - if($pt_size) { - open W1, ">$file"; + my $s_0 = $pt_size % $s + 1; + my $h_0 = ($pt_size / $s) % $h; + my $c_0 = $pt_size / ($s * $h); + $c_0 = 1023 if $c_0 > 1023; + + my $s_1 = $p_end % $s + 1; + my $h_1 = ($p_end / $s) % $h; + my $c_1 = $p_end / ($s * $h); + $c_1 = 1023 if $c_1 > 1023; + + my $p_0 = $pt_size; + $p_0 = 0xffffffff if $p_0 > 0xffffffff; + my $p_1 = $p_size; + $p_1 = 0xffffffff if $p_1 > 0xffffffff; + open W1, ">$file"; + if($pt_size) { my $mbr = pack ( - "Z446CCvCCCCVVZ48v", + "Z446CCCCCCCCVVZ48v", $self->{mbr}, # boot code, if any 0x80, # bootflag - $h > 1 ? 1 : 0, # head 1st - $h > 1 ? 1 : 0x101, # cyl/sector 1st + $h_0, # head start + (($c_0 >> 8) << 6) + $s_0, # cyl/sector start, low + $c_0 & 0xff, # cyl/sector start, hi $type, # partition type - $h - 1, # head last - ((($c - 1) >> 8) << 6) + $s, # cyl/sector last, byte 0 - ($c - 1) & 0xff, # cyl/sector last, byte 1 - $pt_size, # partition offset - $self->{size} - $pt_size, # partition size + $h_1, # head last + (($c_1 >> 8) << 6) + $s_1, # cyl/sector last, low + $c_1 & 0xff, # cyl/sector last, hi + $p_0, # partition offset + $p_1, # partition size "", 0xaa55 ); syswrite W1, $mbr; - sysseek W1, $pt_size * 512 - 1, 0; - syswrite W1, "\x00", 1; - - close W1; + if($pt_size > 1) { + sysseek W1, $pt_size * 512 - 1, 0; + syswrite W1, "\x00", 1; + } } + close W1; - if($self->{fs}) { - my $f = $pt_size ? tmp_file() : $file; - open W1, ">$f"; - seek W1, ($self->{size} - $pt_size) * 512 - 1, 0; - syswrite W1, "\x00", 1; - close W1; - if($self->{fs} eq 'fat') { - my $x = " -n '$self->{label}'" if $self->{label} ne ""; - system "mkfs.vfat -h $pt_size$x $f >/dev/null"; - - my ($fat, $boot); - - # mkfs.vfat is a bit stupid; fix FAT superblock - open W1, "+<$f"; - sysseek W1, 0x18, 0; - syswrite W1, pack("vv", $s, $h); - sysseek W1, 0x24, 0; - syswrite W1, "\xff"; - sysseek W1, 0x36, 0; - sysread W1, $fat, 5; - # FAT32: at ofs 0x52 + if($p_size) { + if($self->{fs}) { + my $f = $pt_size ? tmp_file() : $file; + open W1, ">$f"; + sysseek W1, $p_size * 512 - 1, 0; + syswrite W1, "\x00", 1; close W1; + if($self->{fs} eq 'fat') { + my $x = " -n '$self->{label}'" if $self->{label} ne ""; + system "mkfs.vfat -h $pt_size$x $f >/dev/null"; - $boot = $self->{boot_fat12} if $fat eq "FAT12"; - $boot = $self->{boot_fat16} if $fat eq "FAT16"; + my ($fat, $boot); - # write boot block ex bpb - if($boot) { - print "- writing \L$fat\E boot block\n" if $self->{verbose}; + # mkfs.vfat is a bit stupid; fix FAT superblock open W1, "+<$f"; - syswrite W1, $boot, 11; - sysseek W1, 0x3e, 0; - syswrite W1, substr($boot, 0x3e); + sysseek W1, 0x18, 0; + syswrite W1, pack("vv", $s, $h); + sysseek W1, 0x24, 0; + syswrite W1, "\xff"; + sysseek W1, 0x36, 0; + sysread W1, $fat, 5; + # FAT32: at ofs 0x52 close W1; + + $boot = $self->{boot_fat12} if $fat eq "FAT12"; + $boot = $self->{boot_fat16} if $fat eq "FAT16"; + + # write boot block ex bpb + if($boot) { + print "- writing \L$fat\E boot block\n" if $self->{verbose}; + open W1, "+<$f"; + syswrite W1, $boot, 11; + sysseek W1, 0x3e, 0; + syswrite W1, substr($boot, 0x3e); + close W1; + } + + if($self->{files}) { + print "- copying:\n " . join("\n ", @{$self->{files}}) . "\n" if $self->{verbose}; + system "mcopy -D o -s -i $f " . join(" ", @{$self->{files}}) . " ::"; + } + } + elsif($self->{fs} eq 'ext2' || $self->{fs} eq 'ext3') { + my $x = " -L '$self->{label}'" if $self->{label} ne ""; + system "mkfs.$self->{fs} -q -m 0 -F$x $f"; + system "tune2fs -c 0 -i 0 $f >/dev/null 2>&1"; + } + elsif($self->{fs} eq 'reiserfs') { + my $x = " -l '$self->{label}'" if $self->{label} ne ""; + system "mkfs.reiserfs -q -ff$x $f"; + } + elsif($self->{fs} eq 'xfs') { + my $x = " -L '$self->{label}'" if $self->{label} ne ""; + system "mkfs.xfs -q$x $f"; + } + else { + print STDERR "warning: $self->{fs}: unsupported file system\n"; } - if($self->{files}) { - print "- copying:\n " . join("\n ", @{$self->{files}}) . "\n" if $self->{verbose}; - system "mcopy -D o -s -i $f " . join(" ", @{$self->{files}}) . " ::"; + if($pt_size) { + system "cat $f >>$file"; + unlink $f; } } - elsif($self->{fs} eq 'ext2' || $self->{fs} eq 'ext3') { - my $x = " -L '$self->{label}'" if $self->{label} ne ""; - system "mkfs.$self->{fs} -q -m 0 -F$x $f"; - system "tune2fs -c 0 -i 0 $f >/dev/null 2>&1"; - } - elsif($self->{fs} eq 'reiserfs') { - my $x = " -l '$self->{label}'" if $self->{label} ne ""; - system "mkfs.reiserfs -q -ff$x $f"; - } - elsif($self->{fs} eq 'xfs') { - my $x = " -L '$self->{label}'" if $self->{label} ne ""; - system "mkfs.xfs -q$x $f"; - } else { - print STDERR "warning: $self->{fs}: unsupported file system\n"; + open W1, "+<$file"; + sysseek W1, ($self->{size} - $self->{extra_size}) * 512 - 1, 0; + syswrite W1, "\x00", 1; + close W1; } - - system "cat $f >>$file" if $pt_size; } - else { + + if($self->{extra_size}) { open W1, "+<$file"; - sysseek W1, $self->{size} * 512 - 1, 0; + sysseek W1, $self->{extra_size} * 512 - 1, 2; syswrite W1, "\x00", 1; close W1; } } + + sub parse_size + { + my $self = shift; + my $s = shift; + my $bs = 0; + + if($s =~ s/(b|k|M|G|T|P|E)$//) { + $bs = 0 if $1 eq 'b'; + $bs = 1 if $1 eq 'k'; + $bs = 11 if $1 eq 'M'; + $bs = 21 if $1 eq 'G'; + $bs = 31 if $1 eq 'T'; + $bs = 41 if $1 eq 'P'; + $bs = 51 if $1 eq 'E'; + } + + # note: 'bigint' works a bit differently when converting strings to numbers + + $s = $s << $bs; + + return $s + 1 == $s ? undef : $s; + } } @@ -335,12 +420,14 @@ 'verbose+' => \$opt_verbose, 'iso=s' => \$opt_iso, 'floppy=s' => \$opt_floppy, + 'image=s' => \$opt_image, 'lilo' => \$opt_lilo, 'grub' => \$opt_grub, 'title=s' => \$opt_title, + 'run=s' => \$opt_run, ) || usage 1; -usage 1 if @ARGV != 1; +usage 1 if !@ARGV; @files = @ARGV; @@ -352,28 +439,20 @@ open F, ">$fuk_dir/config.sys"; close F; open F, ">$fuk_dir/autoexec.bat"; -print F "CLS\n"; +print F "$opt_run\n" if $opt_run; close F; -# leave some free space (in sectors) -$file_size = 16*2; - -for ((@files, "/usr/share/FirmwareUpdateKit/command.com", "/usr/share/FirmwareUpdateKit/kernel.sys")) { - die "$_: no such file\n" unless -f; - - $file_size += (((-s) + 0x3fff) & ~0x3fff) >> 9; -} - $hdimage = HDImage::new; $hdimage->verbose($opt_verbose); if($opt_floppy) { $hdimage->chs(80, 2, 18); - $hdimage->no_pt(1); + $hdimage->partition_ofs(0); } else { $hdimage->chs(0, 4, 16); - $hdimage->size($file_size); + $hdimage->size(200); # leave some free space (in sectors) + $hdimage->fit_size(1); } $hdimage->type(1); @@ -392,6 +471,11 @@ exit 0; } +elsif($opt_image) { + $hdimage->write("$opt_image"); + + exit 0; +} else { $hdimage->write("$fuk_dir/fwupdate.img"); } @@ -472,14 +556,14 @@ exit 0; } -print "Warning: nothing done.\nPlease use one of these options: --grub, --lilo, --iso, --floppy.\n"; +print "Warning: nothing done.\nPlease use one of these options: --grub, --lilo, --iso, --floppy or --image.\n"; sub usage { print <<" usage"; Usage: fuk [OPTIONS] FILES -FirmwareUpdateKit version 1.0. +FirmwareUpdateKit version 1.1. Create bootable DOS system and add FILES to it. The main purpose is to assist with DOS-based firmware updates. @@ -490,6 +574,8 @@ --title TITLE Use TITLE as label for boot menu entry. --iso FILE Create bootable CD. --floppy FILE Create bootable (1440 kB) floppy disk. + --image FILE Create bootable harddisk. + --run COMMAND Run COMMAND after booting DOS. --verbose Be more verbose. usage ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Remember to have fun... -- To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-commit+help@opensuse.org