- fixed configure.pl and makeDist.
[BackupPC.git] / bin / BackupPC_tarExtract
index 270776f..55217b9 100755 (executable)
@@ -27,7 +27,7 @@
 #
 #========================================================================
 #
-# Version 2.1.0, released 20 Jun 2004.
+# Version 3.0.0alpha, released 23 Jan 2006.
 #
 # See http://backuppc.sourceforge.net.
 #
@@ -36,6 +36,7 @@
 use strict;
 no  utf8;
 use lib "/usr/local/BackupPC/lib";
+use Encode qw/from_to/;
 use BackupPC::Lib;
 use BackupPC::Attrib qw(:all);
 use BackupPC::FileZIO;
@@ -58,7 +59,7 @@ if ( $ARGV[0] !~ /^([\w\.\s-]+)$/ ) {
     exit(1);
 }
 my $client = $1;
-if ( $ARGV[1] !~ /^([\w\s\.\/\$-]+)$/ ) {
+if ( $ARGV[1] !~ /^([\w\s.\/$(){}[\]-]+)$/ ) {
     print("$0: bad share name '$ARGV[1]'\n");
     exit(1);
 }
@@ -101,7 +102,7 @@ $SIG{TTIN} = \&catch_signal;
 #                 Copyright 1998 Stephen Zander. All rights reserved.
 #
 my $tar_unpack_header
-    = 'Z100 A8 A8 A8 A12 A12 A8 A1 Z100 A6 A2 Z32 Z32 A8 A8 A155 x12';
+    = 'Z100 A8 A8 A8 a12 A12 A8 A1 Z100 A6 A2 Z32 Z32 A8 A8 A155 x12';
 my $tar_header_length = 512;
 
 my $BufSize  = 1048576;     # 1MB or 2^20
@@ -250,8 +251,19 @@ sub TarReadFileInfo
                 $name, $mode, $size, $type) if ( $Conf{XferLogLevel} >= 3 );
         $name     = $longName if ( defined($longName) );
         $linkname = $longLink if ( defined($longLink) );
+
+        #
+        # Map client charset encodings to utf8
+        #
+        # printf("File $name (hex: %s)\n", unpack("H*", $name));
+        if ( $Conf{ClientCharset} ne "" ) {
+            from_to($name, $Conf{ClientCharset}, "utf8");
+            from_to($linkname, $Conf{ClientCharset}, "utf8");
+        }
+        # printf("File now $name (hex: %s)\n", unpack("H*", $name));
+
         $name     =~ s{^\./+}{};
-        $name     =~ s{/+$}{};
+        $name     =~ s{/+\.?$}{};
         $name     =~ s{//+}{/}g;
         return {
             name       => $name,
@@ -487,15 +499,21 @@ sub logFileAction
 #
 sub pathCreate
 {
-    my($dir, $file, $f) = @_;
+    my($dir, $fullPath, $f) = @_;
 
     #
-    # Get parent directory of each of $dir and $file
+    # Get parent directory of each of $dir and $fullPath
     #
-    $dir  =~ s{/[^/]*$}{};
-    $file =~ s{/[^/]*$}{};
-    return if ( -d $file );
-    mkpath($file, 0, 0777);
+    # print("pathCreate: dir = $dir, fullPath = $fullPath\n");
+    $dir      =~ s{/([^/]*)$}{};
+    my $file  = $bpc->fileNameUnmangle($1);
+    $fullPath =~ s{/[^/]*$}{};
+    return if ( -d $fullPath || $file eq "" );
+    unlink($fullPath) if ( -e $fullPath );
+    mkpath($fullPath, 0, 0777);
+    $Attrib{$dir} = BackupPC::Attrib->new({ compress => $Compress })
+                                if ( !defined($Attrib{$dir}) );
+    # print("pathCreate: adding file = $file to dir = $dir\n");
     $Attrib{$dir}->set($file, {
                             type  => BPC_FTYPE_DIR,
                             mode  => 0755,