Use magic number to identify index

pull/2/head
Dave Vasilevsky 14 years ago
parent 153ac09e29
commit 4ab346deff

@ -74,7 +74,7 @@ void free_file_index(void) {
gFileIndex = gLastFile = NULL;
}
void read_file_index(void) {
bool read_file_index(void) {
// find the last block
lzma_index_iter iter;
lzma_index_iter_init(&iter, gIndex);
@ -86,6 +86,14 @@ void read_file_index(void) {
gFileIndexBuf = malloc(gFIBSize);
gStream.avail_out = gFIBSize;
gStream.avail_in = 0;
// Check if this is really an index
read_file_index_data();
if (xle64dec(gFileIndexBuf + gFIBPos) != PIXZ_INDEX_MAGIC) {
gLastFile = gFileIndex = NULL;
return false;
}
while (true) {
char *name = read_file_index_name();
if (!name)
@ -106,6 +114,8 @@ void read_file_index(void) {
free(gFileIndexBuf);
lzma_end(&gStream);
free(bdata);
return true;
}
static char *read_file_index_name(void) {

@ -7,19 +7,6 @@
int main(int argc, char **argv) {
char *progname = argv[0];
int ch;
bool tar = false;
while ((ch = getopt(argc, argv, "t")) != -1) {
switch (ch) {
case 't':
tar = true;
break;
default:
die("Unknown option");
}
}
argc -= optind - 1;
argv += optind - 1;
if (argc != 2)
die("Usage: %s [-t] file", progname);
@ -35,9 +22,8 @@ int main(int argc, char **argv) {
(uintmax_t)iter.block.uncompressed_size);
}
if (tar) {
if (read_file_index()) {
fprintf(stderr, "\n");
read_file_index();
dump_file_index();
free_file_index();
}

@ -13,6 +13,8 @@
#pragma mark DEFINES
#define PIXZ_INDEX_MAGIC 0xDBAE14D62E324CA6LL
#define CHECK LZMA_CHECK_CRC32
#define MEMLIMIT (64L * 1024 * 1024 * 1024) // crazy high
@ -70,7 +72,7 @@ size_t num_threads(void);
void decode_index(void);
void *decode_block_start(off_t block_seek);
void read_file_index(void);
bool read_file_index(void);
void dump_file_index(void);
void free_file_index(void);

@ -17,7 +17,8 @@ int main(int argc, char **argv) {
char *target = argv[2];
decode_index();
read_file_index();
if (!read_file_index())
die("File has no index");
extract_file(target);

@ -435,7 +435,9 @@ static void write_file_index(void) {
if (lzma_block_encoder(&gStream, &block) != LZMA_OK)
die("Error creating file index encoder");
uint8_t offbuf[sizeof(uint64_t)];
uint8_t offbuf[sizeof(uint64_t)];
xle64enc(offbuf, PIXZ_INDEX_MAGIC);
write_file_index_bytes(sizeof(offbuf), offbuf);
for (file_index_t *f = gFileIndex; f != NULL; f = f->next) {
char *name = f->name ? f->name : "";
size_t len = strlen(name);

Loading…
Cancel
Save