X-Git-Url: http://git.rot13.org/?p=BackupPC.git;a=blobdiff_plain;f=bin%2FBackupPC_tarCreate;h=b04464a41de1cb34c90bc544e3868879a94b0871;hp=d0f4fe71a1f80faa702c842f4d0a166919b67599;hb=bc72241a845cd61a6386ec1394ca9d49c3fae3de;hpb=4cdaa6b8a9f5161ee2da4371d68cbbad41248ea0 diff --git a/bin/BackupPC_tarCreate b/bin/BackupPC_tarCreate index d0f4fe7..b04464a 100755 --- a/bin/BackupPC_tarCreate +++ b/bin/BackupPC_tarCreate @@ -1,4 +1,4 @@ -#!/bin/perl +#!/usr/bin/perl #============================================================= -*-perl-*- # # BackupPC_tarCreate: create a tar archive of an existing dump @@ -21,10 +21,12 @@ # -t print summary totals # -r pathRemove path prefix that will be replaced with pathAdd # -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) +# -b BLOCKS output write buffer size in 512-byte blocks (default 20; same as tar) +# -w readBufSz buffer size for reading files (default 1048576 = 1MB) # -e charset charset for encoding file names (default: value of # $Conf{ClientCharset} when backup was done) +# -l just print a file listing; don't generate an archive +# -L just print a detailed file listing; don't generate an archive # # 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 @@ -35,7 +37,7 @@ # Craig Barratt # # COPYRIGHT -# Copyright (C) 2001-2003 Craig Barratt +# Copyright (C) 2001-2009 Craig Barratt # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -53,7 +55,7 @@ # #======================================================================== # -# Version 3.0.0beta0, released 11 Jul 2006. +# Version 3.2.0, released 31 Jul 2010. # # See http://backuppc.sourceforge.net. # @@ -74,7 +76,7 @@ die("BackupPC::Lib->new failed\n") if ( !(my $bpc = BackupPC::Lib->new) ); my %opts; -if ( !getopts("te:h:n:p:r:s:b:w:", \%opts) || @ARGV < 1 ) { +if ( !getopts("Llte:h:n:p:r:s:b:w:i", \%opts) || @ARGV < 1 ) { print STDERR <Conf; +if ( $Conf{TarCreateIncremental} || $opts{i} ) { + warn "# incremental dump"; + $view_opts = { only_first => 1 }; +} + our $ShareName = $opts{s}; -our $view = BackupPC::View->new($bpc, $Host, \@Backups); +our $view = BackupPC::View->new($bpc, $Host, \@Backups, $view_opts); # # This constant and the line of code below that uses it are borrowed @@ -183,13 +196,15 @@ if ( $ShareName eq "*" ) { archiveWriteHardLinks($fh); } -# -# Finish with two null 512 byte headers, and then round out a full -# block. -# -my $data = "\0" x ($tar_header_length * 2); -TarWrite($fh, \$data); -TarWrite($fh, undef); +if ( !$opts{l} && !$opts{L} ) { + # + # Finish with two null 512 byte headers, and then round out a full + # block. + # + my $data = "\0" x ($tar_header_length * 2); + TarWrite($fh, \$data); + TarWrite($fh, undef); +} # # print out totals if requested @@ -376,6 +391,28 @@ sub TarWriteFileInfo from_to($hdr->{linkname}, "utf8", $Charset); } + if ( $opts{l} ) { + print($hdr->{name} . "\n"); + return; + } elsif ( $opts{L} ) { + my $owner = "$hdr->{uid}/$hdr->{gid}"; + + my $name = $hdr->{name}; + + if ( $hdr->{type} == BPC_FTYPE_SYMLINK + || $hdr->{type} == BPC_FTYPE_HARDLINK ) { + $name .= " -> $hdr->{linkname}"; + } + $name =~ s/\n/\\n/g; + + printf("%6o %9s %11.0f %s\n", + $hdr->{mode}, + $owner, + $hdr->{size}, + $name); + return; + } + # # Handle long link names (symbolic links) # @@ -433,6 +470,7 @@ sub TarWriteFile TarWriteFileInfo($fh, $hdr); $DirCnt++; } elsif ( $hdr->{type} == BPC_FTYPE_FILE ) { + my($data, $size); # # Regular file: write the header and file # @@ -443,31 +481,34 @@ sub TarWriteFile return; } TarWriteFileInfo($fh, $hdr); - my($data, $size); - while ( $f->read(\$data, $BufSize) > 0 ) { - if ( $size + length($data) > $hdr->{size} ) { - print(STDERR "Error: truncating $hdr->{fullPath} to" - . " $hdr->{size} bytes\n"); - $data = substr($data, 0, $hdr->{size} - $size); - $ErrorCnt++; - } - TarWrite($fh, \$data); - $size += length($data); - } - $f->close; - if ( $size != $hdr->{size} ) { - print(STDERR "Error: padding $hdr->{fullPath} to $hdr->{size}" - . " bytes from $size bytes\n"); - $ErrorCnt++; - while ( $size < $hdr->{size} ) { - my $len = $hdr->{size} - $size; - $len = $BufSize if ( $len > $BufSize ); - $data = "\0" x $len; + if ( $opts{l} || $opts{L} ) { + $size = $hdr->{size}; + } else { + while ( $f->read(\$data, $BufSize) > 0 ) { + if ( $size + length($data) > $hdr->{size} ) { + print(STDERR "Error: truncating $hdr->{fullPath} to" + . " $hdr->{size} bytes\n"); + $data = substr($data, 0, $hdr->{size} - $size); + $ErrorCnt++; + } TarWrite($fh, \$data); - $size += $len; + $size += length($data); } + $f->close; + if ( $size != $hdr->{size} ) { + print(STDERR "Error: padding $hdr->{fullPath} to $hdr->{size}" + . " bytes from $size bytes\n"); + $ErrorCnt++; + while ( $size < $hdr->{size} ) { + my $len = $hdr->{size} - $size; + $len = $BufSize if ( $len > $BufSize ); + $data = "\0" x $len; + TarWrite($fh, \$data); + $size += $len; + } + } + TarWritePad($fh, $size); } - TarWritePad($fh, $size); $FileCnt++; $ByteCnt += $size; } elsif ( $hdr->{type} == BPC_FTYPE_HARDLINK ) { @@ -503,7 +544,7 @@ sub TarWriteFile $arg = "/" if ( $arg eq "." ); $arg =~ s{^\./+}{/}; $arg =~ s{/+$}{}; - $done = 1 if ( $name eq $arg || $name =~ /^\Q$arg\// ); + $done = 1 if ( $name eq $arg || $name =~ /^\Q$arg\// || $arg eq "" ); } } if ( $done ) { @@ -570,6 +611,12 @@ sub TarWriteFile $hdr->{size} = 0; TarWriteFileInfo($fh, $hdr); $SpecialCnt++; + } elsif ( $hdr->{type} == BPC_FTYPE_SOCKET + || $hdr->{type} == BPC_FTYPE_UNKNOWN ) { + # + # ignore these two file types - these are dynamic file types created + # by applications as needed + # } else { print(STDERR "Got unknown type $hdr->{type} for $hdr->{name}\n"); $ErrorCnt++;