diff options
-rw-r--r-- | libfstools/mtd.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/libfstools/mtd.c b/libfstools/mtd.c index 77c71ee..aae633e 100644 --- a/libfstools/mtd.c +++ b/libfstools/mtd.c @@ -36,20 +36,31 @@ struct mtd_volume { static struct driver mtd_driver; +static int mtd_open_device(const char *dev) +{ + int ret; + + ret = open(dev, O_RDWR | O_SYNC); + if (ret < 0) + ret = open(dev, O_RDONLY); + + return ret; +} + static int mtd_open(const char *mtd, int block) { FILE *fp; char dev[PATH_MAX]; - int i, ret, flags = O_RDWR | O_SYNC; + int i, ret; if ((fp = fopen("/proc/mtd", "r"))) { while (fgets(dev, sizeof(dev), fp)) { if (sscanf(dev, "mtd%d:", &i) && strstr(dev, mtd)) { snprintf(dev, sizeof(dev), "/dev/mtd%s/%d", (block ? "block" : ""), i); - ret = open(dev, flags); + ret = mtd_open_device(dev); if (ret < 0) { snprintf(dev, sizeof(dev), "/dev/mtd%s%d", (block ? "block" : ""), i); - ret = open(dev, flags); + ret = mtd_open_device(dev); } fclose(fp); return ret; @@ -58,7 +69,7 @@ static int mtd_open(const char *mtd, int block) fclose(fp); } - return open(mtd, flags); + return mtd_open_device(mtd); } static void mtd_volume_close(struct mtd_volume *p) |