lenochka/kernel/file.c
2019-03-29 00:27:42 +02:00

86 lines
1.6 KiB
C

#include "file.h"
#include "stdlib.h"
#include "string.h"
#include "defines.h"
#include "heap.h"
// /dir/file.txt
static int file_find(fat_t* fat,fat_dir_t* out,const char* filename)
{
char name[512];
const char* s = filename;
char* d = name;
fat_dir_t _parent;
fat_dir_t file;
fat_dir_t* parent;
parent = NULL;
kmemzero(&file,sizeof(file));
kmemzero(&_parent,sizeof(_parent));
kmemzero(name,sizeof(name));
do {
if(*s != '/')
*d++ = *s;
s++;
if(*s == '/')
{
//kprintf("name %s\n",name);
//Find directory
if(kstrchr(s+1,'/'))
{
fat_find_file(fat,parent,name,&_parent);
if(_parent.dir_fstcluslo == 0) return 0;
}
kmemzero(name,sizeof(name));
d = name;
}
if(!kstrchr(s+1,'/')) //Check if we hit file name
{
fat_find_file(fat,parent,name,&file);
if(file.dir_fstcluslo != 0)
{
//kprintf("file %s\n",name);
kmemcpy(out,&file,sizeof(file));
return 1;
}
}
} while(*s);
return 0;
}
void* file_load(fat_t* fat,u32* psize,const char* name)
{
fat_dir_t file;
u32 clus;
u32 size;
u8* buf,*ptr;
kmemzero(&file,sizeof(file));
if(!file_find(fat,&file,name))
{
kprintf("File \"%s\" not found!\n",name);
return NULL;
}
size = file.dir_filesize;
if(psize) *psize = size;
buf = (u8*)kmalloc(size);
if(!buf)
{
kprintf("Not enough memory for \"%s\"!\n",name);
return NULL;
}
ptr = buf;
clus = (file.dir_fstclushi<<16)|file.dir_fstcluslo;
do {
u32 csize = MIN(size,(fat->spc*fat->bps));
fat_read_cluster(fat,clus);
kmemcpy(ptr,fat->clusbuf,csize);
ptr += csize;
csize -= csize;
clus = fat_table_read_entry(fat,clus);
} while(!IS_FAT_CLUS_EOF(clus));
return buf;
}