/*
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.
#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);
}