78 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/*
 | 
						|
 * mbadblocks.c
 | 
						|
 * Mark bad blocks on disk
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
#include "sysincludes.h"
 | 
						|
#include "msdos.h"
 | 
						|
#include "mtools.h"
 | 
						|
#include "mainloop.h"
 | 
						|
#include "fsP.h"
 | 
						|
 | 
						|
void mbadblocks(int argc, char **argv, int type)
 | 
						|
{
 | 
						|
	int i;
 | 
						|
	char *in_buf;
 | 
						|
	int in_len;
 | 
						|
	off_t start;
 | 
						|
	struct MainParam_t mp;
 | 
						|
	Fs_t *Fs;
 | 
						|
	Stream_t *Dir;
 | 
						|
	int ret;
 | 
						|
 | 
						|
	if (argc != 2 || skip_drive(argv[1]) == argv[1]) {
 | 
						|
		fprintf(stderr, "Mtools version %s, dated %s\n", 
 | 
						|
			mversion, mdate);
 | 
						|
		fprintf(stderr, "Usage: %s drive:\n", argv[0]);
 | 
						|
		exit(1);
 | 
						|
	}
 | 
						|
 | 
						|
	init_mp(&mp);
 | 
						|
 | 
						|
	Dir = open_root_dir(get_drive(argv[1], NULL), O_RDWR);
 | 
						|
	if (!Dir) {
 | 
						|
		fprintf(stderr,"%s: Cannot initialize drive\n", argv[0]);
 | 
						|
		exit(1);
 | 
						|
	}
 | 
						|
 | 
						|
	Fs = (Fs_t *)GetFs(Dir);
 | 
						|
	in_len = Fs->cluster_size * Fs->sector_size;
 | 
						|
	in_buf = malloc(in_len);
 | 
						|
	if(!in_buf) {
 | 
						|
		FREE(&Dir);
 | 
						|
		printOom();
 | 
						|
		exit(1);
 | 
						|
	}
 | 
						|
	for(i=0; i < Fs->clus_start; i++ ){
 | 
						|
		ret = READS(Fs->Next, 
 | 
						|
					in_buf, sectorsToBytes((Stream_t*)Fs, i), Fs->sector_size);
 | 
						|
		if( ret < 0 ){
 | 
						|
			perror("early error");
 | 
						|
			exit(1);
 | 
						|
		}
 | 
						|
		if(ret < Fs->sector_size){
 | 
						|
			fprintf(stderr,"end of file in file_read\n");
 | 
						|
			exit(1);
 | 
						|
		}
 | 
						|
	}
 | 
						|
		
 | 
						|
	in_len = Fs->cluster_size * Fs->sector_size;
 | 
						|
	for(i=2; i< Fs->num_clus + 2; i++){
 | 
						|
		if(got_signal)
 | 
						|
			break;
 | 
						|
		if(Fs->fat_decode((Fs_t*)Fs,i))
 | 
						|
			continue;
 | 
						|
		start = (i - 2) * Fs->cluster_size + Fs->clus_start;
 | 
						|
		ret = force_read(Fs->Next, in_buf, 
 | 
						|
						 sectorsToBytes((Stream_t*)Fs, start), in_len);
 | 
						|
		if(ret < in_len ){
 | 
						|
			printf("Bad cluster %d found\n", i);
 | 
						|
			fatEncode((Fs_t*)Fs, i, 0xfff7);
 | 
						|
			continue;
 | 
						|
		}
 | 
						|
	}
 | 
						|
	FREE(&Dir);
 | 
						|
	exit(0);
 | 
						|
}
 |