00001
00002
00003
00004
00005
00006
00007 #include "sysincludes.h"
00008 #include "msdos.h"
00009 #include "mtools.h"
00010 #include "mainloop.h"
00011 #include "fsP.h"
00012
00013 void mbadblocks(int argc, char **argv, int type)
00014 {
00015 int i;
00016 char *in_buf;
00017 int in_len;
00018 off_t start;
00019 struct MainParam_t mp;
00020 Fs_t *Fs;
00021 Stream_t *Dir;
00022 int ret;
00023
00024 if (argc != 2 || skip_drive(argv[1]) == argv[1]) {
00025 fprintf(stderr, "Mtools version %s, dated %s\n",
00026 mversion, mdate);
00027 fprintf(stderr, "Usage: %s drive:\n", argv[0]);
00028 exit(1);
00029 }
00030
00031 init_mp(&mp);
00032
00033 Dir = open_root_dir(get_drive(argv[1], NULL), O_RDWR);
00034 if (!Dir) {
00035 fprintf(stderr,"%s: Cannot initialize drive\n", argv[0]);
00036 exit(1);
00037 }
00038
00039 Fs = (Fs_t *)GetFs(Dir);
00040 in_len = Fs->cluster_size * Fs->sector_size;
00041 in_buf = malloc(in_len);
00042 if(!in_buf) {
00043 FREE(&Dir);
00044 printOom();
00045 exit(1);
00046 }
00047 for(i=0; i < Fs->clus_start; i++ ){
00048 ret = READS(Fs->Next,
00049 in_buf, sectorsToBytes((Stream_t*)Fs, i), Fs->sector_size);
00050 if( ret < 0 ){
00051 perror("early error");
00052 exit(1);
00053 }
00054 if(ret < Fs->sector_size){
00055 fprintf(stderr,"end of file in file_read\n");
00056 exit(1);
00057 }
00058 }
00059
00060 in_len = Fs->cluster_size * Fs->sector_size;
00061 for(i=2; i< Fs->num_clus + 2; i++){
00062 if(got_signal)
00063 break;
00064 if(Fs->fat_decode((Fs_t*)Fs,i))
00065 continue;
00066 start = (i - 2) * Fs->cluster_size + Fs->clus_start;
00067 ret = force_read(Fs->Next, in_buf,
00068 sectorsToBytes((Stream_t*)Fs, start), in_len);
00069 if(ret < in_len ){
00070 printf("Bad cluster %d found\n", i);
00071 fatEncode((Fs_t*)Fs, i, 0xfff7);
00072 continue;
00073 }
00074 }
00075 FREE(&Dir);
00076 exit(0);
00077 }