diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/MDK/ISOcheck.pm | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/lib/MDK/ISOcheck.pm b/lib/MDK/ISOcheck.pm new file mode 100644 index 0000000..c560976 --- /dev/null +++ b/lib/MDK/ISOcheck.pm @@ -0,0 +1,160 @@ +# This file is part of the Mageia project +# +# Copyright (C) 2011 Damien Lallement <dams@mageia.org> +# (C) 2011 Romain d'Alverny <rda@mageia.org> +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public License +# along with this library; see the file COPYING.LIB. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. +# + +=head1 NAME + + MDK::Isocheck - miscellaneous functions + +=head1 SYNOPSIS + + use Isocheck; + +=head1 EXPORTS + +=over + +=item parse_image_file_name(STRING) + +return a populated hash if param is a valid image file name +(see https://wiki.mageia.org/en/Product_naming ). + +return empty hash if invalid. + +=back + +=cut + +package MDK::ISOcheck; + +use strict; +use warnings; + +our $VERSION = '0.2.0'; + +use base 'Exporter'; + +our @EXPORT = qw(parse_image_file_name is_hybrid hybrid1 hybrid2 hybrid3); + +sub parse_image_file_name { + my ($name) = @_; + + return unless $name =~ m/^ + ( + (\w+) # name + - + (\d+) # version + (?:-((?:nightly|alpha|beta|RC)\d*))? # release + (?:-(.+))? # variant + - + (i586|x86_64|dual) # arch + (?:-(CD|DVD|BR))? # medium + (?:-(build_\w+))? # build + ) + \. + (\w+) # extension + $/x; + + my %info = ( + full => $1, + name => $2, + version => $3, + defined $4 ? (release => $4) : (), + defined $5 ? (variant => $5) : (), + arch => $6, + defined $7 ? (medium => $7) : (), + defined $8 ? (build => $8) : (), + ext => $9 + ); + + return %info; +} + +# Verification if the ISO is hybrid +sub is_hybrid { + my ($img, $full) = @_; + + open(my $iso, $img); + my $hybrid = hybrid1($iso); + $hybrid &= hybrid2($iso); + $hybrid &= hybrid3($iso); + if ($full) { + # system "dd if=$img of=/dev/my-pendrive bs=8"; + } + close($iso); + + return $hybrid; +} + + +# Check the first 512 bytes of the iso +sub hybrid1 { + my ($iso) = @_; + my $buffer; + my $hybrid; + + foreach (0 .. 512) { + read($iso, $buffer, 1); + if ($buffer ne '\x00') { + $hybrid = 1; + } + } + + return $hybrid; +} + +#Check the 0x1fe & 0x1ff bytes of the iso +sub hybrid2 { + my ($iso) = @_; + my $hybrid; + my $buffer; + my $byte = "\x55"; + + seek($iso, 0x1fe, 0); + read($iso, $buffer, 1); + if ($buffer eq $byte) { + read($iso, $buffer, 1); + $byte = "\xaa"; + if ($buffer eq $byte) { + $hybrid = 1; + } + } + + return $hybrid; +} + +# check from the 0x200 to the 0x8000 bytes +sub hybrid3 { + my ($iso) = @_; + my $hybrid = 1; + my $buffer; + + seek($iso, 0x200, 0); + foreach (0x200 .. 0x8000) { + read($iso, $buffer, 1); + if ($buffer eq '\x00') { + $hybrid = 0; + } + } + + return $hybrid; +} + +1;
\ No newline at end of file |