aboutsummaryrefslogtreecommitdiffstats
path: root/g10/compress.c
diff options
context:
space:
mode:
authorDavid Shaw <[email protected]>2003-10-31 05:39:02 +0000
committerDavid Shaw <[email protected]>2003-10-31 05:39:02 +0000
commit869c6bb7e455c91680bad8c2649bcfcdacfc4e7d (patch)
tree02e5d7eaacfbe5dfd6f5485b73c24f0332638877 /g10/compress.c
parent* cipher.h: Add COMPRESS_ALGO_BZIP2. (diff)
downloadgnupg-869c6bb7e455c91680bad8c2649bcfcdacfc4e7d.tar.gz
gnupg-869c6bb7e455c91680bad8c2649bcfcdacfc4e7d.zip
* misc.c (compress_algo_to_string, string_to_compress_algo,
check_compress_algo): Add bzip2. * compress.c (compress_filter): Make static to help force the use of push_compress_filter. Remove default algorithm setting since that is done in push_compress_filter now. * main.h: Use named algorithm. * filter.h, compress.c (push_compress_filter, push_compress_filter2): New. Figure out which is the appropriate compression filter to use, and push it into place. * compress.c (handle_compressed), encode.c (encode_simple, encode_crypt), sign.c (sign_file, sign_symencrypt_file), import.c (read_block), export.c (do_export): Use push_compress_filter instead of pushing the compression filter ourselves. * compress-bz2.c: New. Bzlib versions of the compression filter routines. * Makefile.am: Include compress-bz2.c if bz2lib is available.
Diffstat (limited to 'g10/compress.c')
-rw-r--r--g10/compress.c60
1 files changed, 50 insertions, 10 deletions
diff --git a/g10/compress.c b/g10/compress.c
index 8d9327cc3..80878835a 100644
--- a/g10/compress.c
+++ b/g10/compress.c
@@ -1,5 +1,6 @@
/* compress.c - compress filter
- * Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002,
+ * 2003 Free Software Foundation, Inc.
*
* This file is part of GnuPG.
*
@@ -18,6 +19,12 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
+/* Note that the code in compress-bz2.c is nearly identical to the
+ code here, so if you fix a bug here, look there to see if the
+ matching bug needs to be fixed. I tried to have one set of
+ functions that could do ZIP, ZLIB, and BZIP2, but it became
+ dangerously unreadable with #ifdefs and if(algo) -dshaw */
+
#include <config.h>
#include <stdio.h>
#include <stdlib.h>
@@ -37,6 +44,9 @@
#include "main.h"
#include "options.h"
+int compress_filter_bz2( void *opaque, int control,
+ IOBUF a, byte *buf, size_t *ret_len);
+
static void
init_compress( compress_filter_context_t *zfx, z_stream *zs )
{
@@ -208,7 +218,7 @@ do_uncompress( compress_filter_context_t *zfx, z_stream *zs,
return rc;
}
-int
+static int
compress_filter( void *opaque, int control,
IOBUF a, byte *buf, size_t *ret_len)
{
@@ -237,10 +247,8 @@ compress_filter( void *opaque, int control,
if( !zfx->status ) {
PACKET pkt;
PKT_compressed cd;
-
- if( !zfx->algo )
- zfx->algo = DEFAULT_COMPRESS_ALGO;
- if( zfx->algo != 1 && zfx->algo != 2 )
+ if(zfx->algo != COMPRESS_ALGO_ZIP
+ && zfx->algo != COMPRESS_ALGO_ZLIB)
BUG();
memset( &cd, 0, sizeof cd );
cd.len = 0;
@@ -308,12 +316,12 @@ handle_compressed( void *procctx, PKT_compressed *cd,
compress_filter_context_t *cfx;
int rc;
- if( cd->algorithm < 1 || cd->algorithm > 2 )
- return G10ERR_COMPR_ALGO;
+ if(check_compress_algo(cd->algorithm))
+ return G10ERR_COMPR_ALGO;
cfx = m_alloc_clear (sizeof *cfx);
- cfx->algo = cd->algorithm;
cfx->release = release_context;
- iobuf_push_filter( cd->buf, compress_filter, cfx );
+ cfx->algo = cd->algorithm;
+ push_compress_filter(cd->buf,cfx,cd->algorithm);
if( callback )
rc = callback(cd->buf, passthru );
else
@@ -322,3 +330,35 @@ handle_compressed( void *procctx, PKT_compressed *cd,
return rc;
}
+void
+push_compress_filter(IOBUF out,compress_filter_context_t *zfx,int algo)
+{
+ push_compress_filter2(out,zfx,algo,0);
+}
+
+void
+push_compress_filter2(IOBUF out,compress_filter_context_t *zfx,
+ int algo,int rel)
+{
+ if(algo>0)
+ zfx->algo=algo;
+ else
+ zfx->algo=DEFAULT_COMPRESS_ALGO;
+
+ switch(zfx->algo)
+ {
+ case COMPRESS_ALGO_ZIP:
+ case COMPRESS_ALGO_ZLIB:
+ iobuf_push_filter2(out,compress_filter,zfx,rel);
+ break;
+
+#ifdef HAVE_BZIP2
+ case COMPRESS_ALGO_BZIP2:
+ iobuf_push_filter2(out,compress_filter_bz2,zfx,rel);
+ break;
+#endif
+
+ default:
+ BUG();
+ }
+}