pang-o-lin/src/defrag.c

49 lines
1.1 KiB
C

#include <stdint.h>
#include <sys/types.h>
#include <unistd.h>
#include "io.h"
#define try(x) do { int i = (x); if (i == -1) { return -1 } } while (0)
int fat12_defrag(int fd) {
uint8_t buf[512];
// Read in MBR and figure out where the FAT begins and ends
try(pang_seek(fd, 0, SEEK_SET));
// Actually read in the MBR
try(pang_read(fd, buf, sizeof(buf)));
// We only operate on 512-byte sector sizes
if (fat12_read_u16(buf + 0x0b) != 512) {
return -2;
}
// We require the cluster size to be 4096 (8 * 512)
if (buf[0x0d] != 8) {
return -2;
}
// To ensure the erase block is correct, require 4096-bytes
// of reserved data
if (fat12_read_u16(buf + 0x0e) != 4096) {
return -2;
}
// Also, we only support 1 FAT
if (buf[0x10] != 1) {
return -2;
}
// 32 root entries keeps it padded correctly.
if (fat12_read_u16(buf + 0x11, 32) != 32) {
return -2;
}
// Total number of 512-byte sectors
uint32_t clufat12_read_u16(buf + 0x13, bytes / sector_size);
return 0;
}