diff options
author | Denys Vlasenko | 2012-06-22 16:27:21 +0200 |
---|---|---|
committer | Denys Vlasenko | 2012-06-22 16:27:21 +0200 |
commit | 440a509849391f2dc8ec720a136577ede3306fa8 (patch) | |
tree | d52caed6f400212530c8a2b1eab6c4829a530aac /archival/dpkg.c | |
parent | d52c9510fd3a9407044166360fe8b752fd841efc (diff) | |
download | busybox-440a509849391f2dc8ec720a136577ede3306fa8.zip busybox-440a509849391f2dc8ec720a136577ede3306fa8.tar.gz |
dpkg: fix creation of .list files (were empty since b768aeb). Closes 5324
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@googlemail.com>
Diffstat (limited to 'archival/dpkg.c')
-rw-r--r-- | archival/dpkg.c | 13 |
1 files changed, 9 insertions, 4 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); |