pull patches back in from 2.20-2 build
[debian/cpmtools] / fsck.cpm.c
index 9878609c22fde985e26a728ab8f3ae8e0cefbc55..380df469f757b50874bc382d86a032b6796a1a2f 100644 (file)
@@ -8,13 +8,9 @@
 #include <stdlib.h>
 #include <errno.h>
 
-#include "getopt.h"
+#include "getopt_.h"
 #include "cpmdir.h"
 #include "cpmfs.h"
-
-#ifdef USE_DMALLOC
-#include <dmalloc.h>
-#endif
 /*}}}*/
 /* #defines */ /*{{{*/
 /* your favourite password *:-) */
@@ -240,16 +236,16 @@ static int fsck(struct cpmInode *root, const char *image)
       {
         int block,min,max,i;
 
-        min=(sb->maxdir*32+sb->blksiz-1)/sb->blksiz;
+        min=sb->dirblks;
         max=sb->size;
         for (i=0; i<16; ++i)
         {
           block=dir->pointers[i]&0xff;
-          if (sb->size>=256) block+=(dir->pointers[++i]&0xff)<<8;
+          if (sb->size>256) block+=(dir->pointers[++i]&0xff)<<8;
           if (block>0)
           {
             ++usedBlocks;
-            if (block<min || block>max)
+            if (block<min || block>=max)
             {
               printf("Error: Bad block number (extent=%d, name=\"%s\", block=%d)\n",extent,prfile(sb,extent),block);
               if (ask("Remove file"))
@@ -278,8 +274,8 @@ static int fsck(struct cpmInode *root, const char *image)
         {
         /* [JCE] Rewritten because the previous implementation didn't work
          *       properly with Visual C++ */
-          if (dir->pointers[i] || (sb->size>=256 && dir->pointers[i+1])) ++used;
-          if (sb->size >= 256) ++i;
+          if (dir->pointers[i] || (sb->size>256 && dir->pointers[i+1])) ++used;
+          if (sb->size>256) ++i;
         }
         recordsInBlocks=(((unsigned char)dir->blkcnt)*128+sb->blksiz-1)/sb->blksiz;
         if (recordsInBlocks!=used)
@@ -492,13 +488,13 @@ static int fsck(struct cpmInode *root, const char *image)
     for (i=0; i<16; ++i)
     {
       block=dir->pointers[i]&0xff;
-      if (sb->size>=256) block+=(dir->pointers[++i]&0xff)<<8;
+      if (sb->size>256) block+=(dir->pointers[++i]&0xff)<<8;
       for (extent2=0; extent2<sb->maxdir; ++extent2) if ((dir2=sb->dir+extent2)->status>=0 && dir2->status<=(sb->type==CPMFS_P2DOS ? 31 : 15))
       {
         for (j=0; j<16; ++j)
         {
           block2=dir2->pointers[j]&0xff;
-          if (sb->size>=256) block2+=(dir2->pointers[++j]&0xff)<<8;
+          if (sb->size>256) block2+=(dir2->pointers[++j]&0xff)<<8;
           if (block!=0 && block2!=0 && block==block2 && !(extent==extent2 && i==j))
           {
             printf("Error: Multiple allocated block (extent=%d,%d, name=\"%s\"",extent,extent2,prfile(sb,extent));
@@ -547,7 +543,7 @@ static int fsck(struct cpmInode *root, const char *image)
       for (i=0; i<16; ++i)
       {
         block=dir->pointers[i]&0xff;
-        if (sb->size>=256) block+=(dir->pointers[++i]&0xff)<<8;
+        if (sb->size>256) block+=(dir->pointers[++i]&0xff)<<8;
         if (previous!=-1)
         {
           if (block!=0 && block!=(previous+1)) ++fragmented;
@@ -571,24 +567,27 @@ int main(int argc, char *argv[])
 {
   const char *err;
   const char *image;
-  const char *format=FORMAT;
+  const char *format;
   const char *devopts=NULL;
+  int uppercase=0;
   int c,usage=0;
   struct cpmSuperBlock sb;
   struct cpmInode root;
   enum Result ret;
 
-  while ((c=getopt(argc,argv,"T:f:nh?"))!=EOF) switch(c)
+  if (!(format=getenv("CPMTOOLSFMT"))) format=FORMAT;
+  while ((c=getopt(argc,argv,"T:f:nuh?"))!=EOF) switch(c)
   {
     case 'f': format=optarg; break;
     case 'T': devopts=optarg; break;
     case 'n': norepair=1; break;
+    case 'u': uppercase=1; break;
     case 'h':
     case '?': usage=1; break;
   }
 
   if (optind!=(argc-1)) usage=1;
-  else image=argv[optind];
+  else image=argv[optind++];
 
   if (usage)
   {
@@ -599,15 +598,19 @@ int main(int argc, char *argv[])
   {
     if ((err=Device_open(&sb.dev, image,O_RDONLY, devopts)))
     {
-      fprintf(stderr,"%s: can not open %s: %s\n",cmd,image,err);
+      fprintf(stderr,"%s: cannot open %s: %s\n",cmd,image,err);
       exit(1);
     }
     else
     {
-      fprintf(stderr,"%s: can not open %s for writing, no repair possible\n",cmd,image);
+      fprintf(stderr,"%s: cannot open %s for writing, no repair possible\n",cmd,image);
     }
   }
-  cpmReadSuper(&sb,&root,format);
+  if (cpmReadSuper(&sb,&root,format,uppercase)==-1)
+  {
+    fprintf(stderr,"%s: cannot read superblock (%s)\n",cmd,boo);
+    exit(1);
+  }
   ret=fsck(&root,image);
   if (ret&MODIFIED)
   {