mtd: fix up error messages
[openwrt/openwrt.git] / package / system / mtd / src / mtd.c
index 03ee5671d5d4c32575ba13987c8ca94159460022..0d5ad22ef66a9d5acd28823af62f9fff29ff4186 100644 (file)
@@ -2,7 +2,7 @@
  * mtd - simple memory technology device manipulation tool
  *
  * Copyright (C) 2005      Waldemar Brodkorb <wbx@dass-it.de>,
- * Copyright (C) 2005-2009 Felix Fietkau <nbd@openwrt.org>
+ * Copyright (C) 2005-2009 Felix Fietkau <nbd@nbd.name>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License v2
@@ -179,14 +179,21 @@ image_check(int imagefd, const char *mtd)
 {
        uint32_t magic;
        int ret = 1;
+       int bufread;
+
+       while (buflen < sizeof(magic)) {
+               bufread = read(imagefd, buf + buflen, sizeof(magic) - buflen);
+               if (bufread < 1)
+                       break;
+
+               buflen += bufread;
+       }
 
        if (buflen < sizeof(magic)) {
-               buflen += read(imagefd, buf + buflen, sizeof(magic) - buflen);
-               if (buflen < sizeof(magic)) {
-                       fprintf(stdout, "Could not get image magic\n");
-                       return 0;
-               }
+               fprintf(stdout, "Could not get image magic\n");
+               return 0;
        }
+
        magic = ((uint32_t *)buf)[0];
 
        if (be32_to_cpu(magic) == TRX_MAGIC)
@@ -579,7 +586,7 @@ resume:
                                if (!quiet)
                                        fprintf(stderr, "\b\b\b   ");
                                if (quiet < 2)
-                                       fprintf(stderr, "\nAppending jffs2 data from %s to %s...", jffs2file, mtd);
+                                       fprintf(stderr, "\nAppending jffs2 data from %s to %s..\n.", jffs2file, mtd);
                                /* got an EOF marker - this is the place to add some jffs2 data */
                                skip = mtd_replace_jffs2(mtd, fd, e, jffs2file);
                                jffs2_replaced = 1;
@@ -659,8 +666,19 @@ resume:
                offset = 0;
        }
 
-       if (jffs2_replaced && trx_fixup) {
-               trx_fixup(fd, mtd);
+       if (jffs2_replaced) {
+               switch (imageformat) {
+               case MTD_IMAGE_FORMAT_TRX:
+                       if (trx_fixup)
+                               trx_fixup(fd, mtd);
+                       break;
+               case MTD_IMAGE_FORMAT_SEAMA:
+                       if (mtd_fixseama)
+                               mtd_fixseama(mtd, 0, 0);
+                       break;
+               default:
+                       break;
+               }
        }
 
        if (!quiet)
@@ -720,6 +738,10 @@ static void usage(void)
            fprintf(stderr,
        "        -o offset               offset of the image header in the partition(for fixtrx)\n");
        }
+       if (mtd_fixtrx || mtd_fixseama) {
+               fprintf(stderr,
+       "        -c datasize             amount of data to be used for checksum calculation (for fixtrx / fixseama)\n");
+       }
        fprintf(stderr,
 #ifdef FIS_SUPPORT
        "        -F <part>[:<size>[:<entrypoint>]][,<part>...]\n"
@@ -751,7 +773,7 @@ int main (int argc, char **argv)
        int ch, i, boot, imagefd = 0, force, unlocked;
        char *erase[MAX_ARGS], *device = NULL;
        char *fis_layout = NULL;
-       size_t offset = 0, part_offset = 0, dump_len = 0;
+       size_t offset = 0, data_size = 0, part_offset = 0, dump_len = 0;
        enum {
                CMD_ERASE,
                CMD_WRITE,
@@ -775,7 +797,7 @@ int main (int argc, char **argv)
 #ifdef FIS_SUPPORT
                        "F:"
 #endif
-                       "frnqe:d:s:j:p:o:l:")) != -1)
+                       "frnqe:d:s:j:p:o:c:l:")) != -1)
                switch (ch) {
                        case 'f':
                                force = 1;
@@ -835,6 +857,14 @@ int main (int argc, char **argv)
                                        usage();
                                }
                                break;
+                       case 'c':
+                               errno = 0;
+                               data_size = strtoul(optarg, 0, 0);
+                               if (errno) {
+                                       fprintf(stderr, "-c: illegal numeric string\n");
+                                       usage();
+                               }
+                               break;
 #ifdef FIS_SUPPORT
                        case 'F':
                                fis_layout = optarg;
@@ -948,16 +978,18 @@ int main (int argc, char **argv)
                        mtd_write_jffs2(device, imagefile, jffs2dir);
                        break;
                case CMD_FIXTRX:
-                   if (mtd_fixtrx) {
-                           mtd_fixtrx(device, offset);
-            }
+                       if (mtd_fixtrx) {
+                               mtd_fixtrx(device, offset, data_size);
+                       }
+                       break;
                case CMD_RESETBC:
-                   if (mtd_resetbc) {
-                           mtd_resetbc(device);
-            }
+                       if (mtd_resetbc) {
+                               mtd_resetbc(device);
+                       }
+                       break;
                case CMD_FIXSEAMA:
                        if (mtd_fixseama)
-                           mtd_fixseama(device, 0);
+                               mtd_fixseama(device, 0, data_size);
                        break;
        }