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