summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMasafumi Nakayama <MASA23@jp.ibm.com>2011-11-02 10:35:19 +0100
committerDavid Disseldorp <ddiss@samba.org>2012-01-03 18:31:28 +0100
commit909056a2daacd961b40158b86bc117650a897054 (patch)
tree94c3fe47d6d07d717fc295c52289ae931628a1a7
parentcd3a935d0e170cf82ac16ee99affab4950fe0b72 (diff)
downloadsamba-909056a2daacd961b40158b86bc117650a897054.tar.gz
samba-909056a2daacd961b40158b86bc117650a897054.tar.bz2
samba-909056a2daacd961b40158b86bc117650a897054.zip
s3-cli: fix bug 563, >8GB tar on BE machines
Borrows on existing patches proposed by Craig Barratt and Brad Ellis. Signed-off-by: David Disseldorp <ddiss@suse.de> Autobuild-User: David Disseldorp <ddiss@samba.org> Autobuild-Date: Tue Jan 3 18:31:28 CET 2012 on sn-devel-104
-rw-r--r--source3/client/clitar.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/source3/client/clitar.c b/source3/client/clitar.c
index 594392672a..bf18e54f61 100644
--- a/source3/client/clitar.c
+++ b/source3/client/clitar.c
@@ -188,8 +188,10 @@ static void writetarheader(int f, const char *aname, uint64_t size, time_t mtime
memset(hb.dbuf.size, 0, 4);
hb.dbuf.size[0]=128;
- for (i = 8, jp=(char*)&size; i; i--)
- hb.dbuf.size[i+3] = *(jp++);
+ for (i = 8; i; i--) {
+ hb.dbuf.size[i+3] = size & 0xff;
+ size >>= 8;
+ }
}
oct_it((uint64_t) mtime, 13, hb.dbuf.mtime);
memcpy(hb.dbuf.chksum, " ", sizeof(hb.dbuf.chksum));
@@ -291,7 +293,17 @@ of link other than a GNUtar Longlink - ignoring\n"));
finfo->mtime_ts = finfo->ctime_ts =
convert_time_t_to_timespec((time_t)strtol(hb->dbuf.mtime, NULL, 8));
finfo->atime_ts = convert_time_t_to_timespec(time(NULL));
- finfo->size = unoct(hb->dbuf.size, sizeof(hb->dbuf.size));
+ if ((hb->dbuf.size[0] & 0xff) == 0x80) {
+ /* This is a non-POSIX compatible extention to extract files
+ greater than 8GB. */
+ finfo->size = 0;
+ for (i = 0; i < 8; i++) {
+ finfo->size <<= 8;
+ finfo->size |= hb->dbuf.size[i+4] & 0xff;
+ }
+ } else {
+ finfo->size = unoct(hb->dbuf.size, sizeof(hb->dbuf.size));
+ }
return True;
}
@@ -1005,8 +1017,8 @@ static int skip_file(int skipsize)
static int get_file(file_info2 finfo)
{
uint16_t fnum = (uint16_t) -1;
- int pos = 0, dsize = 0, bpos = 0;
- uint64_t rsize = 0;
+ int dsize = 0, bpos = 0;
+ uint64_t rsize = 0, pos = 0;
NTSTATUS status;
DEBUG(5, ("get_file: file: %s, size %.0f\n", finfo.name, (double)finfo.size));