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>
This commit is contained in:
parent
d52c9510fd
commit
440a509849
@ -1665,20 +1665,25 @@ static void unpack_package(deb_file_t *deb_file)
|
|||||||
archive_handle = init_archive_deb_ar(deb_file->filename);
|
archive_handle = init_archive_deb_ar(deb_file->filename);
|
||||||
init_archive_deb_data(archive_handle);
|
init_archive_deb_data(archive_handle);
|
||||||
archive_handle->dpkg__sub_archive->accept = conffile_list;
|
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->filter = filter_rename_config;
|
||||||
archive_handle->dpkg__sub_archive->action_data = data_extract_all_prefix;
|
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->dpkg__buffer = (char*)"/"; /* huh? */
|
||||||
archive_handle->dpkg__sub_archive->ah_flags |= ARCHIVE_UNLINK_OLD;
|
|
||||||
unpack_ar_archive(archive_handle);
|
unpack_ar_archive(archive_handle);
|
||||||
|
|
||||||
/* Create the list file */
|
/* Create the list file */
|
||||||
list_filename = xasprintf("/var/lib/dpkg/info/%s.%s", package_name, "list");
|
list_filename = xasprintf("/var/lib/dpkg/info/%s.%s", package_name, "list");
|
||||||
out_stream = xfopen_for_write(list_filename);
|
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) {
|
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 */
|
/* the leading . has been stripped by data_extract_all_prefix already */
|
||||||
fputs(archive_handle->dpkg__sub_archive->passed->data, out_stream);
|
fprintf(out_stream, "%s\n", filename);
|
||||||
fputc('\n', out_stream);
|
free(filename);
|
||||||
archive_handle->dpkg__sub_archive->passed = archive_handle->dpkg__sub_archive->passed->link;
|
|
||||||
}
|
}
|
||||||
fclose(out_stream);
|
fclose(out_stream);
|
||||||
|
|
||||||
|
@ -452,9 +452,11 @@ char FAST_FUNC get_header_tar(archive_handle_t *archive_handle)
|
|||||||
if (cp)
|
if (cp)
|
||||||
*cp = '\0';
|
*cp = '\0';
|
||||||
archive_handle->action_data(archive_handle);
|
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);
|
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);
|
free(file_header->name);
|
||||||
} else {
|
} else {
|
||||||
data_skip(archive_handle);
|
data_skip(archive_handle);
|
||||||
|
@ -121,6 +121,7 @@ typedef struct archive_handle_t {
|
|||||||
#define ARCHIVE_DONT_RESTORE_PERM (1 << 6)
|
#define ARCHIVE_DONT_RESTORE_PERM (1 << 6)
|
||||||
#define ARCHIVE_NUMERIC_OWNER (1 << 7)
|
#define ARCHIVE_NUMERIC_OWNER (1 << 7)
|
||||||
#define ARCHIVE_O_TRUNC (1 << 8)
|
#define ARCHIVE_O_TRUNC (1 << 8)
|
||||||
|
#define ARCHIVE_REMEMBER_NAMES (1 << 9)
|
||||||
|
|
||||||
|
|
||||||
/* POSIX tar Header Block, from POSIX 1003.1-1990 */
|
/* POSIX tar Header Block, from POSIX 1003.1-1990 */
|
||||||
|
Loading…
Reference in New Issue
Block a user