enable .tar.bz2 for dpkg-deb
diff --git a/archival/config.in b/archival/config.in
index 3ec03fd..05e6dca 100644
--- a/archival/config.in
+++ b/archival/config.in
@@ -15,7 +15,12 @@
 bool 'dpkg'	    CONFIG_DPKG
 bool 'dpkg_deb'	    CONFIG_DPKG_DEB
 if [ "$CONFIG_DPKG_DEB" = "y" ] ; then
-    bool '  -x support only'	CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY
+    bool '  extract only (-x)'	CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY
+fi
+if [ "$CONFIG_DPKG" = "y" ] || [ "$CONFIG_DPKG_DEB" = "y" ] ; then
+    comment 'Common dpkg/dpkg-deb options'
+    bool '  gzip debian packages (normal)'      CONFIG_FEATURE_DEB_TAR_GZ
+    bool '  bzip2 debian packages'              CONFIG_FEATURE_DEB_TAR_BZ2
 fi
 bool 'gunzip'	    CONFIG_GUNZIP
 if [ "$CONFIG_GUNZIP" = "y" ]; then
diff --git a/archival/dpkg_deb.c b/archival/dpkg_deb.c
index 06a810c..c467395 100644
--- a/archival/dpkg_deb.c
+++ b/archival/dpkg_deb.c
@@ -24,10 +24,10 @@
 extern int dpkg_deb_main(int argc, char **argv)
 {
 	archive_handle_t *ar_archive;
-	archive_handle_t *tar_gz_archive;
+	archive_handle_t *tar_archive;
 	int opt = 0;
 #ifndef CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY
-	const llist_t *control_tar_gz_llist = add_to_list(NULL, "control.tar.gz");
+	const llist_t *control_tar_llist = NULL;
 #endif
 #ifndef CONFIG_AR
 	char magic[7];
@@ -38,14 +38,26 @@
 	 */
 	
 	/* Setup the tar archive handle */
-	tar_gz_archive = init_handle();
+	tar_archive = init_handle();
 
 	/* Setup an ar archive handle that refers to the gzip sub archive */	
 	ar_archive = init_handle();
-	ar_archive->action_data_subarchive = get_header_tar_gz;
-	ar_archive->sub_archive = tar_gz_archive;
-	ar_archive->filter = filter_accept_list;
+	ar_archive->sub_archive = tar_archive;
+	ar_archive->filter = filter_accept_list_reassign;
+
+#ifdef CONFIG_FEATURE_DEB_TAR_GZ
 	ar_archive->accept = add_to_list(NULL, "data.tar.gz");
+# ifndef CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY
+	control_tar_llist = add_to_list(NULL, "control.tar.gz");
+# endif
+#endif
+
+#ifdef CONFIG_FEATURE_DEB_TAR_BZ2
+	ar_archive->accept = add_to_list(ar_archive->accept, "data.tar.bz2");
+# ifndef CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY
+	control_tar_llist = add_to_list(control_tar_llist, "control.tar.bz2");
+# endif
+#endif
 
 #ifndef CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY
 	while ((opt = getopt(argc, argv, "cefXx")) != -1) {
@@ -55,26 +67,26 @@
 		switch (opt) {
 #ifndef CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY
 			case 'c':
-				tar_gz_archive->action_header = header_verbose_list;
+				tar_archive->action_header = header_verbose_list;
 				break;
 			case 'e':
-				ar_archive->accept = control_tar_gz_llist;
-				tar_gz_archive->action_data = data_extract_all;
+				ar_archive->accept = control_tar_llist;
+				tar_archive->action_data = data_extract_all;
 				break;
 			case 'f':
 				/* Print the entire control file
 				 * it should accept a second argument which specifies a 
 				 * specific field to print */
-				ar_archive->accept = control_tar_gz_llist;
-				tar_gz_archive->accept = add_to_list(NULL, "./control");;
-				tar_gz_archive->filter = filter_accept_list;
-				tar_gz_archive->action_data = data_extract_to_stdout;
+				ar_archive->accept = control_tar_llist;
+				tar_archive->accept = add_to_list(NULL, "./control");;
+				tar_archive->filter = filter_accept_list;
+				tar_archive->action_data = data_extract_to_stdout;
 				break;
 			case 'X':
-				tar_gz_archive->action_header = header_list;
+				tar_archive->action_header = header_list;
 #endif
 			case 'x':
-				tar_gz_archive->action_data = data_extract_all;
+				tar_archive->action_data = data_extract_all;
 				break;
 			default:
 				show_usage();
@@ -85,7 +97,7 @@
 		show_usage();
 	}
 
-	tar_gz_archive->src_fd = ar_archive->src_fd = xopen(argv[optind++], O_RDONLY);
+	tar_archive->src_fd = ar_archive->src_fd = xopen(argv[optind++], O_RDONLY);
 
 	/* Workout where to extract the files */
 	/* 2nd argument is a dir name */
diff --git a/archival/libunarchive/Makefile.in b/archival/libunarchive/Makefile.in
index e406f75..469004d 100644
--- a/archival/libunarchive/Makefile.in
+++ b/archival/libunarchive/Makefile.in
@@ -31,6 +31,7 @@
 \
 	filter_accept_all.o \
 	filter_accept_list.o \
+	filter_accept_list_reassign.o \
 	filter_accept_reject_list.o \
 \
 	get_header_ar.o \
diff --git a/archival/libunarchive/filter_accept_all.c b/archival/libunarchive/filter_accept_all.c
index d7bccb5..baf9e4b 100644
--- a/archival/libunarchive/filter_accept_all.c
+++ b/archival/libunarchive/filter_accept_all.c
@@ -22,7 +22,7 @@
 #include "unarchive.h"
 
 /* Accept any non-null name, its not really a filter at all */
-extern char filter_accept_all(const archive_handle_t *archive_handle)
+extern char filter_accept_all(archive_handle_t *archive_handle)
 {
 	if (archive_handle->file_header->name) {
 		return(EXIT_SUCCESS);
diff --git a/archival/libunarchive/filter_accept_list.c b/archival/libunarchive/filter_accept_list.c
index 5ff3ad2..e1c4827 100644
--- a/archival/libunarchive/filter_accept_list.c
+++ b/archival/libunarchive/filter_accept_list.c
@@ -24,7 +24,7 @@
 /*
  * Accept names that are in the accept list, ignoring reject list.
  */
-extern char filter_accept_list(const archive_handle_t *archive_handle)
+extern char filter_accept_list(archive_handle_t *archive_handle)
 {
 	if (find_list_entry(archive_handle->accept, archive_handle->file_header->name)) {
 		return(EXIT_SUCCESS);
diff --git a/archival/libunarchive/filter_accept_reject_list.c b/archival/libunarchive/filter_accept_reject_list.c
index 48e9ed8..657f7a0 100644
--- a/archival/libunarchive/filter_accept_reject_list.c
+++ b/archival/libunarchive/filter_accept_reject_list.c
@@ -24,7 +24,7 @@
 /*
  * Accept names that are in the accept list and not in the reject list
  */
-extern char filter_accept_reject_list(const archive_handle_t *archive_handle)
+extern char filter_accept_reject_list(archive_handle_t *archive_handle)
 {
 	const char *key = archive_handle->file_header->name;
 	const llist_t *accept_entry = find_list_entry(archive_handle->accept, key);
diff --git a/include/unarchive.h b/include/unarchive.h
index a1010aa..18bf089 100644
--- a/include/unarchive.h
+++ b/include/unarchive.h
@@ -28,7 +28,7 @@
 
 typedef struct archive_handle_s {
 	/* define if the header and data compenent should processed */
-	char (*filter)(const struct archive_handle_s *);
+	char (*filter)(struct archive_handle_s *);
 	const llist_t *accept;
 	const llist_t *reject;
 	const llist_t *passed;	/* List of files that have successfully been worked on */
@@ -41,6 +41,8 @@
 
 	/* process the data componenet, e.g. extract to filesystem */
 	void (*action_data)(struct archive_handle_s *);
+	
+	/* How to process any sub archive, e.g. get_header_tar_gz */
 	char (*action_data_subarchive)(struct archive_handle_s *);
 
 	/* Contains the handle to a sub archive */
@@ -68,9 +70,10 @@
 
 extern archive_handle_t *init_handle(void);
 
-extern char filter_accept_all(const archive_handle_t *archive_handle);
-extern char filter_accept_list(const archive_handle_t *archive_handle);
-extern char filter_accept_reject_list(const archive_handle_t *archive_handle);
+extern char filter_accept_all(archive_handle_t *archive_handle);
+extern char filter_accept_list(archive_handle_t *archive_handle);
+extern char filter_accept_list_reassign(archive_handle_t *archive_handle);
+extern char filter_accept_reject_list(archive_handle_t *archive_handle);
 
 extern void unpack_ar_archive(archive_handle_t *ar_archive);