aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafał Miłecki <rafal@milecki.pl>2021-04-04 14:53:00 +0200
committerRafał Miłecki <rafal@milecki.pl>2021-04-05 09:54:10 +0200
commitd533b27bc09eb5323a05ed44589235a86edcda0d (patch)
tree6b9057be1a4fac8f169da33f505452290b469520
parenta39f85d8b66125f07c4bcbea46b296946de60dc7 (diff)
downloadupstream-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>
-rw-r--r--tools/firmware-utils/src/bcm4908img.c46
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;
}