Compare commits

..

No commits in common. "b7c27a25a6f9992a6d4698c13d5865543336edce" and "d123c4994660b575733f1edc583fb9f2ebe73437" have entirely different histories.

2 changed files with 13 additions and 7 deletions

View File

@ -7,7 +7,7 @@
// all of these are defined in util.c // all of these are defined in util.c
int minitar_read_header(struct minitar*, struct tar_header*); int minitar_read_header(struct minitar*, struct tar_header*);
int minitar_validate_header(const struct tar_header*); int minitar_validate_header(const struct tar_header*);
void minitar_parse_metadata_from_tar_header(const struct tar_header*, struct minitar_entry_metadata*); void minitar_parse_tar_header(const struct tar_header*, struct minitar_entry_metadata*);
struct minitar_entry* minitar_dup_entry(const struct minitar_entry*); struct minitar_entry* minitar_dup_entry(const struct minitar_entry*);
char* minitar_read_file_contents(struct minitar_entry_metadata*, struct minitar*); char* minitar_read_file_contents(struct minitar_entry_metadata*, struct minitar*);
size_t minitar_get_size_in_blocks(size_t); size_t minitar_get_size_in_blocks(size_t);
@ -30,22 +30,28 @@ int minitar_close(struct minitar* mp)
{ {
int rc = fclose(mp->stream); int rc = fclose(mp->stream);
free(mp); free(mp);
return rc; if (rc) return rc;
return 0;
} }
static struct minitar_entry* minitar_attempt_read_entry(struct minitar* mp, int* valid) static struct minitar_entry* minitar_attempt_read_entry(struct minitar* mp, int* valid)
{ {
struct minitar_entry entry; struct minitar_entry entry;
struct tar_header hdr; struct tar_header hdr;
*valid = 1; if (!minitar_read_header(mp, &hdr))
if (!minitar_read_header(mp, &hdr)) return NULL; {
*valid = 1; // we are at end-of-file
return NULL;
}
if (!minitar_validate_header(&hdr)) if (!minitar_validate_header(&hdr))
{ {
*valid = 0; *valid = 0;
return NULL; return NULL;
} }
*valid = 0;
if (fgetpos(mp->stream, &entry.position)) return NULL; if (fgetpos(mp->stream, &entry.position)) return NULL;
minitar_parse_metadata_from_tar_header(&hdr, &entry.metadata); *valid = 1;
minitar_parse_tar_header(&hdr, &entry.metadata);
if (entry.metadata.size) if (entry.metadata.size)
{ {
size_t size_in_blocks = minitar_get_size_in_blocks(entry.metadata.size); size_t size_in_blocks = minitar_get_size_in_blocks(entry.metadata.size);
@ -64,7 +70,7 @@ struct minitar_entry* minitar_read_entry(struct minitar* mp)
struct minitar_entry* result; struct minitar_entry* result;
do { do {
result = minitar_attempt_read_entry(mp, &valid); result = minitar_attempt_read_entry(mp, &valid);
} while (!valid); // Skip over invalid entries } while (!valid);
return result; return result;
} }

View File

@ -54,7 +54,7 @@ size_t minitar_get_size_in_blocks(size_t size)
return minitar_is_block_aligned(size) ? size : minitar_align_down_to_block(size) + 512; return minitar_is_block_aligned(size) ? size : minitar_align_down_to_block(size) + 512;
} }
void minitar_parse_metadata_from_tar_header(const struct tar_header* hdr, struct minitar_entry_metadata* metadata) void minitar_parse_tar_header(const struct tar_header* hdr, struct minitar_entry_metadata* metadata)
{ {
if (!strlen(hdr->prefix)) if (!strlen(hdr->prefix))
{ {