Message ID | 1468854585-9705-1-git-send-email-zajec5@gmail.com |
---|---|
State | Accepted |
Headers | show |
On 18 July 2016 at 17:09, Rafał Miłecki <zajec5@gmail.com> wrote: > Errors may happen, it's e.g. easy on embedded devices to run out of space > when dumping big partitions. This patch adds a helper function for > writing. It deals with partial writes and just returns 0 on success or > error number. > > The old code didn't check for errors at all which could result in > incomplete dumps without exiting with an error. > > Signed-off-by: Rafał Miłecki <zajec5@gmail.com> Can this finally be pushed, please?
On 09/06/2016 09:42 PM, Rafał Miłecki wrote: > On 18 July 2016 at 17:09, Rafał Miłecki <zajec5@gmail.com> wrote: >> Errors may happen, it's e.g. easy on embedded devices to run out of space >> when dumping big partitions. This patch adds a helper function for >> writing. It deals with partial writes and just returns 0 on success or >> error number. >> >> The old code didn't check for errors at all which could result in >> incomplete dumps without exiting with an error. >> >> Signed-off-by: Rafał Miłecki <zajec5@gmail.com> > > Can this finally be pushed, please? Unfortunately the mtd-utils appear to be currently not very well maintained and a number of patches submitted to the mailing list got more or less neglected. However there _is_ currently an effort on the way to do a major overhaul/cleanup of the mtd-utils that also incorporates a bunch of fixes that accumulated on the mailing list, also including this patch. You can take a look at the current progress here: https://github.com/sigma-star/mtd-utils/commits/wip_v2-rc1 David
diff --git a/nand-utils/nanddump.c b/nand-utils/nanddump.c index 4ee7ed4..db1e1e5 100644 --- a/nand-utils/nanddump.c +++ b/nand-utils/nanddump.c @@ -293,6 +293,31 @@ nil: linebuf[lx++] = '\0'; } +/** + * ofd_write - writes whole buffer to the file associated with a descriptor + * + * On failure an error (negative number) is returned. Otherwise 0 is returned. + */ +static int ofd_write(int ofd, const void *buf, size_t nbyte) +{ + const unsigned char *data = buf; + ssize_t bytes; + + while (nbyte) { + bytes = write(ofd, data, nbyte); + if (bytes < 0) { + int err = -errno; + + sys_errmsg("Unable to write to output"); + + return err; + } + data += bytes; + nbyte -= bytes; + } + + return 0; +} /* * Main program @@ -309,6 +334,7 @@ int main(int argc, char * const argv[]) bool eccstats = false; unsigned char *readbuf = NULL, *oobbuf = NULL; libmtd_t mtd_desc; + int err; process_options(argc, argv); @@ -443,10 +469,15 @@ int main(int argc, char * const argv[]) for (i = 0; i < bs; i += PRETTY_ROW_SIZE) { pretty_dump_to_buffer(readbuf + i, PRETTY_ROW_SIZE, pretty_buf, PRETTY_BUF_LEN, true, canonical, ofs + i); - write(ofd, pretty_buf, strlen(pretty_buf)); + err = ofd_write(ofd, pretty_buf, strlen(pretty_buf)); + if (err) + goto closeall; } - } else - write(ofd, readbuf, bs); + } else { + err = ofd_write(ofd, readbuf, bs); + if (err) + goto closeall; + } if (omitoob) continue; @@ -466,10 +497,15 @@ int main(int argc, char * const argv[]) for (i = 0; i < mtd.oob_size; i += PRETTY_ROW_SIZE) { pretty_dump_to_buffer(oobbuf + i, mtd.oob_size - i, pretty_buf, PRETTY_BUF_LEN, false, canonical, 0); - write(ofd, pretty_buf, strlen(pretty_buf)); + err = ofd_write(ofd, pretty_buf, strlen(pretty_buf)); + if (err) + goto closeall; } - } else - write(ofd, oobbuf, mtd.oob_size); + } else { + err = ofd_write(ofd, oobbuf, mtd.oob_size); + if (err) + goto closeall; + } } /* Close the output file and MTD device, free memory */
Errors may happen, it's e.g. easy on embedded devices to run out of space when dumping big partitions. This patch adds a helper function for writing. It deals with partial writes and just returns 0 on success or error number. The old code didn't check for errors at all which could result in incomplete dumps without exiting with an error. Signed-off-by: Rafał Miłecki <zajec5@gmail.com> --- V2: Use sys_errmsg as in patch pointed by Richard. Call ofd_write also when using pretty output. --- nand-utils/nanddump.c | 48 ++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 6 deletions(-)