/*
Bacula® - The Network Backup Solution
- Copyright (C) 2002-2010 Free Software Foundation Europe e.V.
+ Copyright (C) 2002-2011 Free Software Foundation Europe e.V.
The main author of Bacula is Kern Sibbald, with contributions from
many others, a complete list can be found in the file AUTHORS.
This program is Free Software; you can redistribute it and/or
- modify it under the terms of version two of the GNU General Public
+ modify it under the terms of version three of the GNU Affero General Public
License as published by the Free Software Foundation and included
in the file LICENSE.
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
- You should have received a copy of the GNU General Public License
+ You should have received a copy of the GNU Affero General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
#include "bacula.h"
#include "find.h"
+#include "ch.h"
static uid_t my_uid = 1;
static gid_t my_gid = 1;
} else {
stream = STREAM_FILE_DATA;
}
+ if (ff_pkt->flags & FO_OFFSETS) {
+ stream = STREAM_SPARSE_DATA;
+ }
/** Encryption is only supported for file data */
if (stream != STREAM_FILE_DATA && stream != STREAM_WIN32_DATA &&
/** Compression is not supported for Mac fork data */
if (stream == STREAM_MACOS_FORK_DATA) {
- ff_pkt->flags &= ~FO_GZIP;
+ ff_pkt->flags &= ~FO_COMPRESS;
}
/**
* Handle compression and encryption options
*/
-#ifdef HAVE_LIBZ
- if (ff_pkt->flags & FO_GZIP) {
- switch (stream) {
- case STREAM_WIN32_DATA:
- stream = STREAM_WIN32_GZIP_DATA;
- break;
- case STREAM_SPARSE_DATA:
- stream = STREAM_SPARSE_GZIP_DATA;
- break;
- case STREAM_FILE_DATA:
- stream = STREAM_GZIP_DATA;
- break;
- default:
- /**
- * All stream types that do not support gzip should clear out
- * FO_GZIP above, and this code block should be unreachable.
- */
- ASSERT(!(ff_pkt->flags & FO_GZIP));
- return STREAM_NONE;
- }
+#if defined(HAVE_LIBZ) || defined(HAVE_LZO)
+ if (ff_pkt->flags & FO_COMPRESS) {
+ #ifdef HAVE_LIBZ
+ if(ff_pkt->Compress_algo == COMPRESS_GZIP) {
+ switch (stream) {
+ case STREAM_WIN32_DATA:
+ stream = STREAM_WIN32_GZIP_DATA;
+ break;
+ case STREAM_SPARSE_DATA:
+ stream = STREAM_SPARSE_GZIP_DATA;
+ break;
+ case STREAM_FILE_DATA:
+ stream = STREAM_GZIP_DATA;
+ break;
+ default:
+ /**
+ * All stream types that do not support compression should clear out
+ * FO_COMPRESS above, and this code block should be unreachable.
+ */
+ ASSERT(!(ff_pkt->flags & FO_COMPRESS));
+ return STREAM_NONE;
+ }
+ }
+ #endif
+ #ifdef HAVE_LZO
+ if(ff_pkt->Compress_algo == COMPRESS_LZO1X) {
+ switch (stream) {
+ case STREAM_WIN32_DATA:
+ stream = STREAM_WIN32_COMPRESSED_DATA;
+ break;
+ case STREAM_SPARSE_DATA:
+ stream = STREAM_SPARSE_COMPRESSED_DATA;
+ break;
+ case STREAM_FILE_DATA:
+ stream = STREAM_COMPRESSED_DATA;
+ break;
+ default:
+ /**
+ * All stream types that do not support compression should clear out
+ * FO_COMPRESS above, and this code block should be unreachable.
+ */
+ ASSERT(!(ff_pkt->flags & FO_COMPRESS));
+ return STREAM_NONE;
+ }
+ }
+ #endif
}
#endif
#ifdef HAVE_CRYPTO
case STREAM_WIN32_GZIP_DATA:
stream = STREAM_ENCRYPTED_WIN32_GZIP_DATA;
break;
+ case STREAM_WIN32_COMPRESSED_DATA:
+ stream = STREAM_ENCRYPTED_WIN32_COMPRESSED_DATA;
+ break;
case STREAM_FILE_DATA:
stream = STREAM_ENCRYPTED_FILE_DATA;
break;
case STREAM_GZIP_DATA:
stream = STREAM_ENCRYPTED_FILE_GZIP_DATA;
break;
+ case STREAM_COMPRESSED_DATA:
+ stream = STREAM_ENCRYPTED_FILE_COMPRESSED_DATA;
+ break;
default:
/* All stream types that do not support encryption should clear out
* FO_ENCRYPT above, and this code block should be unreachable. */
* them in the encode_attribsEx() subroutine, but this is
* not recommended.
*/
-void encode_stat(char *buf, struct stat *statp, int32_t LinkFI, int data_stream)
+void encode_stat(char *buf, struct stat *statp, int stat_size, int32_t LinkFI, int data_stream)
{
char *p = buf;
+ /*
+ * We read the stat packet so make sure the caller's conception
+ * is the same as ours. They can be different if LARGEFILE is not
+ * the same when compiling this library and the calling program.
+ */
+ ASSERT(stat_size == (int)sizeof(struct stat));
+
/**
* Encode a stat packet. I should have done this more intelligently
* with a length so that it could be easily expanded.
/** Decode a stat packet from base64 characters */
-int decode_stat(char *buf, struct stat *statp, int32_t *LinkFI)
+int decode_stat(char *buf, struct stat *statp, int stat_size, int32_t *LinkFI)
{
char *p = buf;
int64_t val;
+ /*
+ * We store into the stat packet so make sure the caller's conception
+ * is the same as ours. They can be different if LARGEFILE is not
+ * the same when compiling this library and the calling program.
+ */
+ ASSERT(stat_size == (int)sizeof(struct stat));
+
p += from_base64(&val, p);
plug(statp->st_dev, val);
p++;
}
/** Decode a LinkFI field of encoded stat packet */
-int32_t decode_LinkFI(char *buf, struct stat *statp)
+int32_t decode_LinkFI(char *buf, struct stat *statp, int stat_size)
{
char *p = buf;
int64_t val;
+ /*
+ * We store into the stat packet so make sure the caller's conception
+ * is the same as ours. They can be different if LARGEFILE is not
+ * the same when compiling this library and the calling program.
+ */
+ ASSERT(stat_size == (int)sizeof(struct stat));
skip_nonspaces(&p); /* st_dev */
p++; /* skip space */
return true;
}
if (attr->data_stream == STREAM_WIN32_DATA ||
- attr->data_stream == STREAM_WIN32_GZIP_DATA) {
+ attr->data_stream == STREAM_WIN32_GZIP_DATA ||
+ attr->data_stream == STREAM_WIN32_COMPRESSED_DATA) {
if (is_bopen(ofd)) {
bclose(ofd);
}