diff options
author | Jehan Bing <jehan@orb.com> | 2009-08-05 17:40:24 -0700 |
---|---|---|
committer | Artem Bityutskiy <Artem.Bityutskiy@nokia.com> | 2009-08-11 16:14:20 +0300 |
commit | b0eab860c9b68b74d108836041346544d925fc9f (patch) | |
tree | 828fa58a6ddc6a93b678a05fa39ccaf82ce0a20d | |
parent | 6eba06c395f72e43505b21f073275bd071782552 (diff) |
nandwrite: unified reading from standard input and from file - part 1
Use same code path for reading data (not the OOB) from either the
standard input or a regular file.
Signed-off-by: Jehan Bing <jehan@orb.com>
Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
-rw-r--r-- | nandwrite.c | 54 |
1 files changed, 22 insertions, 32 deletions
diff --git a/nandwrite.c b/nandwrite.c index 1a9449b..3695c20 100644 --- a/nandwrite.c +++ b/nandwrite.c @@ -260,7 +260,6 @@ int main(int argc, char * const argv[]) int ret, readlen; int oobinfochanged = 0; struct nand_oobinfo old_oobinfo; - int readcnt = 0; bool failed = true; process_options(argc, argv); @@ -476,37 +475,17 @@ int main(int argc, char * const argv[]) } - readlen = meminfo.writesize; + { + readlen = meminfo.writesize; - if (ifd != STDIN_FILENO) { int tinycnt = 0; - if (pad && (imglen < readlen)) - { - readlen = imglen; - erase_buffer(writebuf + readlen, meminfo.writesize - readlen); - } - - /* Read Page Data from input file */ - while(tinycnt < readlen) { + while (tinycnt < readlen) { cnt = read(ifd, writebuf + tinycnt, readlen - tinycnt); if (cnt == 0) { // EOF break; } else if (cnt < 0) { - perror ("File I/O error on input file"); - goto closeall; - } - tinycnt += cnt; - } - } else { - int tinycnt = 0; - - while(tinycnt < readlen) { - cnt = read(ifd, writebuf + tinycnt, readlen - tinycnt); - if (cnt == 0) { // EOF - break; - } else if (cnt < 0) { - perror ("File I/O error on stdin"); + perror ("File I/O error on input"); goto closeall; } tinycnt += cnt; @@ -514,18 +493,29 @@ int main(int argc, char * const argv[]) /* No padding needed - we are done */ if (tinycnt == 0) { - imglen = 0; + // For standard input, set the imglen to 0 to signal + // the end of the "file". For non standard input, leave + // it as-is to detect an early EOF + if (ifd == STDIN_FILENO) { + imglen = 0; + } break; } - /* No more bytes - we are done after writing the remaining bytes */ - if (cnt == 0) { - imglen = 0; + /* Padding */ + if (tinycnt < readlen) { + if (!pad) { + fprintf(stderr, "Unexpected EOF. Expecting at least " + "%d more bytes. Use the padding option.\n", + readlen - tinycnt); + goto closeall; + } + erase_buffer(writebuf + tinycnt, readlen - tinycnt); } - /* Padding */ - if (pad && (tinycnt < readlen)) { - erase_buffer(writebuf + tinycnt, meminfo.writesize - tinycnt); + if ((ifd == STDIN_FILENO) && (cnt == 0)) { + /* No more bytes - we are done after writing the remaining bytes */ + imglen = 0; } } |