56 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			56 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
#include "sysincludes.h"
 | 
						|
#include "msdos.h"
 | 
						|
#include "fsP.h"
 | 
						|
#include "mtoolsDirent.h"
 | 
						|
 | 
						|
/*
 | 
						|
 * Remove a string of FAT entries (delete the file).  The argument is
 | 
						|
 * the beginning of the string.  Does not consider the file length, so
 | 
						|
 * if FAT is corrupted, watch out!
 | 
						|
 */
 | 
						|
 | 
						|
int fat_free(Stream_t *Dir, unsigned int fat)
 | 
						|
{
 | 
						|
	Stream_t *Stream = GetFs(Dir);
 | 
						|
	DeclareThis(Fs_t);
 | 
						|
	unsigned int next_no_step;
 | 
						|
					/* a zero length file? */
 | 
						|
	if (fat == 0)
 | 
						|
		return(0);
 | 
						|
 | 
						|
	/* CONSTCOND */
 | 
						|
	while (!This->fat_error) {
 | 
						|
		/* get next cluster number */
 | 
						|
		next_no_step = fatDecode(This,fat);
 | 
						|
		/* mark current cluster as empty */
 | 
						|
		fatDeallocate(This,fat);
 | 
						|
		if (next_no_step >= This->last_fat)
 | 
						|
			break;
 | 
						|
		fat = next_no_step;
 | 
						|
	}
 | 
						|
	return(0);
 | 
						|
}
 | 
						|
 | 
						|
int fatFreeWithDir(Stream_t *Dir, struct directory *dir)
 | 
						|
{
 | 
						|
	unsigned int first;
 | 
						|
 | 
						|
	if((!strncmp(dir->name,".      ",8) ||
 | 
						|
	    !strncmp(dir->name,"..     ",8)) &&
 | 
						|
	   !strncmp(dir->ext,"   ",3)) {
 | 
						|
		fprintf(stderr,"Trying to remove . or .. entry\n");
 | 
						|
		return -1;
 | 
						|
	}
 | 
						|
 | 
						|
	first = START(dir);
 | 
						|
  	if(fat32RootCluster(Dir))
 | 
						|
		first |= STARTHI(dir) << 16;
 | 
						|
	return fat_free(Dir, first);
 | 
						|
}
 | 
						|
 | 
						|
int fatFreeWithDirentry(direntry_t *entry)
 | 
						|
{
 | 
						|
	return fatFreeWithDir(entry->Dir, &entry->dir);
 | 
						|
}
 | 
						|
    
 |