#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; void historial_inicia(int ventana); void historial_termina(); void historial_accede (DWORD nbloque); /* 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; } /* Contador de accesos */ historial_accede(nbloque); 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; } /* Contadores de referencias y localidad */ static unsigned long nbloques_accedidos=0; static long* historia = 0; static long* cuenta = 0; static long nrefs; static double localidad = 0.0; static int ventana_historial=25; void historial_inicia(int ventana) { int i; nbloques_accedidos=0; nrefs=0; localidad=0.0; if (ventana>0) ventana_historial=ventana; historia = (long*)malloc(sizeof(long)*ventana_historial); cuenta = (long*)malloc(sizeof(long)*NumBloquesFisicos); for (i=0;i