Writing file data

This commit is contained in:
notsomeidiot123 2024-09-20 11:01:57 -04:00
parent f2e22211b9
commit fb86a312bd
2 changed files with 58 additions and 12 deletions

4
.gitignore vendored
View File

@ -2,4 +2,6 @@ bin
mount
image.bin
dump.img
diskwrite
diskwrite
*.bin
*.elf

View File

@ -6,6 +6,14 @@
#define FILE_END 0xFFFFFFFF
#define FILE_FREE 0x00000000
#define FAT_ATTR_READONLY 0x01
#define FAT_ATTR_HIDDEN 0x02
#define FAT_ATTR_SYSTEM 0x04
#define FAT_ATTR_VOLID 0x08
#define FAT_ATTR_DIR 0x10
#define FAT_ATTR_ARCHIVE 0x20
#define FAT_LFN FAT_ATTR_READONLY | FAT_ATTR_HIDDEN | FAT_ATTR_SYSTEM | FAT_ATTR_VOLID
typedef uint8_t *buffer_t;
typedef struct{
@ -95,6 +103,23 @@ int write_sector(FILE *file, uint32_t sector_start, uint32_t count, buffer_t buf
return result;
}
uint32_t find_free_cluster(fat_info *info){
uint32_t start = info->fsinfo.cluster_search_start;
if(start < 2){
start = 2;
}
for(int i = start; i < (info->bpb.bytes_per_sector/4) * info->bpb.sectors_per_fat; i++){
if(info->file_table[i]) continue;
return i;
}
}
void write_cluster_value(fat_info *info, uint32_t value, uint32_t cluster){
for(int i = 0; i < info->bpb.fat_count; i++){
info->file_table[cluster + i * info->bpb.sectors_per_fat * (info->bpb.bytes_per_sector/4)] = value;
}
}
int write_file(char *path, fat_info *info, FILE *file){
FILE *ifile = fopen(path, "r");
if(!ifile){
@ -107,29 +132,48 @@ int write_file(char *path, fat_info *info, FILE *file){
verbose && printf("File has length of 0, skipping %s\n", path);
return 0;
}
buffer_t ifile_data = malloc(ifsize);
buffer_t ifile_data = malloc((ifsize/(info->bpb.bytes_per_sector * info->bpb.sectors_per_cluster) + 1) * info->bpb.bytes_per_sector * info->bpb.sectors_per_cluster);
rewind(ifile);
if(!fread(ifile_data, 1, ifsize, ifile)){
verbose && printf("Failed to read from file %s, skippping\n", path);
return 0;
}
//create file in root dir
file_t dirent = {0};
memcpy(dirent.filename, path, 8);
int extoffset = 0;
while(*(path + extoffset) != '.' && *(path + extoffset)){
extoffset++;
}
verbose && printf("File extension at %d\n", extoffset);
memcpy(dirent.ext, path + extoffset, 3);
dirent.size_bytes = ifsize;
verbose && printf("Writing %u sectors\n", ifsize/(info->bpb.bytes_per_sector * info->bpb.sectors_per_cluster) + 1);
uint32_t last_cluster = 0;
for(int i = 0; i < ifsize/(info->bpb.bytes_per_sector * info->bpb.sectors_per_cluster) + 1; i++){
uint32_t cluster = find_free_cluster(info);
if(i == 0){
dirent.start_cluster_high = cluster >> 16;
dirent.start_cluster_low = cluster & 0xFFFF;
}
write_sector(file, (info->bpb.reserved_sectors + info->bpb.fat_count * info->bpb.sectors_per_fat) + cluster * info->bpb.sectors_per_cluster, info->bpb.sectors_per_cluster, ifile_data);
verbose && printf("wrote to sector %x %x sectors of data from buffer\n", (info->bpb.reserved_sectors + info->bpb.fat_count * info->bpb.sectors_per_fat) + cluster * info->bpb.sectors_per_cluster, info->bpb.sectors_per_cluster);
if(last_cluster != 0) write_cluster_value(info, cluster, last_cluster);
last_cluster = cluster;
}
verbose && printf("last cluster: %d\n", last_cluster);
write_cluster_value(info, FILE_END, last_cluster);
}
int read_file(){
}
void write_cluster_value(fat_info *info, uint32_t value, uint32_t cluster){
for(int i = 0; i < info->bpb.fat_count; i++){
info->file_table[cluster + i * info->bpb.sectors_per_fat * (info->bpb.bytes_per_sector/4)] = value;
int read_file(fat_info *info, uint32_t first_cluster, file_t *file, buffer_t buffer){
if(file == 0){
buffer_t buf;
}
}
int fat_write_back(FILE *file, fat_info *info){
int res = 0;
if(res = write_sector(file, info->bpb.reserved_sectors, info->bpb.sectors_per_fat * info->bpb.fat_count, (buffer_t)info->file_table) == 0){