#include "sffisico.h" #include "errores.h" #include #include #include #include /* Dependencias del sistema */ #ifdef __MSDOS__ #include #include #define PERMISOS_DISCO (S_IREAD|S_IWRITE) #define MODO (O_RDWR|O_BINARY) #else #include #define PERMISOS_DISCO 0644 #define MODO O_RDWR #endif enum Errores Error_SF; /* Variables internas del módulo */ static int Disco = -1; static WORD TamBloqueFisico = 0; static DWORD NumBloquesFisicos = 0; /* Instalación de un disco */ int FabricaDisco (const char* nombre_fichero,WORD tam_bloque,DWORD num_bloques) { struct Superbloque bl; DWORD tam_total = tam_bloque*num_bloques; int err; int fd; if ( tam_total>MAX_TAMDISCO || tam_bloque>MAX_TAMBLOQUE || tam_total=NumBloquesFisicos ) { Error_SF=ERR_RANGO; return -1; } lseek (Disco,nbloque*TamBloqueFisico,SEEK_SET); switch (modo) { case ACCESO_FISICO_ESCRITURA: return write ( Disco,bufer,TamBloqueFisico ) ==TamBloqueFisico; case ACCESO_FISICO_LECTURA: return read ( Disco,bufer,TamBloqueFisico ) ==TamBloqueFisico; default: Error_SF=ERR_CORRUPTO; return -1; } } int LeeBloqueFisico ( DWORD nbloque, void* bufer ) { return AccedeBloqueFisico(nbloque,bufer,LECTURA); } int EscribeBloqueFisico ( DWORD nbloque, const void* bufer ) { return AccedeBloqueFisico(nbloque,(void*)bufer,ESCRITURA); } /* Acceso al superbloque (datos del disco) */ int LeeDatosDisco ( WORD* tam_bloque, DWORD* num_bloques ) { struct Superbloque sb; if (Disco==-1) { Error_SF=ERR_INACTIVO; return -1; } /* Recoge el superbloque */ lseek(Disco,0,SEEK_SET); read(Disco,&sb,TAM_SUPERBLOQUE); /* Verifica que el disco tiene la "palabra mágica" */ if ( strcmp(sb.magico,MAGICO) ) { Error_SF=ERR_FORMATO; return -1; } /* Verifica que el tamaño de bloque físico es correcto */ if ( sb.tam_bloque_fisicoMAX_TAMBLOQUE || sb.num_bloques_fisicos==0 ) { Error_SF = ERR_FORMATO; return -1; } *tam_bloque = sb.tam_bloque_fisico; *num_bloques = sb.num_bloques_fisicos; Error_SF = ERR_SINERROR; return 0; }