- fixed configure.pl and makeDist.
[BackupPC.git] / bin / BackupPC_tarCreate
index 071de33..97b9878 100755 (executable)
@@ -23,6 +23,8 @@
 #       -p pathAdd      new path prefix
 #       -b BLOCKS       BLOCKS x 512 bytes per record (default 20; same as tar)
 #       -w writeBufSz   write buffer size (default 1MB)
 #       -p pathAdd      new path prefix
 #       -b BLOCKS       BLOCKS x 512 bytes per record (default 20; same as tar)
 #       -w writeBufSz   write buffer size (default 1MB)
+#       -e charset      charset for encoding file names (default: value of
+#                       $Conf{ClientCharset} when backup was done)
 #
 #     The -h, -n and -s options specify which dump is used to generate
 #     the tar archive.  The -r and -p options can be used to relocate
 #
 #     The -h, -n and -s options specify which dump is used to generate
 #     the tar archive.  The -r and -p options can be used to relocate
@@ -51,7 +53,7 @@
 #
 #========================================================================
 #
 #
 #========================================================================
 #
-# Version 2.1.0, released 20 Jun 2004.
+# Version 3.0.0alpha, released 23 Jan 2006.
 #
 # See http://backuppc.sourceforge.net.
 #
 #
 # See http://backuppc.sourceforge.net.
 #
@@ -62,19 +64,17 @@ no  utf8;
 use lib "/usr/local/BackupPC/lib";
 use File::Path;
 use Getopt::Std;
 use lib "/usr/local/BackupPC/lib";
 use File::Path;
 use Getopt::Std;
+use Encode qw/from_to/;
 use BackupPC::Lib;
 use BackupPC::Attrib qw(:all);
 use BackupPC::FileZIO;
 use BackupPC::View;
 
 die("BackupPC::Lib->new failed\n") if ( !(my $bpc = BackupPC::Lib->new) );
 use BackupPC::Lib;
 use BackupPC::Attrib qw(:all);
 use BackupPC::FileZIO;
 use BackupPC::View;
 
 die("BackupPC::Lib->new failed\n") if ( !(my $bpc = BackupPC::Lib->new) );
-my $TopDir = $bpc->TopDir();
-my $BinDir = $bpc->BinDir();
-my %Conf   = $bpc->Conf();
 
 my %opts;
 
 
 my %opts;
 
-if ( !getopts("th:n:p:r:s:b:w:", \%opts) || @ARGV < 1 ) {
+if ( !getopts("te:h:n:p:r:s:b:w:", \%opts) || @ARGV < 1 ) {
     print STDERR <<EOF;
 usage: $0 [options] files/directories...
   Required options:
     print STDERR <<EOF;
 usage: $0 [options] files/directories...
   Required options:
@@ -90,6 +90,8 @@ usage: $0 [options] files/directories...
      -p pathAdd      new path prefix
      -b BLOCKS       BLOCKS x 512 bytes per record (default 20; same as tar)
      -w writeBufSz   write buffer size (default 1048576 = 1MB)
      -p pathAdd      new path prefix
      -b BLOCKS       BLOCKS x 512 bytes per record (default 20; same as tar)
      -w writeBufSz   write buffer size (default 1048576 = 1MB)
+     -e charset      charset for encoding file names (default: value of
+                     \$Conf{ClientCharset} when backup was done)
 EOF
     exit(1);
 }
 EOF
     exit(1);
 }
@@ -123,12 +125,16 @@ if ( $i >= @Backups ) {
     exit(1);
 }
 
     exit(1);
 }
 
+my $Charset = $Backups[$i]{charset};
+$Charset = $opts{e} if ( $opts{e} ne "" );
+
 my $PathRemove = $1 if ( $opts{r} =~ /(.+)/ );
 my $PathAdd    = $1 if ( $opts{p} =~ /(.+)/ );
 my $PathRemove = $1 if ( $opts{r} =~ /(.+)/ );
 my $PathAdd    = $1 if ( $opts{p} =~ /(.+)/ );
-if ( $opts{s} !~ /^([\w\s\.\/\$-]+)$/ && $opts{s} ne "*" ) {
+if ( $opts{s} !~ /^([\w\s.\/$(){}[\]-]+)$/ && $opts{s} ne "*" ) {
     print(STDERR "$0: bad share name '$opts{s}'\n");
     exit(1);
 }
     print(STDERR "$0: bad share name '$opts{s}'\n");
     exit(1);
 }
+
 our $ShareName = $opts{s};
 our $view = BackupPC::View->new($bpc, $Host, \@Backups);
 
 our $ShareName = $opts{s};
 our $view = BackupPC::View->new($bpc, $Host, \@Backups);
 
@@ -227,7 +233,7 @@ sub archiveWrite
 #
 sub archiveWriteHardLinks
 {
 #
 sub archiveWriteHardLinks
 {
-    my $fh = @_;
+    my($fh) = @_;
     foreach my $hdr ( @HardLinks ) {
         $hdr->{size} = 0;
        my $name = $hdr->{linkname};
     foreach my $hdr ( @HardLinks ) {
         $hdr->{size} = 0;
        my $name = $hdr->{linkname};
@@ -360,6 +366,14 @@ sub TarWriteFileInfo
 {
     my($fh, $hdr) = @_;
 
 {
     my($fh, $hdr) = @_;
 
+    #
+    # Convert path names to requested (eg: client) charset
+    #
+    if ( $Charset ne "" ) {
+        from_to($hdr->{name},     "utf8", $Charset);
+        from_to($hdr->{linkname}, "utf8", $Charset);
+    }
+
     #
     # Handle long link names (symbolic links)
     #
     #
     # Handle long link names (symbolic links)
     #
@@ -373,6 +387,7 @@ sub TarWriteFileInfo
         TarWrite($fh, \$data);
         TarWritePad($fh, length($data));
     }
         TarWrite($fh, \$data);
         TarWritePad($fh, length($data));
     }
+
     #
     # Handle long file names
     #
     #
     # Handle long file names
     #
@@ -483,6 +498,7 @@ sub TarWriteFile
            $done = 1;
        } else {
            foreach my $arg ( @ARGV ) {
            $done = 1;
        } else {
            foreach my $arg ( @ARGV ) {
+               $arg = "/" if ( $arg eq "." );
                $arg =~ s{^\./+}{/};
                $arg =~ s{/+$}{};
                $done = 1 if ( $name eq $arg || $name =~ /^\Q$arg\// );
                $arg =~ s{^\./+}{/};
                $arg =~ s{/+$}{};
                $done = 1 if ( $name eq $arg || $name =~ /^\Q$arg\// );
@@ -504,7 +520,7 @@ sub TarWriteFile
             my $name = $hdr->{linkname};
             $name =~ s{^\./}{/};
            $HardLinkExtraFiles{$name} = $hdr->{name};
             my $name = $hdr->{linkname};
             $name =~ s{^\./}{/};
            $HardLinkExtraFiles{$name} = $hdr->{name};
-           archiveWrite($fh, $hdr->{linkname}, $hdr->{name});
+           archiveWrite($fh, $name, $hdr->{name});
        }
     } elsif ( $hdr->{type} == BPC_FTYPE_SYMLINK ) {
         #
        }
     } elsif ( $hdr->{type} == BPC_FTYPE_SYMLINK ) {
         #