mbadblocks.c

Go to the documentation of this file.
00001 /*
00002  * mbadblocks.c
00003  * Mark bad blocks on disk
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 }

Generated on Fri Apr 14 22:56:55 2006 for minix by  doxygen 1.4.6