summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr.sbin/pkg_add/Makefile3
-rw-r--r--usr.sbin/pkg_add/OpenBSD/Add.pm17
-rw-r--r--usr.sbin/pkg_add/OpenBSD/ArcCheck.pm82
-rw-r--r--usr.sbin/pkg_add/pkg_create5
-rw-r--r--usr.sbin/pkg_add/pkg_merge7
5 files changed, 98 insertions, 16 deletions
diff --git a/usr.sbin/pkg_add/Makefile b/usr.sbin/pkg_add/Makefile
index 67bbdca7707..96ea294cc3c 100644
--- a/usr.sbin/pkg_add/Makefile
+++ b/usr.sbin/pkg_add/Makefile
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile,v 1.24 2005/06/28 20:34:55 espie Exp $
+# $OpenBSD: Makefile,v 1.25 2005/08/07 14:18:04 espie Exp $
.include <bsd.own.mk>
@@ -8,6 +8,7 @@ POD2MAN=/usr/bin/pod2man
PACKAGES= \
OpenBSD/Add.pm \
+ OpenBSD/ArcCheck.pm \
OpenBSD/CollisionReport.pm \
OpenBSD/Delete.pm \
OpenBSD/Error.pm \
diff --git a/usr.sbin/pkg_add/OpenBSD/Add.pm b/usr.sbin/pkg_add/OpenBSD/Add.pm
index 5b86a5efb91..09e82d4171c 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.34 2005/08/05 09:52:08 espie Exp $
+# $OpenBSD: Add.pm,v 1.35 2005/08/07 14:18:05 espie Exp $
#
# Copyright (c) 2003-2004 Marc Espie <espie@openbsd.org>
#
@@ -20,6 +20,7 @@ use warnings;
package OpenBSD::Add;
use OpenBSD::Error;
use OpenBSD::PackageInfo;
+use OpenBSD::ArcCheck;
use File::Copy;
sub manpages_index
@@ -342,10 +343,11 @@ sub prepare_to_extract
my $destdir = $state->{destdir};
my $file=$state->{archive}->next();
+ $file->{cwd} = $self->cwd();
if (!defined $file) {
Fatal "Error: truncated archive\n";
}
- if ($file->{name} ne $self->{name}) {
+ if (!$file->check_name($self->{name})) {
Fatal "Error: archive does not match ", $file->{name}, "!=",
$self->{name}, "\n";
}
@@ -353,7 +355,7 @@ sub prepare_to_extract
unless (defined $self->{symlink} && $file->isSymLink()) {
Fatal "Error: bogus symlink ", $self->{name}, "\n";
}
- if ($self->{symlink} ne $file->{linkname}) {
+ if (!$file->check_linkname($self->{symlink})) {
Fatal "Error: archive sl does not match ", $file->{linkname}, "!=",
$self->{symlink}, "\n";
}
@@ -361,18 +363,13 @@ sub prepare_to_extract
unless (defined $self->{link} && $file->isHardLink()) {
Fatal "Error: bogus hardlink ", $self->{name}, "\n";
}
- my $linkname = $file->{linkname};
- if (defined $self->{cwd}) {
- $linkname = $self->cwd().'/'.$linkname;
- }
- if ($self->{link} ne $linkname) {
- Fatal "Error: archive hl does not match ", $linkname, "!=",
+ if (!$file->check_linkname($self->{link})) {
+ Fatal "Error: archive hl does not match ", $file->{linkname}, "!=",
$self->{link}, "!!!\n";
}
}
$file->{name} = $fullname;
- $file->{cwd} = $self->cwd();
$file->{destdir} = $destdir;
# faked installation are VERY weird
if (defined $self->{symlink} && $state->{do_faked}) {
diff --git a/usr.sbin/pkg_add/OpenBSD/ArcCheck.pm b/usr.sbin/pkg_add/OpenBSD/ArcCheck.pm
new file mode 100644
index 00000000000..8e1702d86be
--- /dev/null
+++ b/usr.sbin/pkg_add/OpenBSD/ArcCheck.pm
@@ -0,0 +1,82 @@
+# ex:ts=8 sw=4:
+# $OpenBSD: ArcCheck.pm,v 1.1 2005/08/07 14:18:05 espie Exp $
+#
+# Copyright (c) 2005 Marc Espie <espie@openbsd.org>
+#
+# Permission to use, copy, modify, and distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+# Supplementary code to handle archives.
+
+package OpenBSD::Ustar::Object;
+
+sub check_name
+{
+ my ($self, $name) = @_;
+ return 1 if $self->{name} eq $name;
+ if ($self->{name} =~ m/^LongName\d+$/) {
+ $self->{name} = $name;
+ return 1;
+ }
+ return 0;
+}
+
+sub check_linkname
+{
+ my ($self, $linkname) = @_;
+ my $c = $self->{linkname};
+ if ($self->isHardLink() && defined $self->{cwd}) {
+ $c = $self->{cwd}.'/'.$c;
+ }
+ return 1 if $c eq $linkname;
+ if ($self->{linkname} =~ m/^Long(?:Link|Name)\d+$/) {
+ $self->{linkname} = $linkname;
+ if ($self->isHardLink() && defined $self->{cwd}) {
+ $self->{linkname} =~ s|^$self->{cwd}/||;
+ }
+ return 1;
+ }
+ return 0;
+}
+
+sub copy_long
+{
+ my ($self, $wrarc) = @_;
+ if ($self->{name} =~ m/^LongName(\d+)$/) {
+ $wrarc->{name_index} = $1 + 1;
+ }
+ if (length($self->{name}) > MAXFILENAME+MAXPREFIX+1) {
+ $wrarc->{name_index} = 0 if !defined $wrarc->{name_index};
+ $entry->{name} = 'LongName'.$wrarc->{name_index}++;
+ }
+ $self->copy($wrarc);
+}
+
+package OpenBSD::Ustar;
+
+sub prepare_long
+{
+ my ($self, $filename) = @_;
+ my $entry = $self->prepare($filename);
+ my ($prefix, $name) = split_name($entry->{name});
+ if (length($name) > MAXFILENAME || length($prefix) > MAXPREFIX) {
+ $self->{name_index} = 0 if !defined $self->{name_index};
+ $entry->{name} = 'LongName'.$self->{name_index}++;
+ }
+ if (length($entry->{linkname}) > MAXLINKNAME) {
+ $self->{linkname_index} = 0 if !defined $self->{linkname_index};
+ $entry->{linkname} = 'LongLink'.$self->{linkname_index}++;
+ }
+ return $entry;
+}
+
+1;
diff --git a/usr.sbin/pkg_add/pkg_create b/usr.sbin/pkg_add/pkg_create
index 5dd429c982b..8e5520b8d82 100644
--- a/usr.sbin/pkg_add/pkg_create
+++ b/usr.sbin/pkg_add/pkg_create
@@ -1,6 +1,6 @@
#! /usr/bin/perl
# ex:ts=8 sw=4:
-# $OpenBSD: pkg_create,v 1.35 2005/06/26 11:24:06 espie Exp $
+# $OpenBSD: pkg_create,v 1.36 2005/08/07 14:18:04 espie Exp $
#
# Copyright (c) 2003-2004 Marc Espie <espie@openbsd.org>
#
@@ -25,6 +25,7 @@ use OpenBSD::md5;
use OpenBSD::Temp;
use OpenBSD::Error;
use OpenBSD::Ustar;
+use OpenBSD::ArcCheck;
use Symbol;
use File::Basename;
@@ -40,7 +41,7 @@ sub archive
my ($self, $arc, $base, $verbose) = @_;
if (defined $arc) {
- my $o = $arc->prepare($self->{name});
+ my $o = $arc->prepare_long($self->{name});
$o->write();
}
if ($verbose) {
diff --git a/usr.sbin/pkg_add/pkg_merge b/usr.sbin/pkg_add/pkg_merge
index bd3cab8723b..9b71291b599 100644
--- a/usr.sbin/pkg_add/pkg_merge
+++ b/usr.sbin/pkg_add/pkg_merge
@@ -20,6 +20,7 @@ use OpenBSD::PackingList;
use OpenBSD::Getopt;
use OpenBSD::Error;
use OpenBSD::Ustar;
+use OpenBSD::ArcCheck;
use File::Copy;
use File::Path;
@@ -40,18 +41,18 @@ sub copy_over
{
my ($self, $wrarc, $prefix, $pkg) = @_;
my $e = $pkg->{pkg}->next();
- if ($e->{name} ne $self->{name}) {
+ if (!$e->check_name($self->{name})) {
die "Names don't match: ", $e->{name}, " ", $self->{name};
}
$e->{name} = $prefix."/".$e->{name};
- $e->copy($wrarc);
+ $e->copy_long($wrarc);
}
sub make_alias
{
my ($self, $wrarc, $prefix, $pkg, $alias) = @_;
my $e = $pkg->{pkg}->next();
- if ($e->{name} ne $self->{name}) {
+ if (!$e->check_name($self->{name})) {
die "Names don't match: ", $e->{name}, " ", $self->{name};
}
$e->{name} = $prefix."/".$e->{name};