use MEMGETBADBLOCK to look for bad blocks when reading MTD partitions
diff --git a/mtdutils/mtdutils.c b/mtdutils/mtdutils.c
index fc06766..8d32520 100644
--- a/mtdutils/mtdutils.c
+++ b/mtdutils/mtdutils.c
@@ -283,19 +283,26 @@
         return -1;
     }
 
-    off_t pos = lseek(fd, 0, SEEK_CUR);
+    loff_t pos = lseek64(fd, 0, SEEK_CUR);
+
     ssize_t size = partition->erase_size;
+    int mgbb;
+
     while (pos + size <= (int) partition->size) {
-        if (lseek(fd, pos, SEEK_SET) != pos || read(fd, data, size) != size) {
-            fprintf(stderr, "mtd: read error at 0x%08lx (%s)\n",
+        if (lseek64(fd, pos, SEEK_SET) != pos || read(fd, data, size) != size) {
+            fprintf(stderr, "mtd: read error at 0x%08llx (%s)\n",
                     pos, strerror(errno));
         } else if (ioctl(fd, ECCGETSTATS, &after)) {
             fprintf(stderr, "mtd: ECCGETSTATS error (%s)\n", strerror(errno));
             return -1;
         } else if (after.failed != before.failed) {
-            fprintf(stderr, "mtd: ECC errors (%d soft, %d hard) at 0x%08lx\n",
+            fprintf(stderr, "mtd: ECC errors (%d soft, %d hard) at 0x%08llx\n",
                     after.corrected - before.corrected,
                     after.failed - before.failed, pos);
+        } else if ((mgbb = ioctl(fd, MEMGETBADBLOCK, &pos))) {
+            fprintf(stderr,
+                    "mtd: MEMGETBADBLOCK returned %d at 0x%08llx (errno=%d)\n",
+                    mgbb, pos, errno);
         } else {
             int i;
             for (i = 0; i < size; ++i) {
@@ -303,7 +310,7 @@
                     return 0;  // Success!
                 }
             }
-            fprintf(stderr, "mtd: read all-zero block at 0x%08lx; skipping\n",
+            fprintf(stderr, "mtd: read all-zero block at 0x%08llx; skipping\n",
                     pos);
         }