diff options
| author | Rafał Miłecki | 2020-06-25 12:02:32 +0000 |
|---|---|---|
| committer | Rafał Miłecki | 2023-11-21 15:21:21 +0000 |
| commit | 3b114de29cf74e38ba4131030488417c11808e8a (patch) | |
| tree | 1f824b3d22a74c421f0a9f487107a1aa1c54aea6 | |
| parent | ba5bc4e1ae9d3e7b41d3bed39ce505670dc95078 (diff) | |
| download | firmware-utils-3b114de29cf74e38ba4131030488417c11808e8a.tar.gz | |
lxlfw: move code opening LXL to helper function
It will be reused for extracting data.
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
| -rw-r--r-- | src/lxlfw.c | 80 |
1 files changed, 57 insertions, 23 deletions
diff --git a/src/lxlfw.c b/src/lxlfw.c index 15678b8..1f5da46 100644 --- a/src/lxlfw.c +++ b/src/lxlfw.c @@ -44,6 +44,8 @@ _a > _b ? _a : _b; \ }) +#define MAX_SUPPORTED_VERSION 2 + #define LXL_FLAGS_VENDOR_LUXUL 0x00000001 struct lxl_hdr { @@ -60,6 +62,10 @@ struct lxl_hdr { uint8_t v2_end[0]; } __packed; +/************************************************** + * Helpers + **************************************************/ + static uint32_t lxlfw_hdr_len(uint32_t version) { switch (version) { @@ -75,6 +81,55 @@ static uint32_t lxlfw_hdr_len(uint32_t version) } } +/** + * lxlfw_open - open Luxul firmware file and validate it + * + * @pathname: Luxul firmware file + * @hdr: struct to read to + */ +static FILE *lxlfw_open(const char *pathname, struct lxl_hdr *hdr) +{ + size_t v0_len = lxlfw_hdr_len(0); + size_t min_hdr_len; + uint32_t version; + size_t bytes; + FILE *lxl; + + lxl = fopen(pathname, "r"); + if (!lxl) { + fprintf(stderr, "Could not open \"%s\" file\n", pathname); + goto err_out; + } + + bytes = fread(hdr, 1, v0_len, lxl); + if (bytes != v0_len) { + fprintf(stderr, "Input file too small to use Luxul format\n"); + goto err_close; + } + + if (memcmp(hdr->magic, "LXL#", 4)) { + fprintf(stderr, "File <file> does not use Luxul's format\n"); + goto err_close; + } + + version = le32_to_cpu(hdr->version); + + min_hdr_len = lxlfw_hdr_len(min(version, MAX_SUPPORTED_VERSION)); + + bytes = fread(((uint8_t *)hdr) + v0_len, 1, min_hdr_len - v0_len, lxl); + if (bytes != min_hdr_len - v0_len) { + fprintf(stderr, "Input file too small for header version %d\n", version); + goto err_close; + } + + return lxl; + +err_close: + fclose(lxl); +err_out: + return NULL; +} + /************************************************** * Info **************************************************/ @@ -82,9 +137,7 @@ static uint32_t lxlfw_hdr_len(uint32_t version) static int lxlfw_info(int argc, char **argv) { struct lxl_hdr hdr; uint32_t version; - uint32_t hdr_len; char board[17]; - size_t bytes; int err = 0; FILE *lxl; int flags; @@ -95,33 +148,14 @@ static int lxlfw_info(int argc, char **argv) { goto out; } - lxl = fopen(argv[2], "r"); + lxl = lxlfw_open(argv[2], &hdr); if (!lxl) { - fprintf(stderr, "Could not open \"%s\" file\n", argv[2]); + fprintf(stderr, "Could not open \"%s\" Luxul firmware\n", argv[2]); err = -ENOENT; goto out; } - bytes = fread(&hdr, 1, sizeof(hdr), lxl); - if (bytes < offsetof(struct lxl_hdr, v0_end)) { - fprintf(stderr, "Input file too small to use Luxul format\n"); - err = -ENXIO; - goto err_close; - } - - if (memcmp(hdr.magic, "LXL#", 4)) { - fprintf(stderr, "File <file> does not use Luxul's format\n"); - err = -EINVAL; - goto err_close; - } - version = le32_to_cpu(hdr.version); - hdr_len = lxlfw_hdr_len(version); - if (bytes < hdr_len) { - fprintf(stderr, "Input file too small for header version %d\n", version); - err = -ENXIO; - goto err_close; - } printf("Format version:\t%d\n", version); printf("Header length:\t%d\n", le32_to_cpu(hdr.hdr_len)); |