Major fixes for partitions larger than 4GB. Thanks to Tamlin again.
authorSteven Edwards <winehacker@gmail.com>
Fri, 29 Jul 2005 22:22:12 +0000 (22:22 +0000)
committerSteven Edwards <winehacker@gmail.com>
Fri, 29 Jul 2005 22:22:12 +0000 (22:22 +0000)
svn path=/trunk/; revision=16883

rosapps/sysutils/dosfsck/boot.c
rosapps/sysutils/dosfsck/io.c

index f29231f..dac2d2c 100644 (file)
@@ -272,7 +272,7 @@ void read_boot(DOS_FS *fs)
     unsigned total_sectors;
     unsigned short logical_sector_size, sectors;
     unsigned fat_length;
-    off_t data_size;
+    loff_t data_size;
 
     fs_read(0,sizeof(b),&b);
     logical_sector_size = GET_UNALIGNED_W(b.sector_size);
@@ -286,7 +286,7 @@ void read_boot(DOS_FS *fs)
     total_sectors = sectors ? sectors : CF_LE_L(b.total_sect);
     if (verbose) printf("Checking we can access the last sector of the filesystem\n");
     /* Can't access last odd sector anyway, so round down */
-    fs_test((off_t)((total_sectors & ~1)-1)*(off_t)logical_sector_size,
+    fs_test((loff_t)((total_sectors & ~1)-1)*(loff_t)logical_sector_size,
            logical_sector_size);
     fat_length = CF_LE_W(b.fat_length) ?
                 CF_LE_W(b.fat_length) : CF_LE_L(b.fat32_length);
@@ -296,7 +296,7 @@ void read_boot(DOS_FS *fs)
     fs->root_entries = GET_UNALIGNED_W(b.dir_entries);
     fs->data_start = fs->root_start+ROUND_TO_MULTIPLE(fs->root_entries <<
       MSDOS_DIR_BITS,logical_sector_size);
-    data_size = (off_t)total_sectors*logical_sector_size-fs->data_start;
+    data_size = (loff_t)total_sectors*logical_sector_size-fs->data_start;
     fs->clusters = data_size/fs->cluster_size;
     fs->root_cluster = 0; /* indicates standard, pre-FAT32 root dir */
     fs->fsinfo_start = 0; /* no FSINFO structure */
index 6f1299e..894a714 100644 (file)
@@ -101,17 +101,22 @@ void fs_read(loff_t pos,int size,void *data)
 {
     CHANGE *walk;
     int got;\r
-#if 1 // TMN:\r
-       const size_t readsize_aligned = size + (512 - (size % 512));        // TMN:\r
-       const loff_t seekpos_aligned = pos - (pos % 512);                   // TMN:\r
-       const size_t seek_delta = (size_t)(pos - seekpos_aligned);          // TMN:\r
-       const size_t readsize = (pos - seekpos_aligned) + readsize_aligned; // TMN: \r
-       char* tmpBuf = malloc(readsize);                                    // TMN:
-    if (llseek(fd,seekpos_aligned,0) != seekpos_aligned) pdie("Seek to %lld",pos);\r
-    if ((got = read(fd,tmpBuf,readsize_aligned)) < 0) pdie("Read %d bytes at %lld",size,pos);\r
+#if 1 // TMN\r
+       const size_t readsize_aligned = (size % 512) ? (size + (512 - (size % 512))) : size;        // TMN:\r
+       const loff_t seekpos_aligned = pos - (pos % 512);                   // TMN:\r
+       const size_t seek_delta = (size_t)(pos - seekpos_aligned);          // TMN:\r
+       const size_t readsize = (size_t)(pos - seekpos_aligned) + readsize_aligned; // TMN: \r
+       char* tmpBuf = malloc(readsize_aligned);                                    // TMN:\r
+#ifdef _MSC_VER\r
+    if (llseek(fd,seekpos_aligned,0) != seekpos_aligned) pdie("Seek to %I64d",pos);\r
+    if ((got = read(fd,tmpBuf,readsize_aligned)) < 0) pdie("Read %d bytes at %I64dd",size,pos);\r
+#else\r
+     if (llseek(fd,seekpos_aligned,0) != seekpos_aligned) pdie("Seek to %lld",pos);\r
+     if ((got = read(fd,tmpBuf,readsize_aligned)) < 0) pdie("Read %d bytes at %lld",size,pos);\r
+#endif\r
        assert(got >= size);\r
-       got = size;\r
-       assert(seek_delta + size < readsize);\r
+       got = size;
+       assert(seek_delta + size <= readsize);\r
        memcpy(data, tmpBuf+seek_delta, size);\r
        free(tmpBuf);\r
 #else // TMN:
@@ -122,10 +127,10 @@ void fs_read(loff_t pos,int size,void *data)
     for (walk = changes; walk; walk = walk->next) {
        if (walk->pos < pos+size && walk->pos+walk->size > pos) {
            if (walk->pos < pos)
-               memcpy(data,(char *) walk->data+pos-walk->pos,min(size,
-                 walk->size-pos+walk->pos));
-           else memcpy((char *) data+walk->pos-pos,walk->data,min(walk->size,
-                 size+pos-walk->pos));
+               memcpy(data,(char *) walk->data+pos-walk->pos,min((size_t)size,
+                 (size_t)(walk->size-pos+walk->pos)));
+           else memcpy((char *) data+walk->pos-pos,walk->data,min((size_t)walk->size,
+                 (size_t)(size+pos-walk->pos)));
        }
     }
 }
@@ -136,10 +141,21 @@ int fs_test(loff_t pos,int size)
     void *scratch;
     int okay;
 
+#if 1 // TMN
+       const size_t readsize_aligned = (size % 512) ? (size + (512 - (size % 512))) : size;        // TMN:
+       const loff_t seekpos_aligned = pos - (pos % 512);                   // TMN:
+       const size_t seek_delta = (size_t)(pos - seekpos_aligned);          // TMN:
+       const size_t readsize = (size_t)(pos - seekpos_aligned) + readsize_aligned; // TMN: 
+    scratch = alloc(readsize_aligned);
+    if (llseek(fd,seekpos_aligned,0) != seekpos_aligned) pdie("Seek to %lld",pos);
+    okay = read(fd,scratch,readsize_aligned) == (int)readsize_aligned;
+    free(scratch);
+#else // TMN:
     if (llseek(fd,pos,0) != pos) pdie("Seek to %lld",pos);
     scratch = alloc(size);
     okay = read(fd,scratch,size) == size;
     free(scratch);
+#endif // TMN:
     return okay;
 }
 
@@ -218,7 +234,7 @@ int fs_changed(void)
 
 \r
 #define O_SHORT_LIVED   _O_SHORT_LIVED\r
-#define O_ACCMODE       3\r
+//#define O_ACCMODE       3\r
 #define O_NONE          3\r
 #define O_BACKUP        0x10000\r
 #define O_SHARED        0x20000\r
@@ -368,14 +384,14 @@ static loff_t WIN32llseek(int fd, loff_t offset, int whence)
        long lo, hi;\r
        DWORD err;\r
 \r
-       lo = offset & 0xffffffff;\r
-       hi = offset >> 32;\r
+       lo = (long)(offset & 0xffffffff);\r
+       hi = (long)(offset >> 32);\r
        lo = SetFilePointer((HANDLE)fd, lo, &hi, whence);\r
        if (lo == 0xFFFFFFFF && (err = GetLastError()) != NO_ERROR) {\r
                errno = err;\r
                return -1;\r
        }\r
-       return ((loff_t)hi << 32) | (off_t)lo;\r
+       return ((loff_t)hi << 32) | (__u32)lo;\r
 }\r
 \r
 int fsctl(int fd, int code)\r