ArcCheck.pm revision 1.3
1# ex:ts=8 sw=4: 2# $OpenBSD: ArcCheck.pm,v 1.3 2005/09/24 12:52:19 espie Exp $ 3# 4# Copyright (c) 2005 Marc Espie <espie@openbsd.org> 5# 6# Permission to use, copy, modify, and distribute this software for any 7# purpose with or without fee is hereby granted, provided that the above 8# copyright notice and this permission notice appear in all copies. 9# 10# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 18# Supplementary code to handle archives. 19 20package OpenBSD::Ustar::Object; 21 22sub check_name 23{ 24 my ($self, $item) = @_; 25 return 1 if $self->{name} eq $item->{name}; 26 if ($self->{name} =~ m/^LongName\d+$/) { 27 $self->{name} = $item->{name}; 28 return 1; 29 } 30 return 0; 31} 32 33sub check_linkname 34{ 35 my ($self, $linkname) = @_; 36 my $c = $self->{linkname}; 37 if ($self->isHardLink() && defined $self->{cwd}) { 38 $c = $self->{cwd}.'/'.$c; 39 } 40 return 1 if $c eq $linkname; 41 if ($self->{linkname} =~ m/^Long(?:Link|Name)\d+$/) { 42 $self->{linkname} = $linkname; 43 if ($self->isHardLink() && defined $self->{cwd}) { 44 $self->{linkname} =~ s|^$self->{cwd}/||; 45 } 46 return 1; 47 } 48 return 0; 49} 50 51sub copy_long 52{ 53 my ($self, $wrarc) = @_; 54 if ($self->{name} =~ m/^LongName(\d+)$/) { 55 $wrarc->{name_index} = $1 + 1; 56 } 57 if (length($self->{name}) > MAXFILENAME+MAXPREFIX+1) { 58 $wrarc->{name_index} = 0 if !defined $wrarc->{name_index}; 59 $entry->{name} = 'LongName'.$wrarc->{name_index}++; 60 } 61 $self->copy($wrarc); 62} 63 64package OpenBSD::Ustar; 65 66sub prepare_long 67{ 68 my ($self, $item) = @_; 69 my $filename = $item->{name}; 70 my $entry = $self->prepare($filename); 71 if (!defined $entry->{uname}) { 72 die "No user name for ", $entry->{name}, " (uid ", $entry->{uid}, ")\n"; 73 } 74 if (!defined $entry->{gname}) { 75 die "No group name for ", $entry->{name}, " (gid ", $entry->{gid}. "\n"; 76 } 77 my ($prefix, $name) = split_name($entry->{name}); 78 if (length($name) > MAXFILENAME || length($prefix) > MAXPREFIX) { 79 $self->{name_index} = 0 if !defined $self->{name_index}; 80 $entry->{name} = 'LongName'.$self->{name_index}++; 81 } 82 if (length($entry->{linkname}) > MAXLINKNAME) { 83 $self->{linkname_index} = 0 if !defined $self->{linkname_index}; 84 $entry->{linkname} = 'LongLink'.$self->{linkname_index}++; 85 } 86 return $entry; 87} 88 891; 90