PERFORCE change 145998 for review
Anselm Strauss
strauss at FreeBSD.org
Sat Jul 26 20:03:44 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=145998
Change 145998 by strauss at strauss_marvelman on 2008/07/26 20:03:16
- Fixed writing of signature in local file header
- Fixed written byte counting and offsets (must recheck)
- Fixed freeing of cloned archive entries
Affected files ...
.. //depot/projects/soc2008/strauss_libarchive/TODO#11 edit
.. //depot/projects/soc2008/strauss_libarchive/libarchive/archive_write_set_format_zip.c#19 edit
Differences ...
==== //depot/projects/soc2008/strauss_libarchive/TODO#11 (text+ko) ====
@@ -1,7 +1,8 @@
To Be Done
==========
-- Exception handling in ZIP writer
+- Free archive entry clones in ZIP writer
+- Exception handling in ZIP writer, archive error setting
- Update ZIP writer in docs
- About the keywords: of course they always change when integrating ...
- Not all P4 keywords do expand (tested on OS X and FreeBSD)
==== //depot/projects/soc2008/strauss_libarchive/libarchive/archive_write_set_format_zip.c#19 (text+ko) ====
@@ -98,6 +98,8 @@
struct zip {
struct zip_data_descriptor data_descriptor;
struct zip_file_header_link *central_directory;
+ off_t offset;
+ size_t written_bytes;
};
struct zip_central_directory_end {
@@ -127,6 +129,8 @@
return (ARCHIVE_FATAL);
}
zip->central_directory = NULL;
+ zip->offset = 0;
+ zip->written_bytes = 0;
a->format_data = zip;
a->pad_uncompressed = 0; /* Actually not needed for now, since no compression support yet. */
@@ -178,7 +182,7 @@
zip->central_directory = l;
/* Store the offset of this header for later use in central directory. */
- l->offset = a->archive.raw_position;
+ l->offset = zip->written_bytes;
/*
* Formatting local file header.
@@ -192,7 +196,7 @@
* - extra_length: first used when
*/
memset(&h, 0, sizeof(h));
- zip_encode(ZIP_SIGNATURE_LOCAL_FILE_HEADER, &h.version, sizeof(h.version));
+ zip_encode(ZIP_SIGNATURE_LOCAL_FILE_HEADER, &h.signature, sizeof(h.signature));
zip_encode(0x0200, &h.version, sizeof(h.version));
zip_encode(1 << 2, &h.flags, sizeof(h.flags)); /* Flagging bit 3 for using data descriptor. */
zip_encode(strlen(path), &h.filename_length, sizeof(h.filename_length));
@@ -204,9 +208,11 @@
ret = (a->compressor.write)(a, &h, sizeof(h));
if (ret != ARCHIVE_OK) return (ARCHIVE_FATAL);
+ zip->written_bytes += sizeof(h);
ret = (a->compressor.write)(a, path, strlen(path));
if (ret != ARCHIVE_OK) return (ARCHIVE_FATAL);
+ zip->written_bytes += strlen(path);
return (ARCHIVE_OK);
}
@@ -215,12 +221,16 @@
archive_write_zip_data(struct archive_write *a, const void *buff, size_t s)
{
int ret;
+ struct zip *zip = a->format_data;
+
ret = (a->compressor.write)(a, buff, s);
- if (ret >= 0)
+ if (ret >= 0) {
+ zip->written_bytes += s;
return (s);
- else
+ } else {
return (ret);
-
+ }
+
/* TODO: Compute data descriptor CRC. */
}
@@ -237,6 +247,7 @@
if (ret != ARCHIVE_OK)
return (ARCHIVE_FATAL);
+ zip->written_bytes += sizeof(*d);
return (ret);
}
@@ -248,7 +259,7 @@
struct zip_file_header h;
struct zip_central_directory_end end;
int64_t size;
- off_t offset;
+ off_t offset_start, offset_end;
const char *path;
int entries;
int ret;
@@ -272,7 +283,7 @@
zip_encode(0x0200, &h.version_extract, sizeof(h.version_extract));
entries = 0;
- offset = a->archive.raw_position;
+ offset_start = zip->written_bytes;
while (l != NULL) {
/* Formatting individual header fields per entry. */
@@ -286,26 +297,30 @@
/* Writing file header. */
ret = (a->compressor.write)(a, &h, sizeof(h));
if (ret != ARCHIVE_OK) return (ARCHIVE_FATAL);
+ zip->written_bytes += sizeof(h);
/* Writing filename. */
ret = (a->compressor.write)(a, path, strlen(path));
if (ret != ARCHIVE_OK) return (ARCHIVE_FATAL);
-
+ zip->written_bytes += strlen(path);
+
l = l->next;
- ++entries;
+ entries++;
}
+ offset_end = zip->written_bytes;
/* Formatting end of central directory. */
memset(&end, 0, sizeof(end));
zip_encode(ZIP_SIGNATURE_CENTRAL_DIRECTORY_END, &end.signature, sizeof(end.signature));
zip_encode(entries, &end.entries, sizeof(end.entries));
zip_encode(entries, &end.entries_disk, sizeof(end.entries_disk));
- zip_encode(entries * sizeof(h), &end.size, sizeof(end.size));
- zip_encode(offset, &end.offset, sizeof(end.offset));
+ zip_encode(offset_end - offset_start, &end.size, sizeof(end.size));
+ zip_encode(offset_start, &end.offset, sizeof(end.offset));
/* Writing end of central directory. */
ret = (a->compressor.write)(a, &end, sizeof(end));
if (ret != ARCHIVE_OK) return (ARCHIVE_FATAL);
+ zip->written_bytes += sizeof(end);
return (ARCHIVE_OK);
}
@@ -314,13 +329,15 @@
archive_write_zip_destroy(struct archive_write *a)
{
struct zip *zip;
- struct zip_file_header_link *l;
+ struct zip_file_header_link *l1, *l2;
zip = a->format_data;
- l = zip->central_directory;
- while (l != NULL) {
- l = l->next;
- free(l);
+ l1 = l2 = zip->central_directory;
+ while (l2 != NULL) {
+ l2 = l1->next;
+ free(l1->entry);
+ free(l1);
+ l1 = l2;
}
free(zip);
a->format_data = NULL;
More information about the p4-projects
mailing list