summaryrefslogtreecommitdiff
path: root/lib/libmtd.c
diff options
context:
space:
mode:
authorDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2016-08-25 13:41:50 +0200
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2016-11-17 11:36:55 +0100
commitf45bc6e3c99b62d04d50f210ed8d4f8d02b15357 (patch)
tree4251a99371b756dc55ba2e0c66a7c2ee139b4960 /lib/libmtd.c
parent5841f15bf5d9cba2bdcc6526000538fedeee46e3 (diff)
Remove unused and broken mtd_write_img function from libmtd
The function _tries_ to support short reads but doesn't adjust the pointer into the buffer. If a short read happens, we scrambles the flash contents. Interrupted reads aren't handled. Short or interrupted writes aren't handled at all. Either a write succeeds writing the entire buffer or the function gives up. During an attempt at fixing it, it was discovered, that no mtd-utils program uses this function. Furthermore, its highly specific nature makes it more of a "feature looking for use case". Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at> Signed-off-by: Richard Weinberger <richard@nod.at>
Diffstat (limited to 'lib/libmtd.c')
-rw-r--r--lib/libmtd.c97
1 files changed, 0 insertions, 97 deletions
diff --git a/lib/libmtd.c b/lib/libmtd.c
index 6ced256..1d162c7 100644
--- a/lib/libmtd.c
+++ b/lib/libmtd.c
@@ -1279,103 +1279,6 @@ int mtd_write_oob(libmtd_t desc, const struct mtd_dev_info *mtd, int fd,
MEMWRITEOOB64, MEMWRITEOOB);
}
-int mtd_write_img(const struct mtd_dev_info *mtd, int fd, int eb, int offs,
- const char *img_name)
-{
- int tmp, ret, in_fd, len, written = 0;
- off_t seek;
- struct stat st;
- char *buf;
-
- ret = mtd_valid_erase_block(mtd, eb);
- if (ret)
- return ret;
-
- if (offs < 0 || offs >= mtd->eb_size) {
- errmsg("bad offset %d, mtd%d eraseblock size is %d",
- offs, mtd->mtd_num, mtd->eb_size);
- errno = EINVAL;
- return -1;
- }
- if (offs % mtd->subpage_size) {
- errmsg("write offset %d is not aligned to mtd%d min. I/O size %d",
- offs, mtd->mtd_num, mtd->subpage_size);
- errno = EINVAL;
- return -1;
- }
-
- in_fd = open(img_name, O_RDONLY | O_CLOEXEC);
- if (in_fd == -1)
- return sys_errmsg("cannot open \"%s\"", img_name);
-
- if (fstat(in_fd, &st)) {
- sys_errmsg("cannot stat %s", img_name);
- goto out_close;
- }
-
- len = st.st_size;
- if (len % mtd->subpage_size) {
- errmsg("size of \"%s\" is %d byte, which is not aligned to "
- "mtd%d min. I/O size %d", img_name, len, mtd->mtd_num,
- mtd->subpage_size);
- errno = EINVAL;
- goto out_close;
- }
- tmp = (offs + len + mtd->eb_size - 1) / mtd->eb_size;
- if (eb + tmp > mtd->eb_cnt) {
- errmsg("\"%s\" image size is %d bytes, mtd%d size is %d "
- "eraseblocks, the image does not fit if we write it "
- "starting from eraseblock %d, offset %d",
- img_name, len, mtd->mtd_num, mtd->eb_cnt, eb, offs);
- errno = EINVAL;
- goto out_close;
- }
-
- /* Seek to the beginning of the eraseblock */
- seek = (off_t)eb * mtd->eb_size + offs;
- if (lseek(fd, seek, SEEK_SET) != seek) {
- sys_errmsg("cannot seek mtd%d to offset %"PRIdoff_t,
- mtd->mtd_num, seek);
- goto out_close;
- }
-
- buf = xmalloc(mtd->eb_size);
-
- while (written < len) {
- int rd = 0;
-
- do {
- ret = read(in_fd, buf, mtd->eb_size - offs - rd);
- if (ret == -1) {
- sys_errmsg("cannot read \"%s\"", img_name);
- goto out_free;
- }
- rd += ret;
- } while (ret && rd < mtd->eb_size - offs);
-
- ret = write(fd, buf, rd);
- if (ret != rd) {
- sys_errmsg("cannot write %d bytes to mtd%d (eraseblock %d, offset %d)",
- len, mtd->mtd_num, eb, offs);
- goto out_free;
- }
-
- offs = 0;
- eb += 1;
- written += rd;
- }
-
- free(buf);
- close(in_fd);
- return 0;
-
-out_free:
- free(buf);
-out_close:
- close(in_fd);
- return -1;
-}
-
int mtd_probe_node(libmtd_t desc, const char *node)
{
struct stat st;