summaryrefslogtreecommitdiff
path: root/usr.sbin/pkg_add/OpenBSD
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/pkg_add/OpenBSD')
-rw-r--r--usr.sbin/pkg_add/OpenBSD/Add.pm77
1 files changed, 62 insertions, 15 deletions
diff --git a/usr.sbin/pkg_add/OpenBSD/Add.pm b/usr.sbin/pkg_add/OpenBSD/Add.pm
index 31f8d82b40d..ab1beb4a5ab 100644
--- a/usr.sbin/pkg_add/OpenBSD/Add.pm
+++ b/usr.sbin/pkg_add/OpenBSD/Add.pm
@@ -1,5 +1,5 @@
# ex:ts=8 sw=4:
-# $OpenBSD: Add.pm,v 1.153 2014/05/20 05:55:43 espie Exp $
+# $OpenBSD: Add.pm,v 1.154 2014/06/16 09:02:07 espie Exp $
#
# Copyright (c) 2003-2014 Marc Espie <espie@openbsd.org>
#
@@ -113,7 +113,34 @@ sub perform_extraction
$state->{partial} = $handle->{partial};
$state->{archive} = $handle->{location};
$state->{check_digest} = $handle->{plist}{check_digest};
- $state->progress->visit_with_size($handle->{plist}, 'extract', $state);
+ my ($wanted, $tied) = {};
+ $handle->{plist}->find_extractible($state, $wanted, $tied);
+ my $p = $state->progress->new_sizer($handle->{plist}, $state);
+ while (my $file = $state->{archive}->next) {
+ my $e = $tied->{$file->name};
+ if (defined $e) {
+ delete $tied->{$file->name};
+ $e->prepare_to_extract($state, $file);
+ $state->{archive}->skip;
+ $p->advance($e);
+ # skip to next;
+ }
+ $e = $wanted->{$file->name};
+ if (!defined $e) {
+ $state->Fatal("archive member not found #1",
+ $file->name);
+ }
+ delete $wanted->{$file->name};
+ $e->prepare_to_extract($state, $file);
+ $e->extract($state, $file);
+ $p->advance($e);
+ if (keys %$wanted == 0) {
+ return;
+ }
+ }
+ if (keys %$wanted > 0) {
+ $state->fatal("Truncated archive");
+ }
}
my $user_tagged = {};
@@ -181,6 +208,10 @@ sub prepare_for_addition
{
}
+sub find_extractible
+{
+}
+
sub extract
{
my ($self, $state) = @_;
@@ -236,6 +267,16 @@ sub set_modes
}
}
+package OpenBSD::PackingElement::Meta;
+
+# XXX stuff that's invisible to find_extractible should be considered extracted
+# for the most part, otherwise we create broken partial packages
+sub find_extractible
+{
+ my ($self, $state, $wanted, $tied) = @_;
+ $state->{partial}{$self} = 1;
+}
+
package OpenBSD::PackingElement::ExtraInfo;
use OpenBSD::Error;
@@ -360,6 +401,18 @@ use File::Basename;
use File::Path;
use OpenBSD::Temp;
+sub find_extractible
+{
+ my ($self, $state, $wanted, $tied) = @_;
+ $wanted->{$self->name} = $self;
+ return;
+ if ($self->{tied} || $self->{link} || $self->{symlink}) {
+ $tied->{$self->name} = $self;
+ } else {
+ $wanted->{$self->name} = $self;
+ }
+}
+
sub prepare_for_addition
{
my ($self, $state, $pkgname) = @_;
@@ -384,19 +437,11 @@ sub prepare_for_addition
sub prepare_to_extract
{
- my ($self, $state) = @_;
+ my ($self, $state, $file) = @_;
my $fullname = $self->fullname;
my $destdir = $state->{destdir};
- my $file=$state->{archive}->next;
- if (!defined $file) {
- $state->fatal("truncated archive");
- }
$file->{cwd} = $self->cwd;
- if (!$file->check_name($self)) {
- $state->fatal("archive does not match #1 != #2",
- $file->name, $self->name);
- }
if (defined $self->{symlink} || $file->isSymLink) {
unless (defined $self->{symlink} && $file->isSymLink) {
$state->fatal("bogus symlink #1", $self->name);
@@ -427,14 +472,11 @@ sub prepare_to_extract
if (defined $self->{symlink} && $state->{do_faked}) {
$file->{linkname} = $destdir.$file->{linkname};
}
- return $file;
}
sub extract
{
- my ($self, $state) = @_;
-
- my $file = $self->prepare_to_extract($state);
+ my ($self, $state, $file) = @_;
if (defined $self->{link} || defined $self->{symlink}) {
$state->{archive}->skip;
@@ -483,6 +525,7 @@ sub extract
$state->say("extracting #1", $tempname) if $state->verbose >= 3;
+
if (!$file->isFile) {
$state->fatal("can't extract #1, it's not a file",
$self->stringize);
@@ -560,6 +603,10 @@ sub prepare_for_addition
}
}
+sub find_extractible
+{
+}
+
sub extract
{
}