struct private_data {
int compression_level;
int timestamp;
+ char *original_filename;
#ifdef HAVE_ZLIB_H
z_stream stream;
int64_t total_in;
f->free = &archive_compressor_gzip_free;
f->code = ARCHIVE_FILTER_GZIP;
f->name = "gzip";
+
+ data->original_filename = NULL;
#ifdef HAVE_ZLIB_H
data->compression_level = Z_DEFAULT_COMPRESSION;
return (ARCHIVE_OK);
#else
__archive_write_program_free(data->pdata);
#endif
+ free((void*)data->original_filename);
free(data);
f->data = NULL;
return (ARCHIVE_OK);
data->timestamp = (value == NULL)?-1:1;
return (ARCHIVE_OK);
}
+ if (strcmp(key, "original-filename") == 0) {
+ free((void*)data->original_filename);
+ data->original_filename = NULL;
+ if (value)
+ data->original_filename = strdup(value);
+ return (ARCHIVE_OK);
+ }
/* Note: The "warn" return is just to inform the options
* supervisor that we didn't handle it. It will generate
data->compressed[0] = 0x1f; /* GZip signature bytes */
data->compressed[1] = 0x8b;
data->compressed[2] = 0x08; /* "Deflate" compression */
- data->compressed[3] = 0; /* No options */
+ data->compressed[3] = data->original_filename == NULL ? 0 : 0x8;
if (data->timestamp >= 0) {
time_t t = time(NULL);
data->compressed[4] = (uint8_t)(t)&0xff; /* Timestamp */
data->stream.next_out += 10;
data->stream.avail_out -= 10;
+ if (data->original_filename != NULL) {
+ strcpy((char*)data->compressed + 10, data->original_filename);
+ data->stream.next_out += strlen(data->original_filename) + 1;
+ data->stream.avail_out -= strlen(data->original_filename) + 1;
+ }
+
f->write = archive_compressor_gzip_write;
/* Initialize compression library. */
archive_write_set_filter_option(a, NULL, "compression-level", "99"));
assertEqualIntA(a, ARCHIVE_OK,
archive_write_set_options(a, "gzip:compression-level=9"));
+ assertEqualIntA(a, ARCHIVE_OK,
+ archive_write_set_options(a, "gzip:original-filename=testorgfilename"));
assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2));
for (i = 0; i < 100; i++) {
snprintf(path, sizeof(path), "file%03d", i);
assertEqualInt(rbuff[0], 0x1f);
assertEqualInt(rbuff[1], 0x8b);
assertEqualInt(rbuff[2], 0x08);
- assertEqualInt(rbuff[3], 0x00);
+ assertEqualInt(rbuff[3], 0x08);
assertEqualInt(rbuff[8], 2); /* RFC 1952 flag for compression level 9 */
+ assertEqualString((const char*)rbuff+10, "testorgfilename");
/* Curiously, this test fails; the test data above compresses
* better at default compression than at level 9. */