X-Git-Url: http://git.openwrt.org/?p=project%2Ffstools.git;a=blobdiff_plain;f=libfstools%2Fmtd.c;fp=libfstools%2Fmtd.c;h=aae633e6ff1ff2eb29b2178fb22eb9d128bbcb03;hp=77c71eeb29a3ba7a67c42514b5e17e324baf53d4;hb=f5c7c1813f52e6d7b59ecfb2f9f95e69b05b1980;hpb=189b41b6b48786a51eb2b8bc450cb7d560f030f0 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)