diff options
author | Rafał Miłecki <rafal@milecki.pl> | 2021-04-04 14:53:00 +0200 |
---|---|---|
committer | Rafał Miłecki <rafal@milecki.pl> | 2021-04-05 09:54:10 +0200 |
commit | d533b27bc09eb5323a05ed44589235a86edcda0d (patch) | |
tree | 6b9057be1a4fac8f169da33f505452290b469520 /tools | |
parent | a39f85d8b66125f07c4bcbea46b296946de60dc7 (diff) | |
download | upstream-d533b27bc09eb5323a05ed44589235a86edcda0d.tar.gz upstream-d533b27bc09eb5323a05ed44589235a86edcda0d.tar.bz2 upstream-d533b27bc09eb5323a05ed44589235a86edcda0d.zip |
firmware-utils: bcm4908img: support reading from stdin
1. Don't allow pipe stdin as we need to fseek()
2. Don't alow TTY as it doesn't make sense for binary input
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/firmware-utils/src/bcm4908img.c | 46 |
1 files changed, 38 insertions, 8 deletions
diff --git a/tools/firmware-utils/src/bcm4908img.c b/tools/firmware-utils/src/bcm4908img.c index 9cb16a12ee..16e0afe9de 100644 --- a/tools/firmware-utils/src/bcm4908img.c +++ b/tools/firmware-utils/src/bcm4908img.c @@ -149,6 +149,39 @@ uint32_t bcm4908img_crc32(uint32_t crc, uint8_t *buf, size_t len) { } /************************************************** + * Helpers + **************************************************/ + +static FILE *bcm4908img_open(const char *pathname, const char *mode) { + struct stat st; + + if (pathname) + return fopen(pathname, mode); + + if (isatty(fileno(stdin))) { + fprintf(stderr, "Reading from TTY stdin is unsupported\n"); + return NULL; + } + + if (fstat(fileno(stdin), &st)) { + fprintf(stderr, "Failed to fstat stdin: %d\n", -errno); + return NULL; + } + + if (S_ISFIFO(st.st_mode)) { + fprintf(stderr, "Reading from pipe stdin is unsupported\n"); + return NULL; + } + + return stdin; +} + +static void bcm4908img_close(FILE *fp) { + if (fp != stdin) + fclose(fp); +} + +/************************************************** * Existing firmware parser **************************************************/ @@ -234,17 +267,14 @@ static int bcm4908img_parse(FILE *fp, struct bcm4908img_info *info) { static int bcm4908img_check(int argc, char **argv) { struct bcm4908img_info info; + const char *pathname = NULL; FILE *fp; int err = 0; - if (argc < 3) { - fprintf(stderr, "No BCM4908 image pathname passed\n"); - err = -EINVAL; - goto out; - } - pathname = argv[2]; + if (argc >= 3) + pathname = argv[2]; - fp = fopen(pathname, "r"); + fp = bcm4908img_open(pathname, "r"); if (!fp) { fprintf(stderr, "Failed to open %s\n", pathname); err = -EACCES; @@ -260,7 +290,7 @@ static int bcm4908img_check(int argc, char **argv) { printf("Found a valid BCM4908 image (crc: 0x%08x)\n", info.crc32); err_close: - fclose(fp); + bcm4908img_close(fp); out: return err; } |