xref: /openbsd-src/usr.sbin/pkg_add/OpenBSD/Delete.pm (revision d6425245cb6e8bb18968b87edab8e071f7534ef0)
1e5f06d6dSespie# ex:ts=8 sw=4:
2*d6425245Sespie# $OpenBSD: Delete.pm,v 1.169 2023/10/11 13:54:43 espie Exp $
3e5f06d6dSespie#
445019a4aSespie# Copyright (c) 2003-2014 Marc Espie <espie@openbsd.org>
5e5f06d6dSespie#
6e5f06d6dSespie# Permission to use, copy, modify, and distribute this software for any
7e5f06d6dSespie# purpose with or without fee is hereby granted, provided that the above
8e5f06d6dSespie# copyright notice and this permission notice appear in all copies.
9e5f06d6dSespie#
10e5f06d6dSespie# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11e5f06d6dSespie# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12e5f06d6dSespie# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13e5f06d6dSespie# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14e5f06d6dSespie# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15e5f06d6dSespie# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16e5f06d6dSespie# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17e5f06d6dSespie
18039cbdaaSespieuse v5.36;
190fbefeddSespie
20e5f06d6dSespiepackage OpenBSD::Delete;
21e5f06d6dSespieuse OpenBSD::Error;
22e5f06d6dSespieuse OpenBSD::PackageInfo;
23b8871a38Sespieuse OpenBSD::RequiredBy;
2473c16894Sespieuse OpenBSD::Paths;
2582de6b62Sespieuse File::Basename;
26e5f06d6dSespie
27039cbdaaSespiesub keep_old_files($state, $plist)
28bf2a3c1fSespie{
298a5a2985Sespie	my $p = OpenBSD::PackingList->new;
3019ee0246Sespie	my $borked = borked_package($plist->pkgname);
314e166954Sespie	$p->set_infodir(installed_info($borked));
32a514bf39Sespie	mkdir($p->infodir);
33bf2a3c1fSespie
344e166954Sespie	$plist->copy_old_stuff($p, $state);
356a5fab34Sespie	$p->set_pkgname($borked);
36f04afe28Sespie	$p->to_installation;
37bf2a3c1fSespie	return $borked;
38bf2a3c1fSespie}
39bf2a3c1fSespie
40039cbdaaSespiesub manpages_unindex($state)
41e5f06d6dSespie{
42005e7d56Sespie	return unless defined $state->{rmman};
43e5f06d6dSespie	my $destdir = $state->{destdir};
44e5f06d6dSespie
45005e7d56Sespie	while (my ($k, $v) = each %{$state->{rmman}}) {
46005e7d56Sespie		my @l = map { "$destdir$k/$_" } @$v;
4718f9a590Sespie		if ($state->{not}) {
487e83eca3Sespie			$state->say("Removing manpages in #1: #2",
495f30bd74Sespie			    $destdir.$k, join(' ', @l)) if $state->verbose;
5018f9a590Sespie		} else {
51101180a9Sespie			$state->run_makewhatis(['-u', $destdir.$k], \@l);
5286098e9aSschwarze		}
53e5f06d6dSespie	}
54005e7d56Sespie	delete $state->{rmman};
55e5f06d6dSespie}
56e5f06d6dSespie
57039cbdaaSespiesub validate_plist($plist, $state)
58e5f06d6dSespie{
59268e18bfSespie	$plist->prepare_for_deletion($state, $plist->pkgname);
60e5f06d6dSespie}
61e5f06d6dSespie
62039cbdaaSespiesub remove_packing_info($plist, $state)
63e5f06d6dSespie{
64a514bf39Sespie	my $dir = $plist->infodir;
65e5f06d6dSespie
66e5f06d6dSespie	for my $fname (info_names()) {
67e5f06d6dSespie		unlink($dir.$fname);
68e5f06d6dSespie	}
696da0fc62Sespie	OpenBSD::RequiredBy->forget($dir);
706da0fc62Sespie	OpenBSD::Requiring->forget($dir);
717e83eca3Sespie	rmdir($dir) or
727e83eca3Sespie	    $state->fatal("can't finish removing directory #1: #2", $dir, $!);
73e5f06d6dSespie}
74e5f06d6dSespie
75039cbdaaSespiesub delete_handle($handle, $state)
76e5f06d6dSespie{
77a0a2ed7eSespie	my $pkgname = $handle->pkgname;
78a0a2ed7eSespie	my $plist = $handle->plist;
79dd248c46Sespie	if ($plist->has('firmware') && !$state->defines('FW_UPDATE')) {
80e8cdaf99Sespie		if ($state->is_interactive) {
81fb75580aSespie			if (!$state->confirm_defaults_to_no(
82fb75580aSespie			    "\nDelete firmware #1", $pkgname)) {
833f7ff4b1Sespie				$state->errsay("NOT deleting #1", $pkgname);
843f7ff4b1Sespie				return;
853f7ff4b1Sespie			}
86fc6cf708Sespie		} else {
876ed45158Ssthen			$state->errsay("NOT deleting #1: use fw_update -d",
88a0a2ed7eSespie			    $pkgname);
89fc6cf708Sespie			return;
903f7ff4b1Sespie		}
913f7ff4b1Sespie	}
92e5f06d6dSespie
93079c0f2eSespie	$state->{problems} = 0;
949fefc130Sespie	validate_plist($plist, $state);
957e83eca3Sespie	$state->fatal("can't recover from deinstalling #1", $pkgname)
96079c0f2eSespie	    if $state->{problems};
974c82e4b5Sespie	$state->vstat->synchronize;
98e5f06d6dSespie
99a0a2ed7eSespie	delete_plist($plist, $state);
1003d9daf67Sespie}
1013d9daf67Sespie
102039cbdaaSespiesub unregister_dependencies($plist, $state)
10305ea99d5Sespie{
10405ea99d5Sespie	my $pkgname = $plist->pkgname;
1051263a2d0Sespie	my $l = OpenBSD::Requiring->new($pkgname);
10605ea99d5Sespie
1071263a2d0Sespie	for my $name ($l->list) {
108401c022eSespie		$state->say("remove dependency of #1 on #2", $pkgname, $name)
109e74b30b0Sespie		    if $state->verbose >= 3;
11005ea99d5Sespie		local $@;
11105ea99d5Sespie		try {
11205ea99d5Sespie			OpenBSD::RequiredBy->new($name)->delete($pkgname);
11391273194Sespie		} catch {
114dc6961dfSespie			$state->errsay($_);
11505ea99d5Sespie		};
11605ea99d5Sespie	}
1171263a2d0Sespie	$l->erase;
11805ea99d5Sespie}
11905ea99d5Sespie
120039cbdaaSespiesub delete_plist($plist, $state)
1213d9daf67Sespie{
122f04afe28Sespie	my $pkgname = $plist->pkgname;
1233d9daf67Sespie	$state->{pkgname} = $pkgname;
124*d6425245Sespie	if (!$state->{regression}{stub} || $pkgname =~ /^quirks\-/) {
1251263a2d0Sespie		if (!$state->{size_only}) {
126005e7d56Sespie			$plist->register_manpage($state, 'rmman');
127e5f06d6dSespie			manpages_unindex($state);
12823b5e034Sespie			$state->progress->visit_with_size($plist, 'delete');
1296e2de058Sespie		}
1300c61d0f0Sespie	}
131109f0ae9Sespie
13205ea99d5Sespie	unregister_dependencies($plist, $state);
133bf2a3c1fSespie	return if $state->{not};
134bf2a3c1fSespie	if ($state->{baddelete}) {
135a514bf39Sespie	    my $borked = keep_old_files($state, $plist);
1367e83eca3Sespie	    $state->log("Files kept as #1 package", $borked);
137bf2a3c1fSespie	    delete $state->{baddelete};
138bf2a3c1fSespie	}
139bf2a3c1fSespie
140bf2a3c1fSespie
1417e83eca3Sespie	remove_packing_info($plist, $state);
142b1674f53Sespie	delete_installed($pkgname);
143e5f06d6dSespie}
144e5f06d6dSespie
145e5f06d6dSespiepackage OpenBSD::PackingElement;
146005609baSespie
147039cbdaaSespiesub rename_file_to_temp($self, $state)
14834c87d9aSespie{
14934c87d9aSespie	require OpenBSD::Temp;
15034c87d9aSespie
1511901168eSespie	my $n = $self->realname($state);
15234c87d9aSespie
15375a64d30Sespie	my (undef, $j) = OpenBSD::Temp::permanent_file(undef, $n);
15475a64d30Sespie	if (!defined $j) {
15575a64d30Sespie		$state->errsay(OpenBSD::Temp->last_error);
15675a64d30Sespie		return;
15775a64d30Sespie	}
15834c87d9aSespie	if (rename($n, $j)) {
159365c3147Sespie		$state->say("Renaming old file #1 to #2", $n, $j);
160e451b54dSespie		if ($self->name !~ m/^\//o && $self->cwd ne '.') {
16134c87d9aSespie			my $c = $self->cwd;
16234c87d9aSespie			$j =~ s|^\Q$c\E/||;
16334c87d9aSespie		}
164e451b54dSespie		$self->set_name($j);
16534c87d9aSespie	} else {
1661f58d7f0Sespie		$state->errsay("Bad rename #1 to #2: #3", $n, $j, $!);
16734c87d9aSespie	}
16834c87d9aSespie}
16934c87d9aSespie
1705179295bSespie# $self->prepare_for_deletion($state, $pkgname)
171039cbdaaSespiesub prepare_for_deletion($, $, $)
172348f75e6Sespie{
173348f75e6Sespie}
174348f75e6Sespie
1755179295bSespie# $self->delete($state)
176039cbdaaSespiesub delete($, $)
177e5f06d6dSespie{
178e5f06d6dSespie}
179e5f06d6dSespie
1805179295bSespie# $self->record_shared($recorder, $pkgname)
181039cbdaaSespiesub record_shared($, $, $)
1821d06c43bSespie{
1831d06c43bSespie}
1841d06c43bSespie
185039cbdaaSespiesub copy_old_stuff($self, $plist, $state)
1864e166954Sespie{
1874e166954Sespie}
1884e166954Sespie
1894e166954Sespiepackage OpenBSD::PackingElement::Cwd;
1904e166954Sespie
191039cbdaaSespiesub copy_old_stuff($self, $plist, $state)
1924e166954Sespie{
1934e166954Sespie	$self->add_object($plist);
1944e166954Sespie}
1954e166954Sespie
19671b1a605Sespiepackage OpenBSD::PackingElement::FileObject;
19771b1a605Sespieuse File::Basename;
19871b1a605Sespie
199039cbdaaSespiesub mark_directory($self, $state, $dir)
20071b1a605Sespie{
2018a5a2985Sespie	$state->{dirs_okay}{$dir} = 1;
20271b1a605Sespie	my $d2 = dirname($dir);
20371b1a605Sespie	if ($d2 ne $dir) {
2044a6e1394Sespie		$self->mark_directory($state, $d2);
20571b1a605Sespie	}
20671b1a605Sespie}
20771b1a605Sespie
208039cbdaaSespiesub mark_dir($self, $state)
2094a6e1394Sespie{
210c5ecfd76Sespie	$self->mark_directory($state, dirname($self->fullname));
2114a6e1394Sespie}
2124a6e1394Sespie
213039cbdaaSespiesub do_not_delete($self, $state)
2140ea2bd6fSespie{
2150ea2bd6fSespie	my $realname = $self->realname($state);
2160ea2bd6fSespie	$state->{baddelete} = 1;
2170ea2bd6fSespie	$self->{stillaround} = 1;
2180ea2bd6fSespie
2190ea2bd6fSespie	delete $self->{symlink};
2200ea2bd6fSespie	delete $self->{link};
221700d29cbSespie	my $algo = $self->{d};
222700d29cbSespie	delete $self->{d};
2230ea2bd6fSespie
2240ea2bd6fSespie	if (-l $realname) {
2250ea2bd6fSespie		$self->{symlink} = readlink $realname;
2260ea2bd6fSespie	} elsif (-f _) {
227700d29cbSespie		$self->{d} = $self->compute_digest($realname, $algo);
2280ea2bd6fSespie	} elsif (-d _) {
2290ea2bd6fSespie		# what should we do ?
2300ea2bd6fSespie	}
2310ea2bd6fSespie}
2320ea2bd6fSespie
2330ea2bd6fSespie
2344a6e1394Sespiepackage OpenBSD::PackingElement::DirlikeObject;
235039cbdaaSespiesub mark_dir($self, $state)
2364a6e1394Sespie{
237f04afe28Sespie	$self->mark_directory($state, $self->fullname);
2384a6e1394Sespie}
2394a6e1394Sespie
240df8a9707Sespiepackage OpenBSD::PackingElement::RcScript;
241df8a9707Sespie# XXX we should check stuff more thoroughly
242df8a9707Sespie
243039cbdaaSespiesub delete($self, $state)
244df8a9707Sespie{
245df8a9707Sespie	$state->{delete_rcscripts}{$self->fullname} = 1;
246df8a9707Sespie	$self->SUPER::delete($state);
247df8a9707Sespie}
248df8a9707Sespie
249e5f06d6dSespiepackage OpenBSD::PackingElement::NewUser;
250039cbdaaSespiesub delete($self, $state)
251e5f06d6dSespie{
252e74b30b0Sespie	if ($state->verbose >= 2) {
2537e83eca3Sespie		$state->say("rmuser: #1", $self->name);
254e5f06d6dSespie	}
255e5f06d6dSespie
2561d06c43bSespie	$self->record_shared($state->{recorder}, $state->{pkgname});
2571d06c43bSespie}
2581d06c43bSespie
259039cbdaaSespiesub record_shared($self, $recorder, $pkgname)
2601d06c43bSespie{
2618a5a2985Sespie	$recorder->{users}{$self->name} = $pkgname;
262e5f06d6dSespie}
263e5f06d6dSespie
264e5f06d6dSespiepackage OpenBSD::PackingElement::NewGroup;
265039cbdaaSespiesub delete($self, $state)
266e5f06d6dSespie{
267e74b30b0Sespie	if ($state->verbose >= 2) {
2687e83eca3Sespie		$state->say("rmgroup: #1", $self->name);
269e5f06d6dSespie	}
270e5f06d6dSespie
2711d06c43bSespie	$self->record_shared($state->{recorder}, $state->{pkgname});
2721d06c43bSespie}
2731d06c43bSespie
274039cbdaaSespiesub record_shared($self, $recorder, $pkgname)
2751d06c43bSespie{
2768a5a2985Sespie	$recorder->{groups}{$self->name} = $pkgname;
277e5f06d6dSespie}
278e5f06d6dSespie
279e5f06d6dSespiepackage OpenBSD::PackingElement::DirBase;
280039cbdaaSespiesub prepare_for_deletion($self, $state, $pkgname)
28114279e2cSespie{
28235135148Sespie	$state->vstat->remove_directory(
28335135148Sespie	    $self->retrieve_fullname($state, $pkgname), $self);
28414279e2cSespie}
28514279e2cSespie
286039cbdaaSespiesub delete($self, $state)
287e5f06d6dSespie{
288e74b30b0Sespie	if ($state->verbose >= 5) {
2897e83eca3Sespie		$state->say("rmdir: #1", $self->fullname);
290e5f06d6dSespie	}
291e5f06d6dSespie
2921d06c43bSespie	$self->record_shared($state->{recorder}, $state->{pkgname});
2931d06c43bSespie}
2941d06c43bSespie
295039cbdaaSespiesub record_shared($self, $recorder, $pkgname)
2961d06c43bSespie{
2978a5a2985Sespie	# enough for the entry to exist, we only record interesting
2988a5a2985Sespie	# entries more thoroughly
2998a5a2985Sespie	$recorder->{dirs}{$self->fullname} //= [];
3008a5a2985Sespie}
3018a5a2985Sespie
3028a5a2985Sespiepackage OpenBSD::PackingElement::Mandir;
303039cbdaaSespiesub record_shared($self, $recorder, $pkgname)
3048a5a2985Sespie{
3051d06c43bSespie	$self->{pkgname} = $pkgname;
3068a5a2985Sespie	push(@{$recorder->{dirs}{$self->fullname}} , $self);
3078a5a2985Sespie}
308c9c651ecSespie
3098a5a2985Sespiepackage OpenBSD::PackingElement::Fontdir;
310039cbdaaSespiesub record_shared($self, $recorder, $pkgname)
3118a5a2985Sespie{
3129f5d1042Srobert	$self->{pkgname} = $pkgname;
3139f5d1042Srobert	push(@{$recorder->{dirs}{$self->fullname}} , $self);
3149f5d1042Srobert	$recorder->{fonts_todo}{$self->fullname} = 1;
3158a5a2985Sespie}
3169f5d1042Srobert
3178a5a2985Sespiepackage OpenBSD::PackingElement::Infodir;
318039cbdaaSespiesub record_shared	# forwarder
3198a5a2985Sespie{
3208a5a2985Sespie	&OpenBSD::PackingElement::Mandir::record_shared;
321e5f06d6dSespie}
322e5f06d6dSespie
323e5f06d6dSespiepackage OpenBSD::PackingElement::Unexec;
324039cbdaaSespiesub delete($self, $state)
325e5f06d6dSespie{
3267947b3f2Sespie	if ($self->should_run($state)) {
327e5f06d6dSespie		$self->run($state);
328e5f06d6dSespie	}
3297947b3f2Sespie}
3307947b3f2Sespie
331039cbdaaSespiesub should_run($, $) { 1 }
3327947b3f2Sespie
3337947b3f2Sespiepackage OpenBSD::PackingElement::UnexecDelete;
334039cbdaaSespiesub should_run($self, $state)
3357947b3f2Sespie{
33664061489Sespie	return !$state->replacing;
3377947b3f2Sespie}
3387947b3f2Sespie
3397947b3f2Sespiepackage OpenBSD::PackingElement::UnexecUpdate;
340039cbdaaSespiesub should_run($self, $state)
3417947b3f2Sespie{
34264061489Sespie	return $state->replacing;
3437947b3f2Sespie}
344e5f06d6dSespie
34503bd1238Sespiepackage OpenBSD::PackingElement::DefineTag::Atend;
346039cbdaaSespiesub delete($self, $state)
34703bd1238Sespie{
34803bd1238Sespie	if (!$state->replacing) {
34903bd1238Sespie		$state->{tags}{deleted}{$self->name} = 1;
35003bd1238Sespie	}
35103bd1238Sespie}
35203bd1238Sespie
35303bd1238Sespie
354eb082087Sespiepackage OpenBSD::PackingElement::Tag;
355039cbdaaSespiesub delete($self, $state)
356eb082087Sespie{
357eb082087Sespie	for my $d (@{$self->{definition_list}}) {
358eb082087Sespie		$d->add_tag($self, "delete", $state);
359eb082087Sespie	}
360eb082087Sespie}
361eb082087Sespie
362e5f06d6dSespiepackage OpenBSD::PackingElement::FileBase;
363348f75e6Sespieuse OpenBSD::Error;
364348f75e6Sespie
365039cbdaaSespiesub prepare_for_deletion($self, $state, $pkgname)
366348f75e6Sespie{
36735135148Sespie	my $fname = $self->retrieve_fullname($state, $pkgname);
3681a1aaf83Sespie	my $s;
36935135148Sespie	my $size = $self->{tied} ? 0 : $self->retrieve_size;
3701a1aaf83Sespie	if ($state->{delete_first}) {
37124cff5d0Sespie		$s = $state->vstat->remove_first($fname, $size);
3721a1aaf83Sespie	} else {
37324cff5d0Sespie		$s = $state->vstat->remove($fname, $size);
3741a1aaf83Sespie	}
3757ed511f1Sbernd	return unless defined $s;
376645ff4e3Sespie	if ($s->ro) {
377268e18bfSespie		$s->report_ro($state, $fname);
378348f75e6Sespie	}
379348f75e6Sespie}
380348f75e6Sespie
381039cbdaaSespiesub is_intact($self, $state, $realname)
382d295db65Sespie{
383d295db65Sespie	return 1 if defined($self->{link}) or $self->{nochecksum};
384d295db65Sespie	if (!defined $self->{d}) {
385d295db65Sespie		if ($self->fullname eq $realname) {
386d295db65Sespie			$state->say("NOT deleting #1 (no checksum)", $realname);
387d295db65Sespie		} else {
388d295db65Sespie			$state->say("Not deleting #1 (no checksum for #2",
389d295db65Sespie			    $realname, $self->fullname);
390d295db65Sespie		}
391d295db65Sespie		$state->log("Couldn't delete #1 (no checksum)", $realname);
392d295db65Sespie		return 0;
393d295db65Sespie	}
394c9685e2aSespie	return 1 unless $state->defines('checksum');
395d295db65Sespie	my $d = $self->compute_digest($realname, $self->{d});
396d295db65Sespie	return 1 if $d->equals($self->{d});
397d295db65Sespie	if ($self->fullname eq $realname) {
398d295db65Sespie		$state->say("NOT deleting #1 (bad checksum)", $realname);
399d295db65Sespie	} else {
400d295db65Sespie		$state->say("Not deleting #1 (bad checksum for #2)",
401d295db65Sespie		    $realname, $self->fullname);
402d295db65Sespie	}
403d295db65Sespie	$state->log("Couldn't delete #1 (bad checksum)", $realname);
404d295db65Sespie	return 0;
405d295db65Sespie}
406d295db65Sespie
407039cbdaaSespiesub delete($self, $state)
408e5f06d6dSespie{
4094a6e1394Sespie	my $realname = $self->realname($state);
410d66db768Sespie	return if defined $state->{current_set}{dont_delete}{$realname};
4114a6e1394Sespie
4124a6e1394Sespie	if (defined $self->{symlink}) {
413e5f06d6dSespie		if (-l $realname) {
4144a6e1394Sespie			my $contents = readlink $realname;
4154a6e1394Sespie			if ($contents ne $self->{symlink}) {
4167e83eca3Sespie				$state->say("Symlink does not match: #1 (#2 vs. #3)",
4177e83eca3Sespie				    $realname, $contents, $self->{symlink});
4180ea2bd6fSespie				$self->do_not_delete($state);
4194a6e1394Sespie				return;
420e5f06d6dSespie			}
421e5f06d6dSespie		} else  {
4226580d8fdSespie			if (-e $realname) {
4237e83eca3Sespie				$state->say("Bogus symlink: #1", $realname);
4240ea2bd6fSespie				$self->do_not_delete($state);
4256580d8fdSespie			} else {
4266580d8fdSespie				$state->say("Can't delete missing symlink: #1",
4276580d8fdSespie				    $realname);
4286580d8fdSespie			}
4294a6e1394Sespie			return;
4304a6e1394Sespie		}
4314a6e1394Sespie	} else {
4324a6e1394Sespie		if (-l $realname) {
4337e83eca3Sespie				$state->say("Unexpected symlink: #1", $realname);
4340ea2bd6fSespie				$self->do_not_delete($state);
4354a6e1394Sespie		} else {
436e5f06d6dSespie			if (!-f $realname) {
4377e83eca3Sespie				$state->say("File #1 does not exist", $realname);
438e5f06d6dSespie				return;
439e5f06d6dSespie			}
440d295db65Sespie			if (!$self->is_intact($state, $realname)) {
4410ea2bd6fSespie				$self->do_not_delete($state);
442e5f06d6dSespie				return;
443e5f06d6dSespie			}
444e5f06d6dSespie		}
4454a6e1394Sespie	}
446e74b30b0Sespie	if ($state->verbose >= 5) {
4477e83eca3Sespie		$state->say("deleting: #1", $realname);
448e5f06d6dSespie	}
449e5f06d6dSespie	return if $state->{not};
45002254ccdSespie	if ($state->{delete_first} && $self->{tied}) {
45102254ccdSespie		push(@{$state->{delayed}}, $realname);
45202254ccdSespie	} else {
453e5f06d6dSespie		if (!unlink $realname) {
45402254ccdSespie			$state->errsay("Problem deleting #1: #2", $realname,
45502254ccdSespie			    $!);
4567e83eca3Sespie			$state->log("deleting #1 failed: #2", $realname, $!);
457e5f06d6dSespie		}
458e5f06d6dSespie	}
45902254ccdSespie}
460e5f06d6dSespie
461039cbdaaSespiesub copy_old_stuff($self, $plist, $state)
4624e166954Sespie{
4634e166954Sespie	if (defined $self->{stillaround}) {
4644e166954Sespie		delete $self->{stillaround};
46564061489Sespie		if ($state->replacing) {
466365c3147Sespie			$self->rename_file_to_temp($state);
4674e166954Sespie		}
4684e166954Sespie		$self->add_object($plist);
4694e166954Sespie	}
4704e166954Sespie}
4714e166954Sespie
472268e18bfSespiepackage OpenBSD::PackingElement::SpecialFile;
473268e18bfSespieuse OpenBSD::PackageInfo;
474268e18bfSespie
475039cbdaaSespiesub copy_old_stuff($, $, $)
4764e166954Sespie{
4774e166954Sespie}
4784e166954Sespie
4794e166954Sespiepackage OpenBSD::PackingElement::Meta;
480039cbdaaSespiesub copy_old_stuff($self, $plist, $state)
4814e166954Sespie{
4824e166954Sespie	$self->add_object($plist);
4834e166954Sespie}
4844e166954Sespie
485a81b6432Sespiepackage OpenBSD::PackingElement::DigitalSignature;
486039cbdaaSespiesub copy_old_stuff($, $, $)
487a81b6432Sespie{
488a81b6432Sespie}
489a81b6432Sespie
4904e166954Sespiepackage OpenBSD::PackingElement::FDESC;
491039cbdaaSespiesub copy_old_stuff($self, $plist, $state)
4924e166954Sespie{
4934e166954Sespie	require File::Copy;
4944e166954Sespie
4954e166954Sespie	File::Copy::copy($self->fullname, $plist->infodir);
4964e166954Sespie	$self->add_object($plist);
4974e166954Sespie}
4984e166954Sespie
499e5f06d6dSespiepackage OpenBSD::PackingElement::Sample;
500e5f06d6dSespieuse OpenBSD::Error;
50171b1a605Sespieuse File::Basename;
50271b1a605Sespie
503039cbdaaSespiesub delete($self, $state)
504e5f06d6dSespie{
5054a6e1394Sespie	my $realname = $self->realname($state);
506e5f06d6dSespie
507e5f06d6dSespie	my $orig = $self->{copyfrom};
508e5f06d6dSespie	if (!defined $orig) {
5097e83eca3Sespie		$state->fatal("\@sample element does not reference a valid file");
510e5f06d6dSespie	}
51164061489Sespie	my $action = $state->replacing ? "check" : "remove";
5124a6e1394Sespie	my $origname = $orig->realname($state);
513e5f06d6dSespie	if (! -e $realname) {
5147e83eca3Sespie		$state->log("File #1 does not exist", $realname);
515e5f06d6dSespie		return;
516e5f06d6dSespie	}
517e5f06d6dSespie	if (! -f $realname) {
5187e83eca3Sespie		$state->log("File #1 is not a file", $realname);
519e5f06d6dSespie		return;
520e5f06d6dSespie	}
52106c138daSespie
522700d29cbSespie	if (!defined $orig->{d}) {
5237e83eca3Sespie		$state->log("Couldn't delete #1 (no checksum)", $realname);
524e5f06d6dSespie		return;
525e5f06d6dSespie	}
526e5f06d6dSespie
52791c7e684Sespie	if ($state->{quick} && $state->{quick} >= 2) {
528e5f06d6dSespie		unless ($state->{extra}) {
5294a6e1394Sespie			$self->mark_dir($state);
5307e83eca3Sespie			$state->log("You should also #1 #2", $action, $realname );
531e5f06d6dSespie			return;
532e5f06d6dSespie		}
533e5f06d6dSespie	} else {
534700d29cbSespie		my $d = $self->compute_digest($realname, $orig->{d});
535700d29cbSespie		if ($d->equals($orig->{d})) {
5367e83eca3Sespie			$state->say("File #1 identical to sample", $realname) if $state->verbose >= 2;
537e5f06d6dSespie		} else {
538e5f06d6dSespie			unless ($state->{extra}) {
5394a6e1394Sespie				$self->mark_dir($state);
5407e83eca3Sespie				$state->log("You should also #1 #2 (which was modified)", $action, $realname);
541e5f06d6dSespie				return;
542e5f06d6dSespie			}
543e5f06d6dSespie		}
544e5f06d6dSespie	}
5457e83eca3Sespie	$state->say("deleting #1", $realname) if $state->verbose >= 2;
546e5f06d6dSespie	return if $state->{not};
547e5f06d6dSespie	if (!unlink $realname) {
5487e83eca3Sespie		$state->errsay("Problem deleting #1: #2", $realname, $!);
5497e83eca3Sespie		$state->log("deleting #1 failed: #2", $realname, $!);
550e5f06d6dSespie	}
551e5f06d6dSespie}
552e5f06d6dSespie
553e5f06d6dSespie
554e5f06d6dSespiepackage OpenBSD::PackingElement::InfoFile;
555e5f06d6dSespieuse File::Basename;
556e5f06d6dSespieuse OpenBSD::Error;
557039cbdaaSespiesub delete($self, $state)
558e5f06d6dSespie{
559e5f06d6dSespie	unless ($state->{not}) {
560c5ecfd76Sespie	    my $fullname = $state->{destdir}.$self->fullname;
561b5458979Sespie	    $state->vsystem(OpenBSD::Paths->install_info,
562dfdce8c8Sespie		"--delete", "--info-dir=".dirname($fullname), '--', $fullname);
563e5f06d6dSespie	}
564e5f06d6dSespie	$self->SUPER::delete($state);
565e5f06d6dSespie}
566e5f06d6dSespie
567e5f06d6dSespiepackage OpenBSD::PackingElement::Shell;
568039cbdaaSespiesub delete($self, $state)
569e5f06d6dSespie{
570e5f06d6dSespie	unless ($state->{not}) {
571e5f06d6dSespie		my $destdir = $state->{destdir};
572f04afe28Sespie		my $fullname = $self->fullname;
573e5f06d6dSespie		my @l=();
57473c16894Sespie		if (open(my $shells, '<', $destdir.OpenBSD::Paths->shells)) {
575e5f06d6dSespie			while(<$shells>) {
576e5f06d6dSespie				push(@l, $_);
577cc24e6f2Sespie				s/^\#.*//o;
578e5f06d6dSespie				if ($_ =~ m/^\Q$fullname\E\s*$/) {
579e5f06d6dSespie					pop(@l);
580e5f06d6dSespie				}
581e5f06d6dSespie			}
582e5f06d6dSespie			close($shells);
58373c16894Sespie			open(my $shells2, '>', $destdir.OpenBSD::Paths->shells);
584e5f06d6dSespie			print $shells2 @l;
585e5f06d6dSespie			close $shells2;
5867e83eca3Sespie			$state->say("Shell #1 removed from #2",
5877e83eca3Sespie			    $fullname, $destdir.OpenBSD::Paths->shells)
5887e83eca3Sespie			    	if $state->verbose;
589e5f06d6dSespie		}
590e5f06d6dSespie	}
591e5f06d6dSespie	$self->SUPER::delete($state);
592e5f06d6dSespie}
593e5f06d6dSespie
594e5f06d6dSespiepackage OpenBSD::PackingElement::Extra;
59571b1a605Sespieuse File::Basename;
59671b1a605Sespie
597039cbdaaSespiesub delete($self, $state)
598e5f06d6dSespie{
599553f849eSespie	return if defined $state->{current_set}{known_extra}{$self->fullname};
6004a6e1394Sespie	my $realname = $self->realname($state);
601e74b30b0Sespie	if ($state->verbose >= 2 && $state->{extra}) {
6027e83eca3Sespie		$state->say("deleting extra file: #1", $realname);
603e5f06d6dSespie	}
604e5f06d6dSespie	return if $state->{not};
605deb3b639Ssturm	return unless -e $realname or -l $realname;
606553f849eSespie	if ($state->{extra}) {
607e5f06d6dSespie		unlink($realname) or
6087e83eca3Sespie		    $state->say("problem deleting extra file #1: #2", $realname, $!);
609541c30aeSespie	} else {
6107e83eca3Sespie		$state->log("You should also remove #1", $realname);
6114a6e1394Sespie		$self->mark_dir($state);
612541c30aeSespie	}
613e5f06d6dSespie}
614e5f06d6dSespie
61571b1a605Sespie
616e5f06d6dSespiepackage OpenBSD::PackingElement::Extradir;
617039cbdaaSespiesub delete($self, $state)
618e5f06d6dSespie{
619e5f06d6dSespie	return unless $state->{extra};
620553f849eSespie	return if defined $state->{current_set}{known_extra}{$self->fullname};
6214a6e1394Sespie	my $realname = $self->realname($state);
622541c30aeSespie	if ($state->{extra}) {
623e5f06d6dSespie		$self->SUPER::delete($state);
624541c30aeSespie	} else {
6257e83eca3Sespie		$state->log("You should also remove the directory #1", $realname);
6264a6e1394Sespie		$self->mark_dir($state);
627541c30aeSespie	}
628e5f06d6dSespie}
629e5f06d6dSespie
630e5f06d6dSespiepackage OpenBSD::PackingElement::ExtraUnexec;
631e5f06d6dSespie
632039cbdaaSespiesub delete($self, $state)
633e5f06d6dSespie{
634541c30aeSespie	if ($state->{extra}) {
635e5f06d6dSespie		$self->run($state);
636541c30aeSespie	} else {
6377e83eca3Sespie		$state->log("You should also run #1", $self->{expanded});
638541c30aeSespie	}
639e5f06d6dSespie}
640e5f06d6dSespie
641e5f06d6dSespiepackage OpenBSD::PackingElement::Lib;
642039cbdaaSespiesub delete($self, $state)
643e5f06d6dSespie{
644e5f06d6dSespie	$self->SUPER::delete($state);
645a6526ca6Sespie	$self->mark_ldconfig_directory($state);
646e5f06d6dSespie}
647e5f06d6dSespie
6484e166954Sespiepackage OpenBSD::PackingElement::Depend;
649039cbdaaSespiesub copy_old_stuff($self, $plist, $state)
6504e166954Sespie{
6515179295bSespie	OpenBSD::PackingElement::Comment->add($plist,
6525179295bSespie	    "\@".$self->keyword." ".$self->stringize);
6534e166954Sespie}
6544e166954Sespie
655c9c651ecSespiepackage OpenBSD::PackingElement::FDISPLAY;
656039cbdaaSespiesub delete($self, $state)
657c9c651ecSespie{
658d957d6edSespie	$state->{current_set}{known_displays}{$self->{d}->key} = 1;
659c9c651ecSespie	$self->SUPER::delete($state);
660c9c651ecSespie}
661c9c651ecSespie
662c9c651ecSespiepackage OpenBSD::PackingElement::FUNDISPLAY;
663039cbdaaSespiesub delete($self, $state)
664c9c651ecSespie{
665c9c651ecSespie	my $d = $self->{d};
666d957d6edSespie	if (!$state->{current_set}{known_displays}{$self->{d}->key}) {
667c9c651ecSespie		$self->prepare($state);
668c9c651ecSespie	}
669c9c651ecSespie	$self->SUPER::delete($state);
670c9c651ecSespie}
671c9c651ecSespie
672c9c651ecSespiepackage OpenBSD::PackingElement::Mandir;
673039cbdaaSespiesub delete($self, $state)
674c9c651ecSespie{
675d957d6edSespie	$state->{current_set}{known_mandirs}{$self->fullname} = 1;
676c9c651ecSespie	$self->SUPER::delete($state);
677c9c651ecSespie}
678c9c651ecSespie
679e5f06d6dSespie1;
680