Skip to content
This repository was archived by the owner on Nov 9, 2017. It is now read-only.

Commit ebf5374

Browse files
René Scharfegitster
authored andcommitted
archive-zip: factor out helpers for writing sizes and CRC
We're going to reuse them soon for streaming. Also, update the ZIP directory only at the very end, which will also make streaming easier. Signed-off-by: Rene Scharfe <[email protected]> Signed-off-by: Nguyễn Thái Ngọc Duy <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 60df6bd commit ebf5374

File tree

1 file changed

+28
-11
lines changed

1 file changed

+28
-11
lines changed

archive-zip.c

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,26 @@ static void *zlib_deflate(void *data, unsigned long size,
120120
return buffer;
121121
}
122122

123+
static void set_zip_dir_data_desc(struct zip_dir_header *header,
124+
unsigned long size,
125+
unsigned long compressed_size,
126+
unsigned long crc)
127+
{
128+
copy_le32(header->crc32, crc);
129+
copy_le32(header->compressed_size, compressed_size);
130+
copy_le32(header->size, size);
131+
}
132+
133+
static void set_zip_header_data_desc(struct zip_local_header *header,
134+
unsigned long size,
135+
unsigned long compressed_size,
136+
unsigned long crc)
137+
{
138+
copy_le32(header->crc32, crc);
139+
copy_le32(header->compressed_size, compressed_size);
140+
copy_le32(header->size, size);
141+
}
142+
123143
static int write_zip_entry(struct archiver_args *args,
124144
const unsigned char *sha1,
125145
const char *path, size_t pathlen,
@@ -200,31 +220,22 @@ static int write_zip_entry(struct archiver_args *args,
200220
copy_le16(dirent.compression_method, method);
201221
copy_le16(dirent.mtime, zip_time);
202222
copy_le16(dirent.mdate, zip_date);
203-
copy_le32(dirent.crc32, crc);
204-
copy_le32(dirent.compressed_size, compressed_size);
205-
copy_le32(dirent.size, size);
223+
set_zip_dir_data_desc(&dirent, size, compressed_size, crc);
206224
copy_le16(dirent.filename_length, pathlen);
207225
copy_le16(dirent.extra_length, 0);
208226
copy_le16(dirent.comment_length, 0);
209227
copy_le16(dirent.disk, 0);
210228
copy_le16(dirent.attr1, 0);
211229
copy_le32(dirent.attr2, attr2);
212230
copy_le32(dirent.offset, zip_offset);
213-
memcpy(zip_dir + zip_dir_offset, &dirent, ZIP_DIR_HEADER_SIZE);
214-
zip_dir_offset += ZIP_DIR_HEADER_SIZE;
215-
memcpy(zip_dir + zip_dir_offset, path, pathlen);
216-
zip_dir_offset += pathlen;
217-
zip_dir_entries++;
218231

219232
copy_le32(header.magic, 0x04034b50);
220233
copy_le16(header.version, 10);
221234
copy_le16(header.flags, 0);
222235
copy_le16(header.compression_method, method);
223236
copy_le16(header.mtime, zip_time);
224237
copy_le16(header.mdate, zip_date);
225-
copy_le32(header.crc32, crc);
226-
copy_le32(header.compressed_size, compressed_size);
227-
copy_le32(header.size, size);
238+
set_zip_header_data_desc(&header, size, compressed_size, crc);
228239
copy_le16(header.filename_length, pathlen);
229240
copy_le16(header.extra_length, 0);
230241
write_or_die(1, &header, ZIP_LOCAL_HEADER_SIZE);
@@ -239,6 +250,12 @@ static int write_zip_entry(struct archiver_args *args,
239250
free(deflated);
240251
free(buffer);
241252

253+
memcpy(zip_dir + zip_dir_offset, &dirent, ZIP_DIR_HEADER_SIZE);
254+
zip_dir_offset += ZIP_DIR_HEADER_SIZE;
255+
memcpy(zip_dir + zip_dir_offset, path, pathlen);
256+
zip_dir_offset += pathlen;
257+
zip_dir_entries++;
258+
242259
return 0;
243260
}
244261

0 commit comments

Comments
 (0)