78 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/*
 | 
						|
 * streamcache.c
 | 
						|
 * Managing a cache of open disks
 | 
						|
 */
 | 
						|
 | 
						|
#include "sysincludes.h"
 | 
						|
#include "msdos.h"
 | 
						|
#include "mtools.h"
 | 
						|
#include "vfat.h"
 | 
						|
#include "fs.h"
 | 
						|
#include "mainloop.h"
 | 
						|
#include "plain_io.h"
 | 
						|
#include "file.h"
 | 
						|
 | 
						|
static int is_initialized = 0;
 | 
						|
static Stream_t *fss[256]; /* open drives */
 | 
						|
 | 
						|
static void finish_sc(void)
 | 
						|
{
 | 
						|
	int i;
 | 
						|
 | 
						|
	for(i=0; i<256; i++){
 | 
						|
		if(fss[i] && fss[i]->refs != 1 )
 | 
						|
			fprintf(stderr,"Streamcache allocation problem:%c %d\n",
 | 
						|
				i, fss[i]->refs);
 | 
						|
		FREE(&(fss[i]));
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
static void init_streamcache(void)
 | 
						|
{
 | 
						|
	int i;
 | 
						|
 | 
						|
	if(is_initialized)
 | 
						|
		return;
 | 
						|
	is_initialized = 1;
 | 
						|
	for(i=0; i<256; i++)
 | 
						|
		fss[i]=0;
 | 
						|
	atexit(finish_sc);
 | 
						|
}
 | 
						|
 | 
						|
Stream_t *open_root_dir(char *drive, int flags)
 | 
						|
{
 | 
						|
	Stream_t *Fs;
 | 
						|
	int i, k;
 | 
						|
 | 
						|
	init_streamcache();
 | 
						|
 | 
						|
	k = -1;
 | 
						|
	for(i=0; i<256; i++) {
 | 
						|
		if (fss[i] == NULL || strcmp(getDrive(fss[i]), drive) == 0) {
 | 
						|
			k = i;
 | 
						|
			break;
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	if(k == -1) {
 | 
						|
		fprintf(stderr, "Cannot initialize '%s:', out of table space\n",
 | 
						|
			drive);
 | 
						|
		return NULL;
 | 
						|
	}
 | 
						|
 | 
						|
	/* open the drive */
 | 
						|
	if(fss[k])
 | 
						|
		Fs = fss[k];
 | 
						|
	else {
 | 
						|
		Fs = fs_init(drive, flags);
 | 
						|
		if (!Fs){
 | 
						|
			fprintf(stderr, "Cannot initialize '%s:'\n", drive);
 | 
						|
			return NULL;
 | 
						|
		}
 | 
						|
 | 
						|
		fss[k] = Fs;
 | 
						|
	}
 | 
						|
 | 
						|
	return OpenRoot(Fs);
 | 
						|
}
 |