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