#include #include #include #include #include #include #define SSFS_START_LBA 16 #define SSFS_FILE_HEADER_SIZE_BYTES 32 int ssfs_read_file(const char* name, void* buffer, int size) { if (strlen(name) > 15) { return -1; } uint8_t header_buf[512]; int r = read_sector(16, header_buf); if (r != 0) { return -2; } ssfs_file_header_t f; memcpy(&f, header_buf, sizeof(f)); if (strncmp(f.filename, name, 15) != 0) { return -3; } /* Clamp read size to actual file size */ if (size > (int)f.num_bytes) size = (int)f.num_bytes; int total_read = 0; int sector_count = div_round_up(size, 512); uint8_t sector_data[512]; for (int k = 0; k < sector_count; k++) { r = read_sector(f.start_sector + k, sector_data); if (r != 0) { return -4; /* I/O error */ } int to_copy = size - total_read; if (to_copy > 512) { to_copy = 512; } memcpy((uint8_t*)buffer + total_read, sector_data, to_copy); total_read += to_copy; } return 0; } /* size is number of bytes */ int ssfs_write_file(const char* name, void* data, int size) { ssfs_file_header_t* f = (ssfs_file_header_t*) malloc(sizeof(ssfs_file_header_t)); memset(f, 0, sizeof(ssfs_file_header_t)); if (strlen(name) > 15) { return -1; } strcpy(f->filename, name); f->num_sectors = 0; int sector_count = div_round_up(size, 512); uint8_t* buffer = (uint8_t*) malloc(sector_count * 512); memset(buffer, 0, sector_count * 512); memcpy(buffer, data, (size_t) size); int r = 0; f->start_sector = 32; for (int k = 0; k < sector_count; k++) { r = write_sector(f->start_sector + k, buffer + (k * 512)); if (r != 0) { break; } } f->num_sectors = sector_count; f->num_bytes = (uint32_t) size; uint8_t header_buf[512]; memset(header_buf, 0, 512); memcpy(header_buf, f, sizeof(*f)); write_sector(16, header_buf); free(buffer); free(f); return 0; }