[BACK]Return to find_depends CVS log [TXT][DIR] Up to [local] / openbsd / fill_chroot

File: [local] / openbsd / fill_chroot / find_depends (download)

Revision 1.1, Wed Dec 21 18:04:06 2005 UTC (18 years, 5 months ago) by andrew
Branch: MAIN

add stuff for the web server to get stuff we need into the chroot.

#!/usr/bin/perl
# $RedRiver$
use strict;
use warnings;

# find www/ -name *.so* | xargs find_depends | sort -u | xargs -I {} cp {} /home/andrew/www{} 


#use OpenBSD::PackageInfo;
#use OpenBSD::PackingList;
#use OpenBSD::SharedLibs;
#use Data::Dumper;

#my $dir = '/var/db/pkg';
#my $pkg = 'p5-DBD-mysql-3.0002';
#my $pkg = 'p5-DBD-mysql';



#my $file = shift || '/usr/local/libdata/perl5/site_perl/i386-openbsd/auto/DBD/mysql/mysql.so';


die unless @ARGV;

my %libs;
foreach my $file (@ARGV) {
  my $libs = find_libs($file);
  #print Dumper $libs;
  foreach (keys %{ $libs }) {
    $libs{ $_ } = $libs->{$_};
  }
}

foreach (keys %libs) {
  print $libs{$_}, "\n";
}

exit;

#OpenBSD::SharedLibs::add_system_libs('/');

#print installed_packages();
#print installed_name($pkg);
#print info_names();
#exit;

#my $plist = OpenBSD::PackingList->from_installation($pkg) || die $!;

#print Dumper $plist->{wantlib};

#print Dumper $OpenBSD::SharedLibs::registered_libs;

#foreach (@{ $plist->{wantlib} }) {
#  print Dumper $_->{name}, find_library($_->{name});
#}

#sub find_library
#{
#   my $spec = shift;
#   my @r;
#   OpenBSD::SharedLibs::add_system_libs('/');
#
#   my $lib = '/usr';
#   @r = OpenBSD::SharedLibs::lookup_libspec('/usr', $spec);
#   unless (@r) {
#		$lib = '/usr/X11R6';
#      @r = OpenBSD::SharedLibs::lookup_libspec('/usr/X11R6', $spec);
#   }
#   unless (@r) {
#      for my $pkg (installed_packages()) {
#          OpenBSD::SharedLibs::add_package_libs($pkg, 1);
#      }
#      $lib = '/usr/local';
#      @r = OpenBSD::SharedLibs::lookup_libspec('/usr/local', $spec);
#   }
#   return $lib, @r;
#}

sub find_libs
{
  my $file = shift;
  my $ld   = shift || get_ldconfig();
  my $locs = shift || {};

  print STDERR "Finding libs for '$file'\n";

  my @libs = search_file($file);
  foreach (@libs) {
    my ($name, $maj, $min) = $_ =~ /^([^\.]+)\.so\.(\d+)\.(\d+)$/;
    my $spec = 'l' . $name . '.' . $maj . '.' . $min;

    if (exists $ld->{$spec}) {
      next if exists $locs->{$spec};

      $locs->{$spec} = $ld->{$spec};

      $locs = find_libs($locs->{$spec}, $ld, $locs);
      
    } else {
      warn "Couldn't find location for lib '$_'";
    }
  }
    
  return $locs;
}

sub search_file 
{
  my $file = shift;
  my @libs;

  open my $libs, '<', $file or die;
  local $/ = chr(0);
  while (<$libs>) {
    if (m|^(/[^\w\/]+/)?lib(\S+)\.(\d+)\.(\d+)|) {
      my ($path, $name, $major, $minor) = ($1, $2, $3, $4);
      my $spec="$name.$major.$minor";
      if (defined $path && $path ne '/usr/local/lib') {
        $spec="$path/$spec";
      }
      push @libs, $spec;
    }
  }
  close $libs;

  return @libs;
} 

sub get_ldconfig
{
  my $ldconfig = '/sbin/ldconfig';
  my (%paths, %libs);

  open my $ld, '-|', $ldconfig, '-r' or die;
  while (<$ld>) {
    chomp;
    if (/search directories:\s+(.*)/) {
        #search directories: /usr/lib:/usr/local/lib
      my @p = split /:/, $1;
      @paths{@p} = 1;
    } elsif (/\d+:-(\S+)\s+=>\s+(\S+)/) {
             #0:-ldes.9.0 => /usr/lib/libdes.so.9.0
      my $lib = $1;
      my $loc = $2;
      #my ($name, $maj, $min) = $lib =~ /l([^\.]+)\.(\d+)\.(\d+)/;
      #my $spec = 'lib' . $name . '.so.' . $maj . '.' . $min;
      $libs{$lib} = $loc;
    } else {
      #print $_, "\n";
    }
  }
  close $ld;
  
  $libs{_paths} = [ keys %paths ];
  return \%libs;
}