[git commit] dpkg: fix creation of .list files (were empty since b768aeb). Closes 5324

Denys Vlasenko vda.linux at googlemail.com
Fri Jun 22 14:27:21 UTC 2012


commit: http://git.busybox.net/busybox/commit/?id=440a509849391f2dc8ec720a136577ede3306fa8
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

While at it, fix filename order and free the list of names.

function                                             old     new   delta
llist_rev                                              -      21     +21
get_header_tar                                      1733    1741      +8
unpack_package                                       587     585      -2
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 1/1 up/down: 29/-2)              Total: 27 bytes

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 archival/dpkg.c                      |   13 +++++++++----
 archival/libarchive/get_header_tar.c |    6 ++++--
 include/bb_archive.h                 |    1 +
 3 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/archival/dpkg.c b/archival/dpkg.c
index bf9e999..dae8a97 100644
--- a/archival/dpkg.c
+++ b/archival/dpkg.c
@@ -1665,20 +1665,25 @@ static void unpack_package(deb_file_t *deb_file)
 	archive_handle = init_archive_deb_ar(deb_file->filename);
 	init_archive_deb_data(archive_handle);
 	archive_handle->dpkg__sub_archive->accept = conffile_list;
+	/* Why ARCHIVE_REMEMBER_NAMES?
+	 * We want names collected in ->passed list even if conffile_list
+	 * is NULL (otherwise get_header_tar may optimize name saving out):
+	 */
+	archive_handle->dpkg__sub_archive->ah_flags |= ARCHIVE_REMEMBER_NAMES | ARCHIVE_UNLINK_OLD;
 	archive_handle->dpkg__sub_archive->filter = filter_rename_config;
 	archive_handle->dpkg__sub_archive->action_data = data_extract_all_prefix;
 	archive_handle->dpkg__sub_archive->dpkg__buffer = (char*)"/"; /* huh? */
-	archive_handle->dpkg__sub_archive->ah_flags |= ARCHIVE_UNLINK_OLD;
 	unpack_ar_archive(archive_handle);
 
 	/* Create the list file */
 	list_filename = xasprintf("/var/lib/dpkg/info/%s.%s", package_name, "list");
 	out_stream = xfopen_for_write(list_filename);
+	archive_handle->dpkg__sub_archive->passed = llist_rev(archive_handle->dpkg__sub_archive->passed);
 	while (archive_handle->dpkg__sub_archive->passed) {
+		char *filename = llist_pop(&archive_handle->dpkg__sub_archive->passed);
 		/* the leading . has been stripped by data_extract_all_prefix already */
-		fputs(archive_handle->dpkg__sub_archive->passed->data, out_stream);
-		fputc('\n', out_stream);
-		archive_handle->dpkg__sub_archive->passed = archive_handle->dpkg__sub_archive->passed->link;
+		fprintf(out_stream, "%s\n", filename);
+		free(filename);
 	}
 	fclose(out_stream);
 
diff --git a/archival/libarchive/get_header_tar.c b/archival/libarchive/get_header_tar.c
index b168653..bc09756 100644
--- a/archival/libarchive/get_header_tar.c
+++ b/archival/libarchive/get_header_tar.c
@@ -452,9 +452,11 @@ char FAST_FUNC get_header_tar(archive_handle_t *archive_handle)
 		if (cp)
 			*cp = '\0';
 		archive_handle->action_data(archive_handle);
-		if (archive_handle->accept || archive_handle->reject)
+		if (archive_handle->accept || archive_handle->reject
+		 || (archive_handle->ah_flags & ARCHIVE_REMEMBER_NAMES)
+		) {
 			llist_add_to(&archive_handle->passed, file_header->name);
-		else /* Caller isn't interested in list of unpacked files */
+		} else /* Caller isn't interested in list of unpacked files */
 			free(file_header->name);
 	} else {
 		data_skip(archive_handle);
diff --git a/include/bb_archive.h b/include/bb_archive.h
index 2043d85..7bb5615 100644
--- a/include/bb_archive.h
+++ b/include/bb_archive.h
@@ -121,6 +121,7 @@ typedef struct archive_handle_t {
 #define ARCHIVE_DONT_RESTORE_PERM   (1 << 6)
 #define ARCHIVE_NUMERIC_OWNER       (1 << 7)
 #define ARCHIVE_O_TRUNC             (1 << 8)
+#define ARCHIVE_REMEMBER_NAMES      (1 << 9)
 
 
 /* POSIX tar Header Block, from POSIX 1003.1-1990  */


More information about the busybox-cvs mailing list