diff --git a/tpfs/vol.c b/tpfs/vol.c index 8f5f430bcf8531d4b69ad8765b33bc4474dfb5c7..4386aa2d08418196c0c95e3b58c9ee4d707bea4b 100644 --- a/tpfs/vol.c +++ b/tpfs/vol.c @@ -11,7 +11,9 @@ void load_mbr() int i; unsigned char buffer[sizeof(mbr_t)]; - read_sector(buffer, 0, 0); + /* read_sector(buffer, 0, 0); */ + read_sector_n(buffer, 0, 0, sizeof(mbr_t)); + mbr.magic = buffer[0] + (buffer[1] << 8); if (mbr.magic == MBR_MAGIC) @@ -21,7 +23,7 @@ void load_mbr() { mbr.vols[i].sector = buffer[3 + (i * 4)]; mbr.vols[i].cylinder = buffer[4 + (i * 4)]; - mbr.vols[i].nb_sectors = buffer[5 + (i * 4)]; + mbr.vols[i].nb_blocs = buffer[5 + (i * 4)]; mbr.vols[i].type = buffer[6 + (i * 4)]; } return; @@ -43,48 +45,58 @@ void save_mbr() { buffer[3 + (i * 4)] = mbr.vols[i].sector; buffer[4 + (i * 4)] = mbr.vols[i].cylinder; - buffer[5 + (i * 4)] = mbr.vols[i].nb_sectors; + buffer[5 + (i * 4)] = mbr.vols[i].nb_blocs; buffer[6 + (i * 4)] = mbr.vols[i].type; } write_sector(0, 0, buffer); } -unsigned int *get_sector_cylinder(unsigned int vol, unsigned int nbloc) +void get_sector_cylinder(unsigned int vol, unsigned int nbloc, unsigned int *sector_cylinder) { - int sector_cylinder[2], absolute_nbloc; + int absolute_nbloc; vol_t volume; assert(vol < mbr.nb_vols); volume = mbr.vols[vol]; - assert(nbloc < volume.nb_sectors); + assert(nbloc < volume.nb_blocs); absolute_nbloc = (volume.cylinder * HDA_MAXSECTOR + volume.sector + nbloc); sector_cylinder[0] = absolute_nbloc % HDA_MAXSECTOR; sector_cylinder[1] = absolute_nbloc / HDA_MAXCYLINDER; - return sector_cylinder; } void read_bloc(unsigned int vol, unsigned int nbloc, unsigned char *buffer) { - int sector_cylinder[2] = get_sector_cylinder(vol, nbloc); // [sector, cylinder] + unsigned int sector_cylinder[2]; + get_sector_cylinder(vol, nbloc, sector_cylinder); /* [sector, cylinder] */ read_sector(buffer, sector_cylinder[1], sector_cylinder[0]); } -void write_bloc(unsigned int vol, unsigned int nbloc, const unsigned char *buffer) +void write_bloc(unsigned int vol, unsigned int nbloc, unsigned char *buffer) { - int sector_cylinder[2] = get_sector_cylinder(vol, nbloc); // [sector, cylinder] + unsigned int sector_cylinder[2]; + get_sector_cylinder(vol, nbloc, sector_cylinder); /* [sector, cylinder] */ write_sector(sector_cylinder[1], sector_cylinder[0], buffer); } void format_vol(unsigned int vol) { - unsigned int nbloc; + unsigned int nbloc, sector_cylinder[2]; vol_t volume = mbr.vols[vol]; - for (nbloc = 0; nbloc < volume.nb_sectors; nbloc++) + for (nbloc = 0; nbloc < volume.nb_blocs; nbloc++) { - int sector_cylinder[2] = get_sector_cylinder(vol, nbloc); + get_sector_cylinder(vol, nbloc, sector_cylinder); /* [sector, cylinder] */ format_sector(sector_cylinder[1], sector_cylinder[1], FMT_SIZE, FMT_DATA); } +} + +void read_sector_n(unsigned char *buf, int cylinder, int sector, int size) +{ + int i; + unsigned char buffer[HDA_SECTORSIZE]; + read_sector(buffer, cylinder, sector); + for (i = 0; i < size; i++) + buf[i] = buffer[i]; } \ No newline at end of file diff --git a/tpfs/vol.h b/tpfs/vol.h index e16cbe854be0ce12964a97254c66032e3b215e1e..27cccca7694656949fa1b74346aa06180e0bc2f0 100644 --- a/tpfs/vol.h +++ b/tpfs/vol.h @@ -2,38 +2,40 @@ #define VOL_H #define VOLS_MAX 8 -#define MBR_MAGIC 0xCAFE // Savoir si le mbr a déjà été initialisé ou non +#define MBR_MAGIC 0xCAFE /* Savoir si le mbr a déjà été initialisé ou non */ #define FMT_DATA 0xCAFEBABE #define FMT_SIZE 0x1 -static mbr_t mbr; - typedef enum { BASE, ANNEXE, OTHER -} vtypes_t; // Volume type +} vtypes_t; /* Volume type */ typedef struct vol_s { unsigned int sector; unsigned int cylinder; - unsigned int nb_sectors; + unsigned int nb_blocs; vtypes_t type; } vol_t; typedef struct mbr_s { unsigned int magic; - unsigned int nb_vols; // nombre de volumes actuels + unsigned int nb_vols; /* nombre de volumes actuels */ vol_t vols[VOLS_MAX]; } mbr_t; +mbr_t mbr; + void load_mbr(void); void save_mbr(void); -unsigned int *get_sector_cylinder(unsigned int vol, unsigned int nbloc); +void get_sector_cylinder(unsigned int vol, unsigned int nbloc, unsigned int *sector_cylinder); void read_bloc(unsigned int vol, unsigned int nbloc, unsigned char *buffer); -void write_bloc(unsigned int vol, unsigned int nbloc, const unsigned char *buffer); +void write_bloc(unsigned int vol, unsigned int nbloc, unsigned char *buffer); + +void read_sector_n(unsigned char *buf, int cylinder, int sector, int size); -#endif // VOL_H +#endif