167d43fbcSespie# ex:ts=8 sw=4: 2*652240a2Sespie# $OpenBSD: PackingList.pm,v 1.134 2014/09/09 09:40:23 espie Exp $ 36f05d20cSespie# 445019a4aSespie# Copyright (c) 2003-2014 Marc Espie <espie@openbsd.org> 56f05d20cSespie# 667d43fbcSespie# Permission to use, copy, modify, and distribute this software for any 767d43fbcSespie# purpose with or without fee is hereby granted, provided that the above 867d43fbcSespie# copyright notice and this permission notice appear in all copies. 96f05d20cSespie# 1067d43fbcSespie# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 1167d43fbcSespie# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1267d43fbcSespie# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 1367d43fbcSespie# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1467d43fbcSespie# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1567d43fbcSespie# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 1667d43fbcSespie# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 176f05d20cSespie 186f05d20cSespieuse strict; 196f05d20cSespieuse warnings; 20d76faf42Sespie 21d76faf42Sespiepackage OpenBSD::PackingList::State; 22d76faf42Sespiemy $dot = '.'; 23d76faf42Sespie 24d76faf42Sespiesub new 25d76faf42Sespie{ 26d76faf42Sespie my $class = shift; 27d76faf42Sespie bless { default_owner=>'root', 28d76faf42Sespie default_group=>'bin', 29d76faf42Sespie default_mode=> 0444, 30*652240a2Sespie owners => {}, 31*652240a2Sespie groups => {}, 32d76faf42Sespie cwd=>\$dot}, $class; 33d76faf42Sespie} 34d76faf42Sespie 35d76faf42Sespiesub cwd 36d76faf42Sespie{ 37d76faf42Sespie return ${$_[0]->{cwd}}; 38d76faf42Sespie} 39d76faf42Sespie 40d76faf42Sespiesub set_cwd 41d76faf42Sespie{ 42d76faf42Sespie my ($self, $p) = @_; 43d76faf42Sespie 44d76faf42Sespie require File::Spec; 45d76faf42Sespie 46d76faf42Sespie $p = File::Spec->canonpath($p); 47d76faf42Sespie $self->{cwd} = \$p; 48d76faf42Sespie} 49d76faf42Sespie 50e451b54dSespiepackage OpenBSD::PackingList::hashpath; 51e451b54dSespiesub match 52e451b54dSespie{ 5331e751cfSespie my ($h, $plist) = @_; 5408fe6b3eSespie my $f = $plist->fullpkgpath2; 552d3b5332Sespie if (!defined $f) { 562d3b5332Sespie return 0; 572d3b5332Sespie } 58a38c9a10Sespie for my $i (@{$h->{$f->{dir}}}) { 592d3b5332Sespie if ($i->match($f)) { 602d3b5332Sespie return 1; 612d3b5332Sespie } 622d3b5332Sespie } 632d3b5332Sespie return 0; 64e451b54dSespie} 65e451b54dSespie 665790075aSespiepackage OpenBSD::Composite; 675790075aSespie 68d1b1b3a5Sespie# convert call to $self->sub(@args) into $self->visit(sub, @args) 695790075aSespiesub AUTOLOAD 705790075aSespie{ 715790075aSespie our $AUTOLOAD; 725790075aSespie my $fullsub = $AUTOLOAD; 735790075aSespie (my $sub = $fullsub) =~ s/.*:://o; 745790075aSespie return if $sub eq 'DESTROY'; # special case 755790075aSespie my $self = $_[0]; 765790075aSespie # verify it makes sense 775790075aSespie if ($self->element_class->can($sub)) { 785790075aSespie no strict "refs"; 795790075aSespie # create the sub to avoid regenerating further calls 805790075aSespie *$fullsub = sub { 815790075aSespie my $self = shift; 825790075aSespie $self->visit($sub, @_); 835790075aSespie }; 845790075aSespie # and jump to it 855790075aSespie goto &$fullsub; 865790075aSespie } else { 875790075aSespie die "Can't call $sub on ".ref($self); 885790075aSespie } 895790075aSespie} 905790075aSespie 916f05d20cSespiepackage OpenBSD::PackingList; 925790075aSespieour @ISA = qw(OpenBSD::Composite); 936f05d20cSespie 946f05d20cSespieuse OpenBSD::PackingElement; 956f05d20cSespieuse OpenBSD::PackageInfo; 966f05d20cSespie 975790075aSespiesub element_class { "OpenBSD::PackingElement" } 985790075aSespie 996f05d20cSespiesub new 1006f05d20cSespie{ 1016f05d20cSespie my $class = shift; 102e39fac1bSespie my $plist = bless {state => OpenBSD::PackingList::State->new, 103e39fac1bSespie infodir => \(my $d)}, $class; 104435cc565Sespie OpenBSD::PackingElement::File->add($plist, CONTENTS); 105435cc565Sespie return $plist; 1066f05d20cSespie} 1076f05d20cSespie 108e39fac1bSespiesub set_infodir 109e39fac1bSespie{ 110c0956bedSespie my ($self, $dir) = @_; 111cc24e6f2Sespie $dir .= '/' unless $dir =~ m/\/$/o; 112e39fac1bSespie ${$self->{infodir}} = $dir; 113e39fac1bSespie} 114e39fac1bSespie 1156a5fab34Sespiesub make_shallow_copy 11626205b33Sespie{ 11726205b33Sespie my ($plist, $h) = @_; 11826205b33Sespie 119d1b1b3a5Sespie my $copy = ref($plist)->new; 1202786dca3Sespie $copy->set_infodir($plist->infodir); 1216a5fab34Sespie $plist->copy_shallow_if($copy, $h); 12226205b33Sespie return $copy; 12326205b33Sespie} 12426205b33Sespie 1256a5fab34Sespiesub make_deep_copy 1266a5fab34Sespie{ 1276a5fab34Sespie my ($plist, $h) = @_; 1286a5fab34Sespie 129d1b1b3a5Sespie my $copy = ref($plist)->new; 1302786dca3Sespie $copy->set_infodir($plist->infodir); 1316a5fab34Sespie $plist->copy_deep_if($copy, $h); 1326a5fab34Sespie return $copy; 1336a5fab34Sespie} 13426205b33Sespie 135c0956bedSespiesub infodir 136c0956bedSespie{ 137c0956bedSespie my $self = shift; 1383f2ef483Sespie return ${$self->{infodir}}; 139c0956bedSespie} 140c0956bedSespie 141f0c4f0f9Sespiesub zap_wrong_annotations 142f0c4f0f9Sespie{ 143f0c4f0f9Sespie my $self = shift; 144f0c4f0f9Sespie my $pkgname = $self->pkgname; 145f0c4f0f9Sespie if (defined $pkgname && $pkgname =~ m/^(?:\.libs\d*|partial)\-/) { 146f0c4f0f9Sespie delete $self->{'manual-installation'}; 14712460683Sespie delete $self->{'firmware'}; 14812460683Sespie delete $self->{'digital-signature'}; 149f0c4f0f9Sespie } 150f0c4f0f9Sespie} 151f0c4f0f9Sespie 152ec33acfdSespiesub conflict_list 153ec33acfdSespie{ 154ec33acfdSespie require OpenBSD::PkgCfl; 155ec33acfdSespie 156ec33acfdSespie my $self = shift; 157d7d1cba4Sespie return OpenBSD::PkgCfl->make_conflict_list($self); 158ec33acfdSespie} 159ec33acfdSespie 160d1b1b3a5Sespiemy $subclass; 161d1b1b3a5Sespie 1626f05d20cSespiesub read 1636f05d20cSespie{ 16409568254Sespie my ($a, $u, $code) = @_; 1656f05d20cSespie my $plist; 16618f2b7ffSespie $code = \&defaultCode if !defined $code; 1676f05d20cSespie if (ref $a) { 1686f05d20cSespie $plist = $a; 1696f05d20cSespie } else { 1706f05d20cSespie $plist = new $a; 1716f05d20cSespie } 172d1b1b3a5Sespie if (defined $subclass->{$code}) { 173d1b1b3a5Sespie bless $plist, "OpenBSD::PackingList::".$subclass->{$code}; 174d1b1b3a5Sespie } 17509568254Sespie &$code($u, 176f7e1ce99Sespie sub { 1772c486618Sespie my $line = shift; 1782c486618Sespie return if $line =~ m/^\s*$/o; 1792c486618Sespie OpenBSD::PackingElement->create($line, $plist); 180f7e1ce99Sespie }); 181f0c4f0f9Sespie $plist->zap_wrong_annotations; 1826f05d20cSespie return $plist; 1836f05d20cSespie} 1846f05d20cSespie 185f7e1ce99Sespiesub defaultCode 1866f05d20cSespie{ 187f7e1ce99Sespie my ($fh, $cont) = @_; 188f7e1ce99Sespie while (<$fh>) { 189f7e1ce99Sespie &$cont($_); 190f7e1ce99Sespie } 1916f05d20cSespie} 1926f05d20cSespie 19358be51c0Sespiesub SharedItemsOnly 1946f05d20cSespie{ 195f7e1ce99Sespie my ($fh, $cont) = @_; 196f7e1ce99Sespie while (<$fh>) { 19761e70cf3Sespie next unless m/^\@(?:cwd|dir|fontdir|mandir|newuser|newgroup|name)\b/o || m/^\@(?:sample|extra)\b.*\/$/o || m/^[^\@].*\/$/o; 198f7e1ce99Sespie &$cont($_); 199f7e1ce99Sespie } 2006f05d20cSespie} 2016f05d20cSespie 20258be51c0Sespiesub DirrmOnly 20358be51c0Sespie{ 20458be51c0Sespie &OpenBSD::PackingList::SharedItemsOnly; 20558be51c0Sespie} 20658be51c0Sespie 2072d9bc31aSespiesub LibraryOnly 2082d9bc31aSespie{ 2092d9bc31aSespie my ($fh, $cont) = @_; 2102d9bc31aSespie while (<$fh>) { 211dd2410cfSespie next unless m/^\@(?:cwd|lib|name|comment\s+subdir\=)\b/o; 2122d9bc31aSespie &$cont($_); 2132d9bc31aSespie } 2142d9bc31aSespie} 2152d9bc31aSespie 216f7e1ce99Sespiesub FilesOnly 2176f05d20cSespie{ 218f7e1ce99Sespie my ($fh, $cont) = @_; 219f7e1ce99Sespie while (<$fh>) { 220000ce162Sespie next unless m/^\@(?:cwd|name|info|man|file|lib|shell|sample|bin|rcscript)\b/o || !m/^\@/o; 221f7e1ce99Sespie &$cont($_); 222f7e1ce99Sespie } 223f7e1ce99Sespie} 224f7e1ce99Sespie 2256a8d296fSespiesub PrelinkStuffOnly 2266a8d296fSespie{ 2276a8d296fSespie my ($fh, $cont) = @_; 2286a8d296fSespie while (<$fh>) { 229dd2410cfSespie next unless m/^\@(?:cwd|bin|lib|name|depend|wantlib|comment\s+ubdir\=)\b/o; 2306a8d296fSespie &$cont($_); 2316a8d296fSespie } 2326a8d296fSespie} 2336a8d296fSespie 23438727c08Sespiesub DependOnly 23538727c08Sespie{ 23638727c08Sespie my ($fh, $cont) = @_; 23738727c08Sespie while (<$fh>) { 238b82ff443Sespie if (m/^\@(?:depend|wantlib|define-tag)\b/o) { 23928790261Sespie &$cont($_); 240dd2410cfSespie # XXX optimization 241368a866dSespie } elsif (m/^\@(?:newgroup|newuser|cwd)\b/o) { 24228790261Sespie last; 24328790261Sespie } 24428790261Sespie } 24538727c08Sespie} 24638727c08Sespie 247737fdd9bSespiesub ExtraInfoOnly 248737fdd9bSespie{ 249737fdd9bSespie my ($fh, $cont) = @_; 250737fdd9bSespie while (<$fh>) { 25174e79e5bSespie if (m/^\@(?:name|pkgpath|comment\s+(?:subdir|pkgpath)\=)\b/o) { 252987c5975Sespie &$cont($_); 253dd2410cfSespie # XXX optimization 254dd2410cfSespie } elsif (m/^\@(?:depend|wantlib|newgroup|newuser|cwd)\b/o) { 2557522c6eaSespie last; 2567522c6eaSespie } 2577522c6eaSespie } 258737fdd9bSespie} 259737fdd9bSespie 2609b5ce663Sespiesub UpdateInfoOnly 2619b5ce663Sespie{ 2629b5ce663Sespie my ($fh, $cont) = @_; 2639b5ce663Sespie while (<$fh>) { 2649131f929Sespie # if alwaysupdate, all info is sig 2659131f929Sespie if (m/^\@option\s+always-update\b/o) { 2669131f929Sespie &$cont($_); 2679131f929Sespie while (<$fh>) { 2689131f929Sespie &$cont($_); 2699131f929Sespie } 2703b9b0d1bSespie return; 2719131f929Sespie } 27274e79e5bSespie if (m/^\@(?:name|depend|wantlib|conflict|option|pkgpath|url|arch|comment\s+(?:subdir|pkgpath)\=)\b/o) { 2739b5ce663Sespie &$cont($_); 274dd2410cfSespie # XXX optimization 275dd2410cfSespie } elsif (m/^\@(?:newgroup|newuser|cwd)\b/o) { 276dd2410cfSespie last; 277dd2410cfSespie } 2789b5ce663Sespie } 2799b5ce663Sespie} 2809b5ce663Sespie 281f7e1ce99Sespiesub ConflictOnly 282f7e1ce99Sespie{ 283f7e1ce99Sespie my ($fh, $cont) = @_; 284f7e1ce99Sespie while (<$fh>) { 285dd2410cfSespie if (m/^\@(?:name|conflict|option)\b/o) { 28628790261Sespie &$cont($_); 287dd2410cfSespie # XXX optimization 288368a866dSespie } elsif (m/^\@(?:depend|wantlib|newgroup|newuser|cwd)\b/o) { 28928790261Sespie last; 29028790261Sespie } 29128790261Sespie } 292f7e1ce99Sespie} 293f7e1ce99Sespie 2946f05d20cSespiesub fromfile 2956f05d20cSespie{ 2966f05d20cSespie my ($a, $fname, $code) = @_; 297b9b2024bSespie open(my $fh, '<', $fname) or return; 2988433647eSespie my $plist; 2998433647eSespie eval { 3008433647eSespie $plist = $a->read($fh, $code); 3018433647eSespie }; 3028433647eSespie if ($@) { 3038433647eSespie chomp $@; 304cc24e6f2Sespie $@ =~ s/\.$/,/o; 3058433647eSespie die "$@ in $fname, "; 3068433647eSespie } 3076f05d20cSespie close($fh); 3086f05d20cSespie return $plist; 3096f05d20cSespie} 3106f05d20cSespie 3116f05d20cSespiesub tofile 3126f05d20cSespie{ 3136f05d20cSespie my ($self, $fname) = @_; 314b9b2024bSespie open(my $fh, '>', $fname) or return; 315f0c4f0f9Sespie $self->zap_wrong_annotations; 3166f05d20cSespie $self->write($fh); 317b9b2024bSespie close($fh) or return; 3186f05d20cSespie return 1; 3196f05d20cSespie} 3206f05d20cSespie 321c0956bedSespiesub save 322c0956bedSespie{ 323c0956bedSespie my $self = shift; 324c0956bedSespie $self->tofile($self->infodir.CONTENTS); 325c0956bedSespie} 326c0956bedSespie 3276f05d20cSespiesub add2list 3286f05d20cSespie{ 3296f05d20cSespie my ($plist, $object) = @_; 330f04afe28Sespie my $category = $object->category; 3316f05d20cSespie push @{$plist->{$category}}, $object; 3326f05d20cSespie} 3336f05d20cSespie 3346f05d20cSespiesub addunique 3356f05d20cSespie{ 3366f05d20cSespie my ($plist, $object) = @_; 337f04afe28Sespie my $category = $object->category; 3386f05d20cSespie if (defined $plist->{$category}) { 33933efc49fSespie die "Duplicate $category in plist ".($plist->pkgname // "?"); 3406f05d20cSespie } 3416f05d20cSespie $plist->{$category} = $object; 3426f05d20cSespie} 3436f05d20cSespie 34410d7f8b4Sespiesub has 34510d7f8b4Sespie{ 34610d7f8b4Sespie my ($plist, $name) = @_; 34710d7f8b4Sespie return defined $plist->{$name}; 34810d7f8b4Sespie} 34910d7f8b4Sespie 35010d7f8b4Sespiesub get 35110d7f8b4Sespie{ 35210d7f8b4Sespie my ($plist, $name) = @_; 35310d7f8b4Sespie return $plist->{$name}; 35410d7f8b4Sespie} 35510d7f8b4Sespie 35626205b33Sespiesub set_pkgname 35726205b33Sespie{ 35826205b33Sespie my ($self, $name) = @_; 35926205b33Sespie if (defined $self->{name}) { 360e451b54dSespie $self->{name}->set_name($name); 36126205b33Sespie } else { 36226205b33Sespie OpenBSD::PackingElement::Name->add($self, $name); 36326205b33Sespie } 36426205b33Sespie} 36526205b33Sespie 36636a7fe47Sespiesub pkgname 3676f05d20cSespie{ 3686f05d20cSespie my $self = shift; 369c9089320Snaddy if (defined $self->{name}) { 370e451b54dSespie return $self->{name}->name; 371c9089320Snaddy } else { 372c9089320Snaddy return undef; 373c9089320Snaddy } 3746f05d20cSespie} 3756f05d20cSespie 37636a7fe47Sespiesub localbase 377dccc2276Sespie{ 378dccc2276Sespie my $self = shift; 379e95d9ee4Sespie 380e95d9ee4Sespie if (defined $self->{localbase}) { 381e451b54dSespie return $self->{localbase}->name; 382e95d9ee4Sespie } else { 383e95d9ee4Sespie return '/usr/local'; 384e95d9ee4Sespie } 385dccc2276Sespie} 386dccc2276Sespie 38711ccabebSespiesub is_signed 38811ccabebSespie{ 38987317f7eSespie my $self = shift; 39087317f7eSespie return defined $self->{'digital-signature'}; 39111ccabebSespie} 3922063c02eSespie 393a4f5498fSespiesub fullpkgpath 394a4f5498fSespie{ 395a4f5498fSespie my $self = shift; 39689955da4Sespie if (defined $self->{extrainfo} && $self->{extrainfo}{subdir} ne '') { 39789955da4Sespie return $self->{extrainfo}{subdir}; 39808fe6b3eSespie } else { 39908fe6b3eSespie return undef; 40008fe6b3eSespie } 40108fe6b3eSespie} 40208fe6b3eSespie 40308fe6b3eSespiesub fullpkgpath2 40408fe6b3eSespie{ 40508fe6b3eSespie my $self = shift; 40689955da4Sespie if (defined $self->{extrainfo} && $self->{extrainfo}{subdir} ne '') { 40789955da4Sespie return $self->{extrainfo}{path}; 408a4f5498fSespie } else { 409a4f5498fSespie return undef; 410a4f5498fSespie } 411a4f5498fSespie} 41208fe6b3eSespie 413e451b54dSespiesub pkgpath 414e451b54dSespie{ 415e451b54dSespie my $self = shift; 416e451b54dSespie if (!defined $self->{_hashpath}) { 417e451b54dSespie my $h = $self->{_hashpath} = 418e451b54dSespie bless {}, "OpenBSD::PackingList::hashpath"; 41908fe6b3eSespie my $f = $self->fullpkgpath2; 4202d3b5332Sespie if (defined $f) { 4212d3b5332Sespie push(@{$h->{$f->{dir}}}, $f); 422e451b54dSespie } 423e451b54dSespie if (defined $self->{pkgpath}) { 424e451b54dSespie for my $i (@{$self->{pkgpath}}) { 42589955da4Sespie push(@{$h->{$i->{path}{dir}}}, $i->{path}); 426e451b54dSespie } 427e451b54dSespie } 428e451b54dSespie } 429e451b54dSespie return $self->{_hashpath}; 430e451b54dSespie} 431e451b54dSespie 432e451b54dSespiesub match_pkgpath 433e451b54dSespie{ 434e451b54dSespie my ($self, $plist2) = @_; 43531e751cfSespie return $self->pkgpath->match($plist2) || 43631e751cfSespie $plist2->pkgpath->match($self); 437e451b54dSespie} 438e451b54dSespie 4399b5ce663Sespieour @unique_categories = 440afe6de13Sespie (qw(name url signer digital-signature no-default-conflict manual-installation firmware always-update extrainfo localbase arch)); 4419b5ce663Sespie 4429b5ce663Sespieour @list_categories = 443afe6de13Sespie (qw(conflict pkgpath ask-update depend 444b82ff443Sespie wantlib define-tag groups users items)); 4459b5ce663Sespie 4469b5ce663Sespieour @cache_categories = 44761e70cf3Sespie (qw(depend wantlib)); 4489b5ce663Sespie 4492063c02eSespiesub visit 4502063c02eSespie{ 4512063c02eSespie my ($self, $method, @l) = @_; 4522063c02eSespie 4532063c02eSespie if (defined $self->{cvstags}) { 4542063c02eSespie for my $item (@{$self->{cvstags}}) { 45567cc0ba0Sespie $item->$method(@l) unless $item->{deleted}; 4562063c02eSespie } 4572063c02eSespie } 4582063c02eSespie 45967cc0ba0Sespie # XXX unique and info files really get deleted, so there's no need 46067cc0ba0Sespie # to remove them later. 4619b5ce663Sespie for my $unique_item (@unique_categories) { 46267cc0ba0Sespie $self->{$unique_item}->$method(@l) 46367cc0ba0Sespie if defined $self->{$unique_item}; 4642063c02eSespie } 4652063c02eSespie 4662063c02eSespie for my $special (OpenBSD::PackageInfo::info_names()) { 4672063c02eSespie $self->{$special}->$method(@l) if defined $self->{$special}; 4682063c02eSespie } 4692063c02eSespie 4709b5ce663Sespie for my $listname (@list_categories) { 4712063c02eSespie if (defined $self->{$listname}) { 4722063c02eSespie for my $item (@{$self->{$listname}}) { 47367cc0ba0Sespie $item->$method(@l) if !$item->{deleted}; 4742063c02eSespie } 4752063c02eSespie } 4762063c02eSespie } 4772063c02eSespie} 4782063c02eSespie 47951f6b09fSespiemy $plist_cache = {}; 48051f6b09fSespie 48118f9a590Sespiesub from_installation 48218f9a590Sespie{ 48351f6b09fSespie my ($o, $pkgname, $code) = @_; 48418f9a590Sespie 48518f9a590Sespie require OpenBSD::PackageInfo; 48618f9a590Sespie 487f5939716Sespie $code //= \&defaultCode; 48851f6b09fSespie 4893571b10fSespie if ($code == \&DependOnly && defined $plist_cache->{$pkgname}) { 4903571b10fSespie return $plist_cache->{$pkgname}; 4913571b10fSespie } 4928ee98284Sespie my $filename = OpenBSD::PackageInfo::installed_contents($pkgname); 4938ee98284Sespie my $plist = $o->fromfile($filename, $code); 4943571b10fSespie if (defined $plist && $code == \&DependOnly) { 4953571b10fSespie $plist_cache->{$pkgname} = $plist; 4963571b10fSespie } 4973fdb0aa4Sespie if (defined $plist) { 498e39fac1bSespie $plist->set_infodir(OpenBSD::PackageInfo::installed_info($pkgname)); 4993fdb0aa4Sespie } 5008ee98284Sespie if (!defined $plist) { 5018ee98284Sespie print STDERR "Warning: couldn't read packing-list from installed package $pkgname\n"; 5028ee98284Sespie unless (-e $filename) { 5038ee98284Sespie print STDERR "File $filename does not exist\n"; 5048ee98284Sespie } 5058ee98284Sespie } 50651f6b09fSespie return $plist; 50718f9a590Sespie} 50818f9a590Sespie 509f0b76557Sespiesub to_cache 510f0b76557Sespie{ 511bd99e8b0Sespie my ($self) = @_; 512b1674f53Sespie return if defined $plist_cache->{$self->pkgname}; 513d1b1b3a5Sespie my $plist = OpenBSD::PackingList::Depend->new; 5149b5ce663Sespie for my $c (@cache_categories) { 515bd99e8b0Sespie if (defined $self->{$c}) { 516bd99e8b0Sespie $plist->{$c} = $self->{$c}; 517bd99e8b0Sespie } 518bd99e8b0Sespie } 519e39fac1bSespie $plist_cache->{$self->pkgname} = $plist; 520f0b76557Sespie} 521f0b76557Sespie 52218f9a590Sespiesub to_installation 52318f9a590Sespie{ 52418f9a590Sespie my ($self) = @_; 52518f9a590Sespie 52618f9a590Sespie require OpenBSD::PackageInfo; 52718f9a590Sespie 52838599eebSespie return if $main::not; 52938599eebSespie 530f04afe28Sespie $self->tofile(OpenBSD::PackageInfo::installed_contents($self->pkgname)); 53151f6b09fSespie} 53251f6b09fSespie 533c8c00174Sespiesub check_signature 534c8c00174Sespie{ 535c8c00174Sespie my ($plist, $state) = @_; 536c8c00174Sespie my $sig = $plist->get('digital-signature'); 537c8c00174Sespie if ($sig->{key} eq 'x509') { 538c8c00174Sespie require OpenBSD::x509; 539c8c00174Sespie return OpenBSD::x509::check_signature($plist, $state); 540645b1fe3Sespie } elsif ($sig->{key} eq 'signify') { 541645b1fe3Sespie require OpenBSD::signify; 542645b1fe3Sespie return OpenBSD::signify::check_signature($plist, $state); 543c8c00174Sespie } else { 544c8c00174Sespie $state->log("Error: unknown signature style $sig->{key}"); 545c8c00174Sespie return 0; 546c8c00174Sespie } 547c8c00174Sespie} 54851f6b09fSespie 54951f6b09fSespiesub forget 55051f6b09fSespie{ 55118f2b7ffSespie} 55218f9a590Sespie 553fc9f0195Sespiesub signature 554fc9f0195Sespie{ 555fc9f0195Sespie my $self = shift; 556e1eeb5e0Sespie 557e1eeb5e0Sespie require OpenBSD::Signature; 558e1eeb5e0Sespie return OpenBSD::Signature->from_plist($self); 559fc9f0195Sespie} 560fc9f0195Sespie 561d1b1b3a5Sespie$subclass = { 562d1b1b3a5Sespie \&defaultCode => 'Full', 563d1b1b3a5Sespie \&SharedItemsOnly => 'SharedItems', 564d1b1b3a5Sespie \&DirrmOnly => 'SharedItems', 565d1b1b3a5Sespie \&LibraryOnly => 'Libraries', 566d1b1b3a5Sespie \&FilesOnly => 'Files', 567d1b1b3a5Sespie \&PrelinkStuffOnly => 'Prelink', 568d1b1b3a5Sespie \&DependOnly => 'Depend', 569d1b1b3a5Sespie \&ExtraInfoOnly => 'ExtraInfo', 570d1b1b3a5Sespie \&UpdateInfoOnly => 'UpdateInfo', 571d1b1b3a5Sespie \&ConflictOnly => 'Conflict' }; 572d1b1b3a5Sespie 573d1b1b3a5Sespiepackage OpenBSD::PackingList::OldLibs; 574d1b1b3a5Sespieour @ISA = qw(OpenBSD::PackingList); 575d1b1b3a5Sespiepackage OpenBSD::PackingList::Full; 576d1b1b3a5Sespieour @ISA = qw(OpenBSD::PackingList::OldLibs); 577d1b1b3a5Sespiepackage OpenBSD::PackingList::SharedItems; 578d1b1b3a5Sespieour @ISA = qw(OpenBSD::PackingList); 579d1b1b3a5Sespiepackage OpenBSD::PackingList::Libraries; 580d1b1b3a5Sespieour @ISA = qw(OpenBSD::PackingList); 581d1b1b3a5Sespiepackage OpenBSD::PackingList::Files; 582d1b1b3a5Sespieour @ISA = qw(OpenBSD::PackingList); 583d1b1b3a5Sespiepackage OpenBSD::PackingList::Prelink; 584d1b1b3a5Sespieour @ISA = qw(OpenBSD::PackingList); 585d1b1b3a5Sespiepackage OpenBSD::PackingList::Depend; 586d1b1b3a5Sespieour @ISA = qw(OpenBSD::PackingList); 587d1b1b3a5Sespiepackage OpenBSD::PackingList::ExtraInfo; 588d1b1b3a5Sespieour @ISA = qw(OpenBSD::PackingList); 589d1b1b3a5Sespiepackage OpenBSD::PackingList::UpdateInfo; 590d1b1b3a5Sespieour @ISA = qw(OpenBSD::PackingList); 591d1b1b3a5Sespiepackage OpenBSD::PackingList::Conflict; 592d1b1b3a5Sespieour @ISA = qw(OpenBSD::PackingList); 593d1b1b3a5Sespie 5946f05d20cSespie1; 595