diff options
author | Jakob Kaivo <jkk@ung.org> | 2019-11-20 17:03:55 -0500 |
---|---|---|
committer | Jakob Kaivo <jkk@ung.org> | 2019-11-20 17:03:55 -0500 |
commit | 1b1b9d0177e051400b5722cfc9a5c42cb27a7b9e (patch) | |
tree | ce89263b1ec0442a0bb4b9c1f3e8510ffb4fa684 | |
parent | b2c6b21b41d315cb95a80ed1f61d25a140ab0e51 (diff) |
s/TAR_HEADER_SIZE/PAX_BLOCK_SIZE/
-rw-r--r-- | pax.c | 33 | ||||
-rw-r--r-- | pax.h | 6 |
2 files changed, 19 insertions, 20 deletions
@@ -37,41 +37,40 @@ #include "pax.h" -enum pax_format pax_identify(size_t n, void *header) +static enum pax_format pax_identify(void *header) { - if (n < sizeof(MAGIC)) { - return PAX_FORMAT_UNKNOWN; + if (memcmp(header, MAGIC, sizeof(MAGIC) - 1) == 0) { + return PAX_FORMAT_CPIO; } - if (n >= cpio_header_size) { - if (memcmp(header, MAGIC, sizeof(MAGIC) - 1) == 0) { - return PAX_FORMAT_CPIO; - } - } - - /* TODO: differentiate between tar and pax format */ - if (n >= TAR_HEADER_SIZE) { - struct tar_header *th = header; - if (memcmp(th->magic, TMAGIC, TMAGLEN) == 0) { - return PAX_FORMAT_TAR; + struct tar_header *th = header; + if (memcmp(th->magic, TMAGIC, TMAGLEN) == 0) { + if (th->typeflag[0] == 'x' || th->typeflag[0] == 'g') { + return PAX_FORMAT_PAX; } + return PAX_FORMAT_TAR; } fprintf(stderr, "pax: unknown archive format\n"); return PAX_FORMAT_UNKNOWN; } -int pax_list(FILE *input) +static int pax_list(FILE *input) { - char header[TAR_HEADER_SIZE]; + char header[PAX_BLOCK_SIZE]; int nread = fread(header, 1, sizeof(header), input); + if (nread != sizeof(header)) { + fprintf(stderr, "pax: input truncated\n"); + return 1; + } - switch (pax_identify(nread, header)) { + switch (pax_identify(header)) { case PAX_FORMAT_CPIO: return cpio_list(input, nread, header); break; case PAX_FORMAT_TAR: + case PAX_FORMAT_PAX: return tar_list(input, nread, header); break; @@ -25,7 +25,7 @@ #include <stdint.h> #include <sys/stat.h> -#define TAR_HEADER_SIZE 512 +#define PAX_BLOCK_SIZE 512 struct tar_header { char name[100]; @@ -65,8 +65,8 @@ enum pax_format { PAX_FORMAT_TAR, }; -int cpio_list(FILE *input, size_t firstlen, void *firstblock); -int tar_list(FILE *input, size_t firstlen, void *firstblock); +int cpio_list(FILE *input, size_t nblocks, void *firstblock); +int tar_list(FILE *input, size_t nblocks, void *firstblock); void pax_list_file(struct stat *st, const char *filename); uintmax_t pax_atoi(size_t n, const char s[static n], int base); |