diff options
author | Stefan Agner <stefan.agner@toradex.com> | 2016-07-13 17:14:37 -0700 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2016-07-22 14:46:20 -0400 |
commit | 14fb5b252ac21c81e24fa734c3f66e9d6c3a0932 (patch) | |
tree | c77092d5e57b6ccb2b7f05acb563b57abd96bae9 | |
parent | 28f0014bde9993354223ed250df22ba97d381565 (diff) |
tools/env: complete environment device config early
Currently flash_read completes a crucial part of the environment
device configuration, the device type (mtd_type). This is rather
confusing as flash_io calls flash_read conditionally, and one might
think flash_write, which also makes use of mtd_type, gets called
before flash_read. But since flash_io is always called with O_RDONLY
first, this is not actually the case in reality.
However, it is much cleaner to complete and verify the config early
in parse_config. This also prepares the code for further extension.
Signed-off-by: Stefan Agner <stefan.agner@toradex.com>
Reviewed-by: Andreas Fenkart
-rw-r--r-- | tools/env/fw_env.c | 110 |
1 files changed, 60 insertions, 50 deletions
diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c index 692abda731..06d6865f3b 100644 --- a/tools/env/fw_env.c +++ b/tools/env/fw_env.c @@ -1021,41 +1021,10 @@ static int flash_write (int fd_current, int fd_target, int dev_target) static int flash_read (int fd) { - struct mtd_info_user mtdinfo; - struct stat st; int rc; - rc = fstat(fd, &st); - if (rc < 0) { - fprintf(stderr, "Cannot stat the file %s\n", - DEVNAME(dev_current)); - return -1; - } - - if (S_ISCHR(st.st_mode)) { - rc = ioctl(fd, MEMGETINFO, &mtdinfo); - if (rc < 0) { - fprintf(stderr, "Cannot get MTD information for %s\n", - DEVNAME(dev_current)); - return -1; - } - if (mtdinfo.type != MTD_NORFLASH && - mtdinfo.type != MTD_NANDFLASH && - mtdinfo.type != MTD_DATAFLASH && - mtdinfo.type != MTD_UBIVOLUME) { - fprintf (stderr, "Unsupported flash type %u on %s\n", - mtdinfo.type, DEVNAME(dev_current)); - return -1; - } - } else { - memset(&mtdinfo, 0, sizeof(mtdinfo)); - mtdinfo.type = MTD_ABSENT; - } - - DEVTYPE(dev_current) = mtdinfo.type; - rc = flash_read_buf(dev_current, fd, environment.image, CUR_ENVSIZE, - DEVOFFSET (dev_current), mtdinfo.type); + DEVOFFSET(dev_current), DEVTYPE(dev_current)); if (rc != CUR_ENVSIZE) return -1; @@ -1328,10 +1297,55 @@ int fw_env_open(struct env_opts *opts) return 0; } +static int check_device_config(int dev) +{ + struct stat st; + int fd, rc = 0; + + fd = open(DEVNAME(dev), O_RDONLY); + if (fd < 0) { + fprintf(stderr, + "Cannot open %s: %s\n", + DEVNAME(dev), strerror(errno)); + return -1; + } + + rc = fstat(fd, &st); + if (rc < 0) { + fprintf(stderr, "Cannot stat the file %s\n", + DEVNAME(dev)); + goto err; + } + + if (S_ISCHR(st.st_mode)) { + struct mtd_info_user mtdinfo; + rc = ioctl(fd, MEMGETINFO, &mtdinfo); + if (rc < 0) { + fprintf(stderr, "Cannot get MTD information for %s\n", + DEVNAME(dev)); + goto err; + } + if (mtdinfo.type != MTD_NORFLASH && + mtdinfo.type != MTD_NANDFLASH && + mtdinfo.type != MTD_DATAFLASH && + mtdinfo.type != MTD_UBIVOLUME) { + fprintf(stderr, "Unsupported flash type %u on %s\n", + mtdinfo.type, DEVNAME(dev)); + goto err; + } + DEVTYPE(dev) = mtdinfo.type; + } else { + DEVTYPE(dev) = MTD_ABSENT; + } + +err: + close(fd); + return rc; +} static int parse_config(struct env_opts *opts) { - struct stat st; + int rc; if (!opts) opts = &default_opts; @@ -1375,25 +1389,21 @@ static int parse_config(struct env_opts *opts) HaveRedundEnv = 1; #endif #endif - if (stat (DEVNAME (0), &st)) { - fprintf (stderr, - "Cannot access MTD device %s: %s\n", - DEVNAME (0), strerror (errno)); - return -1; - } + rc = check_device_config(0); + if (rc < 0) + return rc; - if (HaveRedundEnv && stat (DEVNAME (1), &st)) { - fprintf (stderr, - "Cannot access MTD device %s: %s\n", - DEVNAME (1), strerror (errno)); - return -1; - } + if (HaveRedundEnv) { + rc = check_device_config(1); + if (rc < 0) + return rc; - if (HaveRedundEnv && ENVSIZE(0) != ENVSIZE(1)) { - ENVSIZE(0) = ENVSIZE(1) = min(ENVSIZE(0), ENVSIZE(1)); - fprintf(stderr, - "Redundant environments have inequal size, set to 0x%08lx\n", - ENVSIZE(1)); + if (ENVSIZE(0) != ENVSIZE(1)) { + ENVSIZE(0) = ENVSIZE(1) = min(ENVSIZE(0), ENVSIZE(1)); + fprintf(stderr, + "Redundant environments have inequal size, set to 0x%08lx\n", + ENVSIZE(1)); + } } usable_envsize = CUR_ENVSIZE - sizeof(uint32_t); |