Fixes by tamlin. It really works now. Modified: trunk/rosapps/sysutils/dosfsck/boot.c Modified: trunk/rosapps/sysutils/dosfsck/check.c Modified: trunk/rosapps/sysutils/dosfsck/common.c Modified: trunk/rosapps/sysutils/dosfsck/common.h Modified: trunk/rosapps/sysutils/dosfsck/compiler.h Modified: trunk/rosapps/sysutils/dosfsck/dosfsck.c Modified: trunk/rosapps/sysutils/dosfsck/dosfsck.h Modified: trunk/rosapps/sysutils/dosfsck/fat.c Modified: trunk/rosapps/sysutils/dosfsck/file.c Modified: trunk/rosapps/sysutils/dosfsck/io.c Modified: trunk/rosapps/sysutils/dosfsck/lfn.c Modified: trunk/rosapps/sysutils/dosfsck/mkdosfs.c _____
Modified: trunk/rosapps/sysutils/dosfsck/boot.c --- trunk/rosapps/sysutils/dosfsck/boot.c 2005-07-29 16:06:13 UTC (rev 16872) +++ trunk/rosapps/sysutils/dosfsck/boot.c 2005-07-29 16:48:09 UTC (rev 16873) @@ -81,15 +81,15 @@
printf("%10d reserved sector%s\n",CF_LE_W(b->reserved), CF_LE_W(b->reserved) == 1 ? "" : "s"); printf("First FAT starts at byte %llu (sector %llu)\n", - (unsigned long long)fs->fat_start, - (unsigned long long)fs->fat_start/lss); + (__u64)fs->fat_start, + (__u64)fs->fat_start/lss); printf("%10d FATs, %d bit entries\n",b->fats,fs->fat_bits); printf("%10d bytes per FAT (= %u sectors)\n",fs->fat_size, fs->fat_size/lss); if (!fs->root_cluster) { printf("Root directory starts at byte %llu (sector %llu)\n", - (unsigned long long)fs->root_start, - (unsigned long long)fs->root_start/lss); + (__u64)fs->root_start, + (__u64)fs->root_start/lss); printf("%10d root directory entries\n",fs->root_entries); } else { @@ -97,10 +97,10 @@ fs->root_cluster); } printf("Data area starts at byte %llu (sector %llu)\n", - (unsigned long long)fs->data_start, - (unsigned long long)fs->data_start/lss); + (__u64)fs->data_start, + (__u64)fs->data_start/lss); printf("%10lu data clusters (%llu bytes)\n",fs->clusters, - (unsigned long long)fs->clusters*fs->cluster_size); + (__u64)fs->clusters*fs->cluster_size); printf("%u sectors/track, %u heads\n",CF_LE_W(b->secs_track), CF_LE_W(b->heads)); printf("%10u hidden sectors\n", @@ -242,15 +242,15 @@ printf( "FSINFO sector has bad magic number(s):\n" ); if (i.magic != CT_LE_L(0x41615252)) printf( " Offset %llu: 0x%08x != expected 0x%08x\n", - (unsigned long long)offsetof(struct info_sector,magic), + (__u64)offsetof(struct info_sector,magic), CF_LE_L(i.magic),0x41615252); if (i.signature != CT_LE_L(0x61417272)) printf( " Offset %llu: 0x%08x != expected 0x%08x\n", - (unsigned long long)offsetof(struct info_sector,signature), + (__u64)offsetof(struct info_sector,signature), CF_LE_L(i.signature),0x61417272); if (i.boot_sign != CT_LE_W(0xaa55)) printf( " Offset %llu: 0x%04x != expected 0x%04x\n", - (unsigned long long)offsetof(struct info_sector,boot_sign), + (__u64)offsetof(struct info_sector,boot_sign), CF_LE_W(i.boot_sign),0xaa55); if (interactive) printf( "1) Correct\n2) Don't correct (FSINFO invalid then)\n" ); @@ -348,9 +348,9 @@ /* On FAT32, the high 4 bits of a FAT entry are reserved */ fs->eff_fat_bits = (fs->fat_bits == 32) ? 28 : fs->fat_bits; fs->fat_size = fat_length*logical_sector_size; - if (fs->clusters > ((unsigned long long)fs->fat_size*8/fs->fat_bits)-2) + if (fs->clusters > ((__u64)fs->fat_size*8/fs->fat_bits)-2) die("File system has %d clusters but only space for %d FAT entries.", - fs->clusters,((unsigned long long)fs->fat_size*8/fs->fat_bits)-2); + fs->clusters,((__u64)fs->fat_size*8/fs->fat_bits)-2); if (!fs->root_entries && !fs->root_cluster) die("Root directory has zero size."); if (fs->root_entries & (MSDOS_DPS-1)) _____
Modified: trunk/rosapps/sysutils/dosfsck/check.c --- trunk/rosapps/sysutils/dosfsck/check.c 2005-07-29 16:06:13 UTC (rev 16872) +++ trunk/rosapps/sysutils/dosfsck/check.c 2005-07-29 16:48:09 UTC (rev 16873) @@ -10,7 +10,8 @@
#include <stdlib.h> #include <string.h> #include <limits.h> -#include <time.h> +#include <time.h> +#include <windows.h>
#include "common.h" #include "dosfsck.h" @@ -105,7 +106,7 @@ /* clear new cluster */ memset( &d2, 0, sizeof(d2) ); offset = cluster_start(fs,clu_num); - for( i = 0; i < fs->cluster_size; i += sizeof(DIR_ENT) ) + for( i = 0; i < (int)fs->cluster_size; i += sizeof(DIR_ENT) ) fs_write( offset+i, sizeof(d2), &d2 ); } memset(de,0,sizeof(DIR_ENT)); @@ -140,22 +141,22 @@ root = alloc(fs->root_entries*sizeof(DIR_ENT)); fs_read(fs->root_start,fs->root_entries*sizeof(DIR_ENT),root);
- while (next_free < fs->root_entries) + while (next_free < (int)fs->root_entries) if (IS_FREE(root[next_free].name) && root[next_free].attr != VFAT_LN_ATTR) break; else next_free++; - if (next_free == fs->root_entries) + if (next_free == (int)fs->root_entries) die("Root directory is full."); offset = fs->root_start+next_free*sizeof(DIR_ENT); memset(de,0,sizeof(DIR_ENT)); while (1) { sprintf(de->name,pattern,curr_num); - for (scan = 0; scan < fs->root_entries; scan++) + for (scan = 0; scan < (int)fs->root_entries; scan++) if (scan != next_free && !strncmp(root[scan].name,de->name,MSDOS_NAME)) break; - if (scan == fs->root_entries) break; + if (scan == (int)fs->root_entries) break; if (++curr_num >= 10000) die("Unable to create unique name"); } free(root); @@ -167,11 +168,12 @@
static char *path_name(DOS_FILE *file) { - static char path[PATH_MAX*2]; +// static char path[PATH_MAX*2]; + static char path[MAX_PATH*2];
if (!file) *path = 0; else { - if (strlen(path_name(file->parent)) > PATH_MAX) + if (strlen(path_name(file->parent)) > MAX_PATH) die("Path name too long."); if (strcmp(path,"/") != 0) strcat(path,"/");
strcpy(strrchr(path,0),file->lfn?file->lfn:file_name(file->dir_ent.name) ); @@ -747,10 +749,14 @@ DOS_FILE *new; DIR_ENT de; FD_TYPE type; + + char tmpBuffer[512]; // TMN:
- if (offset) - fs_read(offset,sizeof(DIR_ENT),&de); - else { + if (offset) { +// fs_read(offset,sizeof(DIR_ENT),&de); + fs_read(offset,sizeof(tmpBuffer),&tmpBuffer); // TMN: + memcpy(&de, tmpBuffer, sizeof(DIR_ENT)); // TMN: + } else { memcpy(de.name," ",MSDOS_NAME); de.attr = ATTR_DIR; de.size = de.time = de.date = 0; _____
Modified: trunk/rosapps/sysutils/dosfsck/common.c --- trunk/rosapps/sysutils/dosfsck/common.c 2005-07-29 16:06:13 UTC (rev 16872) +++ trunk/rosapps/sysutils/dosfsck/common.c 2005-07-29 16:48:09 UTC (rev 16873) @@ -78,7 +78,10 @@
} }
- + +#ifdef min +#undef min +#endif int min(int a,int b) { return a < b ? a : b; _____
Modified: trunk/rosapps/sysutils/dosfsck/common.h --- trunk/rosapps/sysutils/dosfsck/common.h 2005-07-29 16:06:13 UTC (rev 16872) +++ trunk/rosapps/sysutils/dosfsck/common.h 2005-07-29 16:48:09 UTC (rev 16873) @@ -6,12 +6,14 @@
#ifndef _COMMON_H #define _COMMON_H + +//void die(char *msg,...) __attribute((noreturn)); +__declspec(noreturn) void die(char *msg,...);
-void die(char *msg,...) __attribute((noreturn)); - /* Displays a prinf-style message and terminates the program. */
-void pdie(char *msg,...) __attribute((noreturn)); +//void pdie(char *msg,...) __attribute((noreturn)); +__declspec(noreturn) void pdie(char *msg,...);
/* Like die, but appends an error message according to the state of errno. */
_____
Modified: trunk/rosapps/sysutils/dosfsck/compiler.h --- trunk/rosapps/sysutils/dosfsck/compiler.h 2005-07-29 16:06:13 UTC (rev 16872) +++ trunk/rosapps/sysutils/dosfsck/compiler.h 2005-07-29 16:48:09 UTC (rev 16873) @@ -26,7 +26,7 @@
# define __iomem # define __chk_user_ptr(x) (void)0 # define __chk_io_ptr(x) (void)0 -# define __builtin_warning(x, y...) (1) +//# define __builtin_warning(x, y...) (1) # define __acquires(x) # define __releases(x) # define __acquire(x) (void)0 _____
Modified: trunk/rosapps/sysutils/dosfsck/dosfsck.c --- trunk/rosapps/sysutils/dosfsck/dosfsck.c 2005-07-29 16:06:13 UTC (rev 16872) +++ trunk/rosapps/sysutils/dosfsck/dosfsck.c 2005-07-29 16:48:09 UTC (rev 16873) @@ -12,8 +12,8 @@
#include <stdlib.h> #include <string.h> #include <stdlib.h> -#include <unistd.h> -#include <getopt.h> +//#include <unistd.h> +//#include <getopt.h>
#include "common.h" #include "dosfsck.h" @@ -81,7 +81,8 @@
int main(int argc,char **argv) -{ +{ + int optind; DOS_FS fs; int rw,salvage_files,verify,c; unsigned long free_clusters; @@ -89,7 +90,12 @@ rw = salvage_files = verify = 0; interactive = 1; check_atari(); - + +#if 1 + optind = 1; + verbose = 1; + list = 1; +#else while ((c = getopt(argc,argv,"Aad:flnrtu:vVwy")) != EOF) switch (c) { case 'A': /* toggle Atari format */ @@ -136,12 +142,14 @@ break; default: usage(argv[0]); - } + } + if ((test || write_immed) && !rw) { fprintf(stderr,"-t and -w require -a or -r\n"); exit(2); } if (optind != argc-1) usage(argv[0]); +#endif
printf( "dosfsck " VERSION ", " VERSION_DATE ", FAT32, LFN\n" ); fs_open(argv[optind],rw); _____
Modified: trunk/rosapps/sysutils/dosfsck/dosfsck.h --- trunk/rosapps/sysutils/dosfsck/dosfsck.h 2005-07-29 16:06:13 UTC (rev 16872) +++ trunk/rosapps/sysutils/dosfsck/dosfsck.h 2005-07-29 16:48:09 UTC (rev 16873) @@ -63,6 +63,8 @@
#define VFAT_LN_ATTR (ATTR_RO | ATTR_HIDDEN | ATTR_SYS | ATTR_VOLUME)
+#include <pshpack1.h> + /* ++roman: Use own definition of boot sector structure -- the kernel headers' * name for it is msdos_boot_sector in 2.0 and fat_boot_sector in 2.1 ... */ struct boot_sector { @@ -93,7 +95,9 @@
/* fill up to 512 bytes */ __u8 junk[448]; -} __attribute__ ((packed)); +}; + +#include <poppack.h>
struct info_sector { __u32 magic; /* Magic for info sector ('RRaA') */ _____
Modified: trunk/rosapps/sysutils/dosfsck/fat.c --- trunk/rosapps/sysutils/dosfsck/fat.c 2005-07-29 16:06:13 UTC (rev 16872) +++ trunk/rosapps/sysutils/dosfsck/fat.c 2005-07-29 16:48:09 UTC (rev 16873) @@ -9,15 +9,16 @@
#include <stdio.h> #include <stdlib.h> #include <string.h> -#include <unistd.h> +//#include <unistd.h>
#include "common.h" #include "dosfsck.h" #include "io.h" #include "check.h" #include "fat.h" + +#pragma warning(disable: 4018)
- static void get_fat(FAT_ENTRY *entry,void *fat,unsigned long cluster,DOS_FS *fs) { unsigned char *ptr; @@ -54,7 +55,11 @@ void *first,*second,*use; int first_ok,second_ok;
- eff_size = ((fs->clusters+2)*fs->fat_bits+7)/8; + eff_size = ((fs->clusters+2)*fs->fat_bits+7)/8; + // TMN: Must round up to disk-sector boundary. For now, assume 512-byte disk. + if (eff_size % 512) { + eff_size += 512 - (eff_size % 512); + } first = alloc(eff_size); fs_read(fs->fat_start,eff_size,first); use = first; _____
Modified: trunk/rosapps/sysutils/dosfsck/file.c --- trunk/rosapps/sysutils/dosfsck/file.c 2005-07-29 16:06:13 UTC (rev 16872) +++ trunk/rosapps/sysutils/dosfsck/file.c 2005-07-29 16:48:09 UTC (rev 16873) @@ -10,7 +10,7 @@
#include <stdio.h> #include <string.h> #include <ctype.h> -#include <unistd.h> +//#include <unistd.h>
#define _LINUX_STAT_H /* hack to avoid inclusion of <linux/stat.h> */ #define _LINUX_STRING_H_ /* hack to avoid inclusion of <linux/string.h>*/ _____
Modified: trunk/rosapps/sysutils/dosfsck/io.c --- trunk/rosapps/sysutils/dosfsck/io.c 2005-07-29 16:06:13 UTC (rev 16872) +++ trunk/rosapps/sysutils/dosfsck/io.c 2005-07-29 16:48:09 UTC (rev 16873) @@ -14,11 +14,12 @@
#include <stdlib.h> #include <stdio.h> #include <string.h> -#include <unistd.h> +//#include <unistd.h> #include <sys/stat.h> //#include <sys/ioctl.h> #include <errno.h> -#include <fcntl.h> +#include <fcntl.h> +#include <assert.h> //#include <linux/fd.h>
@@ -62,6 +63,9 @@ static int WIN32write(int fd, void *buf, unsigned int len); #define write WIN32write static loff_t WIN32llseek(int fd, loff_t offset, int whence); +#ifdef llseek +#undef llseek +#endif #define llseek WIN32llseek
static int is_device = 0; @@ -96,10 +100,24 @@ void fs_read(loff_t pos,int size,void *data) { CHANGE *walk; - int got; - + int got; +#if 1 // TMN: + const size_t readsize_aligned = size + (512 - (size % 512)); // 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 = (pos - seekpos_aligned) + readsize_aligned; // TMN: + char* tmpBuf = malloc(readsize); // TMN: + if (llseek(fd,seekpos_aligned,0) != seekpos_aligned) pdie("Seek to %lld",pos); + if ((got = read(fd,tmpBuf,readsize_aligned)) < 0) pdie("Read %d bytes at %lld",size,pos); + assert(got >= size); + got = size; + assert(seek_delta + size < readsize); + memcpy(data, tmpBuf+seek_delta, size); + free(tmpBuf); +#else // TMN: if (llseek(fd,pos,0) != pos) pdie("Seek to %lld",pos); - if ((got = read(fd,data,size)) < 0) pdie("Read %d bytes at %lld",size,pos); + if ((got = read(fd,data,size)) < 0) pdie("Read %d bytes at %lld",size,pos); +#endif // TMN: if (got != size) die("Got %d bytes instead of %d at %lld",got,size,pos); for (walk = changes; walk; walk = walk->next) { if (walk->pos < pos+size && walk->pos+walk->size > pos) { @@ -158,13 +176,13 @@ changes = changes->next; if (llseek(fd,this->pos,0) != this->pos) fprintf(stderr,"Seek to %lld failed: %s\n Did not write %d bytes.\n", - (long long)this->pos,strerror(errno),this->size); + (__int64)this->pos,strerror(errno),this->size); else if ((size = write(fd,this->data,this->size)) < 0) fprintf(stderr,"Writing %d bytes at %lld failed: %s\n",this->size, - (long long)this->pos,strerror(errno)); + (__int64)this->pos,strerror(errno)); else if (size != this->size) fprintf(stderr,"Wrote %d bytes instead of %d bytes at %lld." - "\n",size,this->size,(long long)this->pos); + "\n",size,this->size,(__int64)this->pos); free(this->data); free(this); } @@ -223,21 +241,26 @@ switch (oflag & O_ACCMODE) { case O_RDONLY: desiredAccess = GENERIC_READ; - shareMode = FILE_SHARE_READ; +// shareMode = FILE_SHARE_READ; + shareMode = FILE_SHARE_READ|FILE_SHARE_WRITE; // TMN: break; case O_WRONLY: + exit(42); desiredAccess = GENERIC_WRITE; shareMode = 0; break; case O_RDWR: + exit(43); desiredAccess = GENERIC_READ|GENERIC_WRITE; shareMode = 0; break; case O_NONE: + exit(44); desiredAccess = 0; shareMode = FILE_SHARE_READ|FILE_SHARE_WRITE; } if (oflag & O_APPEND) { + exit(45); desiredAccess |= FILE_APPEND_DATA|SYNCHRONIZE; shareMode = FILE_SHARE_READ|FILE_SHARE_WRITE; } @@ -249,22 +272,27 @@ creationDisposition = OPEN_EXISTING; break; case O_CREAT: + exit(46); creationDisposition = OPEN_ALWAYS; break; case O_CREAT|O_EXCL: case O_CREAT|O_TRUNC|O_EXCL: + exit(47); creationDisposition = CREATE_NEW; break; case O_TRUNC: case O_TRUNC|O_EXCL: + exit(48); creationDisposition = TRUNCATE_EXISTING; break; case O_CREAT|O_TRUNC: + exit(49); creationDisposition = OPEN_ALWAYS; trunc = TRUE; break; } if (oflag & O_CREAT) { + exit(50); va_start(ap, oflag); pmode = va_arg(ap, int); va_end(ap); @@ -272,6 +300,7 @@ flagsAttributes |= FILE_ATTRIBUTE_READONLY; } if (oflag & O_TEMPORARY) { + exit(51); flagsAttributes |= FILE_FLAG_DELETE_ON_CLOSE; desiredAccess |= DELETE; } @@ -289,6 +318,7 @@ return -1; } if (trunc) { + exit(52); if (!SetEndOfFile(fh)) { errno = GetLastError(); CloseHandle(fh); _____
Modified: trunk/rosapps/sysutils/dosfsck/lfn.c --- trunk/rosapps/sysutils/dosfsck/lfn.c 2005-07-29 16:06:13 UTC (rev 16872) +++ trunk/rosapps/sysutils/dosfsck/lfn.c 2005-07-29 16:48:09 UTC (rev 16873) @@ -54,13 +54,16 @@
/* for maxlen param */ #define UNTIL_0 INT_MAX
-/* Convert name part in 'lfn' from unicode to ASCII */ -#define CNV_THIS_PART(lfn) \ - ({ \ - char __part_uni[CHARS_PER_LFN*2]; \ - copy_lfn_part( __part_uni, lfn ); \ - cnv_unicode( __part_uni, CHARS_PER_LFN, 0 ); \ - }) +static void copy_lfn_part( char *dst, LFN_ENT *lfn ); +static char *cnv_unicode( const unsigned char *uni, int maxlen, int use_q ); + +/* Convert name part in 'lfn' from unicode to ASCII */ +static __inline char* CNV_THIS_PART(LFN_ENT *lfn) +{ \ + char __part_uni[CHARS_PER_LFN*2]; + copy_lfn_part( __part_uni, lfn ); + cnv_unicode( __part_uni, CHARS_PER_LFN, 0 ); +}
/* Convert name parts collected so far (from previous slots) from unicode to * ASCII */ _____
Modified: trunk/rosapps/sysutils/dosfsck/mkdosfs.c --- trunk/rosapps/sysutils/dosfsck/mkdosfs.c 2005-07-29 16:06:13 UTC (rev 16872) +++ trunk/rosapps/sysutils/dosfsck/mkdosfs.c 2005-07-29 16:48:09 UTC (rev 16873) @@ -50,7 +50,9 @@
/* Include the header files */
-#include "../version.h" +//#include "../version.h" +#define VERSION "test" +#define VERSION_DATE __DATE__
#ifdef _WIN32 #define _WIN32_WINNT 0x0400