X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=nokia-lintian%2Flib%2FLintian%2FCollect%2FBinary.pm;fp=nokia-lintian%2Flib%2FLintian%2FCollect%2FBinary.pm;h=0000000000000000000000000000000000000000;hb=bf47c4c43f1f5f4986e85b74fc82b32048aeb846;hp=319b45ea0063e344f8bba90da02df300397b2cdd;hpb=19fdce4b743853cee27edb892096cf64295c2874;p=maemian diff --git a/nokia-lintian/lib/Lintian/Collect/Binary.pm b/nokia-lintian/lib/Lintian/Collect/Binary.pm deleted file mode 100644 index 319b45e..0000000 --- a/nokia-lintian/lib/Lintian/Collect/Binary.pm +++ /dev/null @@ -1,312 +0,0 @@ -# -*- perl -*- -# Lintian::Collect::Binary -- interface to binary package data collection - -# Copyright (C) 2008 Russ Allbery -# Copyright (C) 2008 Frank Lichtenheld -# -# This program is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# This program 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 General Public License for -# more details. -# -# You should have received a copy of the GNU General Public License along with -# this program. If not, see . - -package Lintian::Collect::Binary; -use strict; - -use Lintian::Collect; -use Util; - -our @ISA = qw(Lintian::Collect); - -# Initialize a new binary package collect object. Takes the package name, -# which is currently unused. -sub new { - my ($class, $pkg) = @_; - my $self = {}; - bless($self, $class); - return $self; -} - -# Returns whether the package is a native package according to -# its version number -sub native { - my ($self) = @_; - return $self->{native} if exists $self->{native}; - my $version = $self->field('version'); - $self->{native} = ($version !~ m/-/); -} - -# Returns the information from the indices -# FIXME: should maybe return an object -sub index { - my ($self) = @_; - return $self->{index} if exists $self->{index}; - - my (@idx, %dir_counts); - open my $idx, '<', "index" - or fail("cannot open index file index: $!"); - open my $num_idx, '<', "index-owner-id" - or fail("cannot open index file index-owner-id: $!"); - while (<$idx>) { - chomp; - - my (%file, $perm, $owner, $name); - ($perm,$owner,$file{size},$file{date},$file{time},$name) = - split(' ', $_, 6); - $file{operm} = perm2oct($perm); - $file{type} = substr $perm, 0, 1; - - my $numeric = <$num_idx>; - chomp $numeric; - fail("cannot read index file index-owner-id") unless defined $numeric; - my ($owner_id, $name_chk) = (split(' ', $numeric, 6))[1, 5]; - fail("mismatching contents of index files: $name $name_chk") - if $name ne $name_chk; - - ($file{owner}, $file{group}) = split '/', $owner, 2; - ($file{uid}, $file{gid}) = split '/', $owner_id, 2; - - $name =~ s,^\./,,; - if ($name =~ s/ link to (.*)//) { - $file{type} = 'h'; - $file{link} = $1; - $file{link} =~ s,^\./,,; - } elsif ($file{type} eq 'l') { - ($name, $file{link}) = split ' -> ', $name, 2; - } - $file{name} = $name; - - # count directory contents: - $dir_counts{$name} ||= 0 if $file{type} eq 'd'; - $dir_counts{$1} = ($dir_counts{$1} || 0) + 1 - if $name =~ m,^(.+/)[^/]+/?$,; - - push @idx, \%file; - } - foreach my $file (@idx) { - if ($dir_counts{$file->{name}}) { - $file->{count} = $dir_counts{$file->{name}}; - } - } - $self->{index} = \@idx; - - return $self->{index}; -} - -# Returns the information from collect/file-info -sub file_info { - my ($self) = @_; - return $self->{file_info} if exists $self->{file_info}; - - my %file_info; - open(my $idx, '<', "file-info") - or fail("cannot open file-info: $!"); - while (<$idx>) { - chomp; - - m/^(.+?):\s+(.*)$/o - or fail("an error in the file pkg is preventing lintian from checking this package: $_"); - my ($file, $info) = ($1,$2); - - $file =~ s,^./,,o; - $file =~ s,/+$,,o; - - $file_info{$file} = $info; - } - close $idx; - $self->{file_info} = \%file_info; - - return $self->{file_info}; -} - -# Returns the information from collect/objdump-info -sub objdump_info { - my ($self) = @_; - return $self->{objdump_info} if exists $self->{objdump_info}; - - my %objdump_info; - my ($dynsyms, $file); - open(my $idx, '<', "objdump-info") - or fail("cannot open objdump-info: $!"); - while (<$idx>) { - chomp; - - next if m/^\s*$/o; - - if (m,^-- \./(\S+)\s*$,o) { - if ($file) { - $objdump_info{$file->{name}} = $file; - } - $file = { name => $1 }; - $dynsyms = 0; - } elsif ($dynsyms) { - # The .*? near the end is added because a number of optional fields - # might be printed. The symbol name should be the last word. - if (m/^[0-9a-fA-F]+.{6}\w\w?\s+(\S+)\s+[0-9a-zA-Z]+\s+(\S+)\s+(\S+)$/){ - my ($foo, $sec, $sym) = ($1, $2, $3); - push @{$file->{SYMBOLS}}, [ $foo, $sec, $sym ]; - } - } else { - if (m/^\s*NEEDED\s*(\S+)/o) { - push @{$file->{NEEDED}}, $1; - } elsif (m/^\s*RPATH\s*(\S+)/o) { - foreach (split m/:/, $1) { - $file->{RPATH}{$_}++; - } - } elsif (m/^\s*SONAME\s*(\S+)/o) { - push @{$file->{SONAME}}, $1; - } elsif (m/^\s*\d+\s+\.comment\s+/o) { - $file->{COMMENT_SECTION} = 1; - } elsif (m/^\s*\d+\s+\.note\s+/o) { - $file->{NOTE_SECTION} = 1; - } elsif (m/^DYNAMIC SYMBOL TABLE:/) { - $dynsyms = 1; - } elsif (m/^objdump: (.*?): File format not recognized$/) { - push @{$file->{NOTES}}, "File format not recognized"; - } elsif (m/^objdump: \.(.*?): Packed with UPX$/) { - push @{$file->{NOTES}}, "Packed with UPX"; - } elsif (m/objdump: \.(.*?): Invalid operation$/) { - # Don't anchor this regex since it can be interspersed with other - # output and hence not on the beginning of a line. - push @{$file->{NOTES}}, "Invalid operation"; - } elsif (m/CXXABI/) { - $file->{CXXABI} = 1; - } elsif (m%Requesting program interpreter:\s+/lib/klibc-\S+\.so%) { - $file->{KLIBC} = 1; - } - } - } - if ($file) { - $objdump_info{$file->{name}} = $file; - } - $self->{objdump_info} = \%objdump_info; - - return $self->{objdump_info}; -} - -=head1 NAME - -Lintian::Collect::Binary - Lintian interface to binary package data collection - -=head1 SYNOPSIS - - my $collect = Lintian::Collect->new($name, $type); - if ($collect->native) { - print "Package is native\n"; - } - -=head1 DESCRIPTION - -Lintian::Collect::Binary provides an interface to package data for binary -packages. It implements data collection methods specific to binary -packages. - -This module is in its infancy. Most of Lintian still reads all data from -files in the laboratory whenever that data is needed and generates that -data via collect scripts. The goal is to eventually access all data about -source packages via this module so that the module can cache data where -appropriate and possibly retire collect scripts in favor of caching that -data in memory. - -=head1 CLASS METHODS - -=item new(PACKAGE) - -Creates a new Lintian::Collect::Binary object. Currently, PACKAGE is -ignored. Normally, this method should not be called directly, only via -the Lintian::Collect constructor. - -=back - -=head1 INSTANCE METHODS - -In addition to the instance methods listed below, all instance methods -documented in the Lintian::Collect module are also available. - -=over 4 - -=item native() - -Returns true if the binary package is native and false otherwise. -Nativeness will be judged by its version number. - -=item index() - -Returns a reference to an array of hash references with content -information about the binary package. Each hash may have the -following keys: - -=over 4 - -=item name - -Name of the index entry without leading slash. - -=item owner - -=item group - -=item uid - -=item gid - -The former two are in string form and may depend on the local system, -the latter two are the original numerical values as saved by tar. - -=item date - -Format "YYYY-MM-DD". - -=item time - -Format "hh:mm". - -=item type - -Entry type as one character. - -=item operm - -Entry permissions as octal number. - -=item size - -Entry size in bytes. Note that tar(1) lists the size of directories as -0 (so this is what you will get) contrary to what ls(1) does. - -=item link - -If the entry is either a hardlink or symlink, contains the target of the -link. - -=item count - -If the entry is a directory, contains the number of other entries this -directory contains. - -=back - -=head1 AUTHOR - -Originally written by Frank Lichtenheld for Lintian. - -=head1 SEE ALSO - -lintian(1), Lintian::Collect(3) - -=cut - -1; - -# Local Variables: -# indent-tabs-mode: nil -# cperl-indent-level: 4 -# End: -# vim: syntax=perl sw=4 sts=4 ts=4 et shiftround