Compare commits
3 Commits
d123c49946
...
b7c27a25a6
Author | SHA1 | Date | |
---|---|---|---|
b7c27a25a6 | |||
ba7b77bdae | |||
0fbcdde399 |
18
src/tar.c
18
src/tar.c
@ -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_tar_header(const struct tar_header*, struct minitar_entry_metadata*);
|
void minitar_parse_metadata_from_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,28 +30,22 @@ int minitar_close(struct minitar* mp)
|
|||||||
{
|
{
|
||||||
int rc = fclose(mp->stream);
|
int rc = fclose(mp->stream);
|
||||||
free(mp);
|
free(mp);
|
||||||
if (rc) return 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;
|
||||||
if (!minitar_read_header(mp, &hdr))
|
*valid = 1;
|
||||||
{
|
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;
|
||||||
*valid = 1;
|
minitar_parse_metadata_from_tar_header(&hdr, &entry.metadata);
|
||||||
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);
|
||||||
@ -70,7 +64,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);
|
} while (!valid); // Skip over invalid entries
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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_tar_header(const struct tar_header* hdr, struct minitar_entry_metadata* metadata)
|
void minitar_parse_metadata_from_tar_header(const struct tar_header* hdr, struct minitar_entry_metadata* metadata)
|
||||||
{
|
{
|
||||||
if (!strlen(hdr->prefix))
|
if (!strlen(hdr->prefix))
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user