Skip to content

Commit

Permalink
Modify the file format to not include rzip chunk size except for STDO…
Browse files Browse the repository at this point in the history
…UT chunked files thus decreasing the file format size further.
  • Loading branch information
ckolivas committed Mar 21, 2011
1 parent 7101372 commit 131d4c9
Show file tree
Hide file tree
Showing 6 changed files with 27 additions and 12 deletions.
2 changes: 1 addition & 1 deletion doc/magic.header.txt
Expand Up @@ -28,7 +28,7 @@ Encrypted salt (bytes 6->14 in magic if encrypted):
Rzip Chunk Data:
0 Data offsets byte width (meaning length is < (2 * 8)^RCD0)
1 Flag that there is no chunk beyond this
(RCD0 bytes) Chunk decompressed size (not stored in encrypted file)
(RCD0 bytes) Chunk decompressed size (only stored in stdout chunked file)
XX Stream 0 header data
XX Stream 1 header data

Expand Down
1 change: 1 addition & 0 deletions liblrzip.h
Expand Up @@ -49,6 +49,7 @@
#define TMP_OUTBUF (control->flags & FLAG_TMP_OUTBUF)
#define TMP_INBUF (control->flags & FLAG_TMP_INBUF)
#define ENCRYPT (control->flags & FLAG_ENCRYPT)
#define CHUNKED (control->flags & FLAG_CHUNKED)

#define print_output(format, args...) do {\
fprintf(control->msgout, format, ##args); \
Expand Down
28 changes: 20 additions & 8 deletions lrzip.c
Expand Up @@ -175,6 +175,10 @@ static void get_magic(rzip_control *control, char *magic)
print_output("Asked to decrypt a non-encrypted archive. Bypassing decryption.\n");
control->flags &= ~FLAG_ENCRYPT;
}
/* If the file was generated from STDOUT and !ENCRYPT, an extra field
* describing the chunk length exists */
if (!ENCRYPT && !expected_size)
control->flags |= FLAG_CHUNKED;
}

void read_magic(rzip_control *control, int fd_in, i64 *expected_size)
Expand Down Expand Up @@ -777,9 +781,11 @@ void get_fileinfo(rzip_control *control)
if (control->major_version == 0 && control->minor_version > 5) {
if (unlikely(read(fd_in, &control->eof, 1) != 1))
fatal("Failed to read eof in get_fileinfo\n");
if (unlikely(read(fd_in, &chunk_size, chunk_byte) != chunk_byte))
fatal("Failed to read chunk_size in get_fileinfo\n");
chunk_size = le64toh(chunk_size);
if (CHUNKED) {
if (unlikely(read(fd_in, &chunk_size, chunk_byte) != chunk_byte))
fatal("Failed to read chunk_size in get_fileinfo\n");
chunk_size = le64toh(chunk_size);
}
}
}

Expand All @@ -793,7 +799,7 @@ void get_fileinfo(rzip_control *control)
ofs = 25;
header_length = 25;
} else {
ofs = 26 + chunk_byte;
ofs = 26 + (CHUNKED ? chunk_byte: 0);
header_length = 1 + (chunk_byte * 3);
}
next_chunk:
Expand Down Expand Up @@ -867,10 +873,13 @@ void get_fileinfo(rzip_control *control)
if (control->major_version == 0 && control->minor_version > 5) {
if (unlikely(read(fd_in, &control->eof, 1) != 1))
fatal("Failed to read eof in get_fileinfo\n");
if (unlikely(read(fd_in, &chunk_size, chunk_byte) != chunk_byte))
fatal("Failed to read chunk_size in get_fileinfo\n");
chunk_size = le64toh(chunk_size);
ofs += 1 + chunk_byte;
ofs++;
if (CHUNKED) {
if (unlikely(read(fd_in, &chunk_size, chunk_byte) != chunk_byte))
fatal("Failed to read chunk_size in get_fileinfo\n");
chunk_size = le64toh(chunk_size);
ofs += chunk_byte;
}
header_length = 1 + (chunk_byte * 3);
}
}
Expand Down Expand Up @@ -949,6 +958,9 @@ void compress_file(rzip_control *control)

if (ENCRYPT)
get_hash(control, 1);
else if (STDOUT)
control->flags |= FLAG_CHUNKED;

memset(header, 0, sizeof(header));

if (!STDIN) {
Expand Down
1 change: 1 addition & 0 deletions lrzip_private.h
Expand Up @@ -158,6 +158,7 @@ typedef struct md5_ctx md5_ctx;
#define FLAG_TMP_OUTBUF (1 << 21)
#define FLAG_TMP_INBUF (1 << 22)
#define FLAG_ENCRYPT (1 << 23)
#define FLAG_CHUNKED (1 << 24)

#define NO_MD5 (!(HASH_CHECK) && !(HAS_MD5))

Expand Down
1 change: 1 addition & 0 deletions main.c
Expand Up @@ -85,6 +85,7 @@
#define TMP_OUTBUF (control.flags & FLAG_TMP_OUTBUF)
#define TMP_INBUF (control.flags & FLAG_TMP_INBUF)
#define ENCRYPT (control.flags & FLAG_ENCRYPT)
#define CHUNKED (control.flags & FLAG_CHUNKED)

#define print_output(format, args...) do {\
fprintf(control.msgout, format, ##args); \
Expand Down
6 changes: 3 additions & 3 deletions stream.c
Expand Up @@ -1104,7 +1104,7 @@ void *open_stream_in(rzip_control *control, int f, int n, int chunk_bytes)
goto failed;
}
/* Read in the expected chunk size */
if (!ENCRYPT) {
if (CHUNKED) {
if (unlikely(read_val(control, f, &sinfo->size, sinfo->chunk_bytes))) {
print_err("Failed to read in chunk size in open_stream_in\n");
goto failed;
Expand Down Expand Up @@ -1323,9 +1323,9 @@ static void *compthread(void *data)
write_u8(control, ctis->fd, ctis->chunk_bytes);

/* Write whether this is the last chunk, followed by the size
* of this chunk */
* of this chunk if working with STDOUT and !ENCRYPT */
write_u8(control, ctis->fd, control->eof);
if (!ENCRYPT)
if (CHUNKED)
write_val(control, ctis->fd, ctis->size, ctis->chunk_bytes);

/* First chunk of this stream, write headers */
Expand Down

0 comments on commit 131d4c9

Please sign in to comment.