fat12.c

Go to the documentation of this file.
00001 /* floppy.c */
00002 #include "routix/system.h"
00003 #include "string.h"
00004 #include "drivers/fat.h"
00005 #include "routix/paging.h"
00006 #include "routix/kalloc.h"
00007 #include <routix/kstdio.h>
00008 #include <routix/file.h>
00009 #include <drivers/floppy.h>
00010 #include <fs/blockcache.h>
00011 
00012 //void printing (file_loaded_t *archivo);
00013 
00014 
00015 // La mayoria de estas funciones estan hechas considerando un disco de 1.44MB (comportamiento impredecible en otro formatos)
00016 
00017 
00018 //Algunas valores retornados
00019 #define ERR_NOMEM       -1      //No hay memoria suficiente (kmalloc_page==NULL)
00020 #define ERR_NO_FAT      -2
00021 #define ERR_NO_BOOT     -3
00022 #define ERR_LAST_SECTOR -5
00023 #define LAST_SECTOR     -100    //Ultimo sector
00024 
00025 
00026 // Buffer donde se guardar cada bloque leido
00027 byte buffer[512];
00028 
00029 
00030 dev_fat_t dev_fat[1];           //Defino estructura para dos dispositivos FAT
00031 
00032 
00034 // Lee el sector logico 0 (Boot sector), y levanta todos los parametros fisicos y logicos del disco
00035 // para que sean usados por las demas funciones
00037 int fat_12(void)
00038 {
00039     dev_fat[0].boot_leido = FALSE;
00040     dev_fat[0].fat_levantada = FALSE;
00041 
00042     //Leer Boot Sector del floppy
00043                 //if ( leer_sector(0,buffer) != OK)     {
00044     if ( CACHE_READ(fd0,BOOTSECTOR,buffer) == -1)       {
00045                         kprintf("No se pudo leer sector\n");
00046                         return -1;
00047                 }
00048 
00049     boot_sector_t *p= (boot_sector_t *) buffer;
00050     
00051     dev_fat[0].fat_size = p->BPB_FATSz16;
00052     dev_fat[0].cantidad_de_fats = p->BPB_NumFATs;
00053     dev_fat[0].sectores_ocultos = p->BPB_HiddSec;
00054     dev_fat[0].sectores_totales = p->BPB_TotSec16;
00055     dev_fat[0].root_dir_size = (p->BPB_RootEntCnt * sizeof(fat12_entry_t)) / SECTOR_SIZE;
00056     dev_fat[0].sectores_por_cluster = p->BPB_SecPerClus;
00057     dev_fat[0].sector_size = p->BPB_BytsPerSec;
00058     dev_fat[0].fat_start = 1;       
00059     dev_fat[0].root_dir_start = 1 + dev_fat[0].sectores_ocultos + (dev_fat[0].cantidad_de_fats * dev_fat[0].fat_size);
00060     
00061     dev_fat[0].boot_leido=TRUE;
00062     return OK;
00063 }
00064 
00066 // Levanta todos los sectores correspondientes a la FAT y los coloca en la memoria
00067 // Debera tenerse en cuenta que al cambiar el diskette, el flag "fat_levantada" debera volverse a FALSE
00069 
00070 fat_t fat_header;   //Header de una lista enlazada que va apuntando a bloques en memoria de 512 (fragmentos de la FAT)
00071 
00072 int levantar_fat(void)
00073 {
00074     //CUIDADO !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
00075 //    malloc(100);
00076     
00077     //Cantidad de paginas que requiere la FAT (en gral para 9 sectores de FAT se requieren 2 paginas)
00078     word fat_paginas = (dev_fat[0].fat_size * BLOQUE_SIZE) / PAGINA_SIZE;
00079 
00080     
00081     //Contador para saber cuantos sectores de la fat se levantaron del diskette
00082     word sec_fat_levantados=0;
00083     word i, j;
00084 
00085     if ( dev_fat[0].boot_leido == FALSE ) {
00086         kprintf("Debe levantarse el BOOT\n");
00087         return ERR_NO_BOOT;
00088     }
00089 
00090     if ( dev_fat[0].fat_levantada == TRUE ) {
00091         return OK;
00092     }
00093 
00094     
00095     //Si la division (fat_size * BLOQUE_SIZE) / PAGINA_SIZE no da entera, redondear para arriba
00096     if ( (dev_fat[0].fat_size * BLOQUE_SIZE) % PAGINA_SIZE)
00097         fat_paginas++;
00098 
00099     
00100     //Puntero a la lista enlazada de los bloques de FAT, inicializado a NULL en sus dos campos
00101     fat_t *aux= &fat_header;
00102     aux->bloque = NULL;
00103     aux->next = NULL;
00104 
00105     for(i=0 ; i < fat_paginas ; i++) {
00106     
00107         //Obtener una pagina
00108         if (!(aux->bloque = (byte *) kmalloc_page()))   {
00109             kprintf("No hay memoria disponible para levantar la FAT\n");
00110             return ERR_NOMEM;
00111         }
00112 
00113         //Mapeo las paginas que contienen bloques en memoria virtual, para poder asi tenerlos en forma contigua
00114         //(nadie me asegura que los bloques entregados por kmalloc_page sean contiguos)
00115         kmapmem((addr_t) aux->bloque, DIR_FAT_VIRTUAL + (i * PAGINA_SIZE), KERNEL_PDT, PAGE_PRES | PAGE_SUPER | PAGE_RW); 
00116         aux->bloque = (byte *) (DIR_FAT_VIRTUAL + (i * PAGINA_SIZE));
00117 
00118         //Hacer que cada nodo de la lista apunte a 512 bytes dentro de la pagina obtenida.
00119         for(j=0;(j<((PAGINA_SIZE/BLOQUE_SIZE))) && (sec_fat_levantados<dev_fat[0].fat_size);j++, sec_fat_levantados++ ) {
00120             //if (leer_sector(sec_fat_levantados + dev_fat[0].fat_start, aux->bloque)!=OK) {
00121                 if (CACHE_READ(fd0,sec_fat_levantados + dev_fat[0].fat_start, aux->bloque) == -1 ) {
00122                         kprintf("No se pudo levantar la FAT");
00123                         return -1;
00124                 }
00125     
00126           aux->next = (fat_t *) malloc( sizeof(fat_t) );
00127                 aux->next->bloque = aux->bloque + BLOQUE_SIZE;
00128                 aux = aux->next;
00129                 aux->next = NULL;
00130         }
00131     }
00132 
00133     //Levantar flag para que las funciones que requieran buscar algo en FAT, sepan que pueden hacerlo
00134     dev_fat[0].fat_levantada = TRUE;
00135     return OK;
00136 }
00137 
00138 // **************************************************************************************************************
00139 // Prepara el entorno (carga la FAT y el BPB) para que puedan ser utilizadas las demas funciones de acceso
00140 // a disco
00141 // **************************************************************************************************************
00142 int init_floppy_fs(void)
00143 {
00144     dev_fat[0].fat_start = 1;
00145     if ( (fat_12()!=OK) || (levantar_fat()!=OK) )
00146         return -1;
00147 
00148     return OK;
00149 }       
00150 
00151 
00152 
00153 // **************************************************************************************************************
00154 // Recibe un nombre en formato FAT ( KERNEL  BIN ) y lo transforma a un formato tipo string: KERNEL.BIN\0
00155 // **************************************************************************************************************
00156 void fat_adapta_name (byte *nombre_fat, byte *adaptado)
00157 {
00158     byte x=0,z;
00159     strcpy(adaptado,"            ");
00160     for( z=0  ; z<11 ;  z++) {
00161         if ( (z==8) && (nombre_fat[8]!=' ') ) {
00162             adaptado[x]='.';
00163             x++;
00164         }
00165         adaptado[x] = nombre_fat[z];
00166         if (nombre_fat[z] != ' ')
00167             x++;
00168     }
00169     adaptado[x]='\0';
00170     
00171 }       
00172 
00173 
00174 
00175 
00177 //Esta funcion recibe un numero de sector (perteneciente a un archivo) y halla cual es el sector que le sigue.
00178 //retorna el sector correspondiente, o LAST_SECTOR en caso de que el sector recibido ("sector") sea el ultimo.
00180 int fat_next_sector ( dword sector )
00181 {
00182     //Si no se levanto la FAT del disco, no se puede hacer nada
00183     if (dev_fat[0].fat_levantada==FALSE)
00184         return ERR_NO_FAT;
00185 
00186     if (sector == 0xfff)
00187         return ERR_LAST_SECTOR;
00188 
00189     sector -= 31;       //Corrijo el sector, ya que la primera entrada disponible de la FAT apunta al sector 32, y no al 1
00190     
00191     // Tener en cuenta que FAT12 utiliza codificacion inversa. Cualquier duda recurrir a Microsoft Hardware White PAPER
00192     // FAT General Overview of On-Disk Format
00193     byte lsb, msb;
00194 
00195     word indice; 
00196 
00197     indice = (sector * 3) >> 1;
00198     lsb = fat_header.bloque[indice];
00199     msb = fat_header.bloque[indice + 1];
00200 
00201     word proximo_sector;
00202 
00203     if (sector % 2)         //Si es impar, tomo los tres nibbles mas altos
00204         proximo_sector = (((msb << 8) | lsb) & 0xfff0) >> 4;
00205     
00206     else                            //Si es par, tomo los mas bajos
00207         proximo_sector = ((msb << 8) | lsb) & 0x0fff;
00208         
00209     if ( proximo_sector==0xFFF )
00210         return LAST_SECTOR;
00211     
00212     return (proximo_sector + 31);
00213 }       
00214 
00215 // **************************************************************************************************************
00216 // Recibe un PATH que puede contener directorio y devuelve estilo mnt/files/prog.bin y devuelve el largo hasta
00217 // la primera '/' o -1 en caso de que no sea una cadena de paths sino un solo nombre (estilo mnt).
00218 // Esta funcion se usa multiples veces hasta llegar al archivo final.
00219 // **************************************************************************************************************
00220 int str_dir_len (char *nombre)
00221 {
00222     int len=0;
00223     while( *nombre++ != '/') {
00224         len++;
00225         if ( (len > 12) || (*nombre=='\0') )
00226             return -1;
00227     }
00228 
00229     return len;     
00230 }       
00231 
00232 
00234 //      fat12_entry_t *fat_file_find (char *nombre, fat12_entry_t *datos_archivo);
00235 //
00236 // Esta funcion recibe un nombre de archivo, y devuelve el sector de comienzo.
00237 // Esta version soporta directorios, asi que, cualquier funcion o comando que la llame puede pasarle como parametro
00238 // un archivo dentro de un directorio. (mnt/files/pepe.txt)
00239 //
00240 // NOTA: el directorio Root tiene un tamaņo fijo, y sus sectores estan contiguos. Los demas 
00241 // directorios, tienen por tamaņo 0, sus sectores pueden no ser contiguos, y para saber que en que sector continua
00242 // el directorio debera llamarse a fat_next_sector. El flag root_dir_flag es utilizado para indicar si el directorio
00243 // en el que se busca es el Root o algun otro (ya que el programa debera comportarse de forma diferente).
00245 
00246 fat12_entry_t *fat_file_find (char *nombre, fat12_entry_t *datos_archivo)
00247 {
00248 
00249     char nombre_aux[MAX_PATH_LEN];    //String auxiliar donde se va parseando el nombre por tramos (entre "/")
00250     char nombre_archivos[MAX_PATH_LEN];    //String en el que se guarda cada nombre levantado del disco
00251     
00252     byte x; 
00253     
00254     byte root_dir_flag=TRUE;   //Directorio en el que se busca es el Root.
00255     
00256     //Pasar el nombre a buscar a mayusculas (recordar que la FAT solo usa mayusculas)
00257     str_to_upper(nombre);
00258 
00259     //Sector de comienzo y cantidad de sectores del directorio a leer
00260     dword dir_sector, dir_size;
00261     
00262     //El primer directorio a leer sera el Root Dir, asi que cargo sus parametros 
00263     dir_sector = dev_fat[0].root_dir_start;
00264     dir_size = dev_fat[0].root_dir_size;
00265     
00266     int dir_len;    //nombre actual es un archivo o directorio (ver funcion str_dir_len). Si es archivo dir_len=-1
00267                     //si es directorio, dir_len=cantidad de caracteres del nombre
00268 
00269     fat12_entry_t *aux_fat;     //Estructura para levantar los datos de cada archivo de disco
00270 kprintf("1 Mallocs: %d\tFrees: %d\n", num_mallocs, num_frees);
00271     
00272     do {
00273 fat_file_find_break:
00274         if ((dir_len=str_dir_len(nombre)) > 0)  {           //Si es un directorio, buscarlo y apuntar
00275                 strncpy(nombre_aux, nombre, dir_len);       //nombre al proximo directorio/archivo
00276                 nombre = nombre + dir_len + 1;
00277                 }
00278                 else strcpy(nombre_aux, nombre);                    //Si llego aca, *nombre es un archivo
00279 
00280                 do {
00281 kprintf("2 Mallocs: %d\tFrees: %d\n", num_mallocs, num_frees);
00282                         //if ( leer_sector(dir_sector, buffer) != OK) {
00283                         if ( CACHE_READ(fd0,dir_sector, buffer) == -1 ) {
00284                                 kprintf("No se puede leer sector\n");
00285                                 return NULL;
00286                 }
00287 kprintf("3 Mallocs: %d\tFrees: %d\n", num_mallocs, num_frees);
00288 
00289                 aux_fat = (fat12_entry_t *) buffer;
00290 
00291 
00292                 //Recorro desde 0-16 (que son las cantidad de entradas de archivos que hay por sector)
00293                 for( x=0 ; x < (SECTOR_SIZE / sizeof(fat12_entry_t)) ; x++) {   
00294                                 fat_adapta_name( aux_fat->nombre , nombre_archivos);
00295 
00296                         if ( strcmp( nombre_archivos, nombre_aux)==0 ) {        
00297                                     if (dir_len < 0) {
00298                                         memcpy( datos_archivo, aux_fat, sizeof(fat12_entry_t));
00299                                                 return aux_fat;
00300                                 }
00301                                 dir_sector = aux_fat->sector + 31;
00302                                 dir_size = 0xffff;
00303                                 root_dir_flag=FALSE;    //Ahora voy a buscar en otro directorio
00304                                 goto fat_file_find_break;
00305                                 }
00306                                 aux_fat++;
00307                 }
00308                 if (root_dir_flag==TRUE) {
00309                                 dir_sector++;
00310                                 if (dir_sector > (dev_fat[0].root_dir_start + dev_fat[0].root_dir_size) )
00311                                 return NULL;
00312                 }
00313                 else {
00314                                 if ((dir_sector = fat_next_sector(dir_sector))==LAST_SECTOR)
00315                                         return NULL;
00316                 }       
00317 
00318                 } while (dir_sector != LAST_SECTOR);
00319 
00320     }while ( dir_len > 0 ); 
00321 
00322     //Si llegue aqui, archivo no encontrado.
00323     return NULL;
00324 }
00325 
00326 
00327 
00328 
00329 
00330 
00331 
00332 
00333 
00334 
00335 
00336 
00337 struct floppy_cache *header_floppy_cache=NULL;
00338 
00339 dword sectores_cache=0;
00340 
00341 // Esta funcion mantiene una lista enlazada con sectores leidos del floppy. Cualquier funcion de fs que quiera leer
00342 // o escribir un sector, deberia recurrir a esta. (Debe controlarse perfectamente que esta funcion mantenga 
00343 // espejados a los sectores, es decir, en algun momento debera sincronizar los sectores con el disco
00344 /*
00345 struct flop_cache
00346 {
00347     dword sector;
00348     byte *bloque;
00349 };*/
00350 /*
00351 #define MAX_CACHE_ENTRYS    100
00352 struct flop_cache cache_index[MAX_CACHE_ENTRYS];
00353 */
00354 void floppy_cache_init (void)
00355 {
00356 
00357         return; 
00358 
00359         /*      
00360     word i;
00361     for(i=0 ; i< MAX_CACHE_ENTRYS ; i++) {
00362         cache_index[i].sector=0;
00363         cache_index[i].bloque=NULL;
00364     }
00365         */
00366 }
00367 
00368 /*
00369 void *floppy_cache (dword sector)
00370 {
00371     word i;
00372     byte flag=FALSE;
00373 
00374     //kprintf("Entrando a floppy_cache\n");
00375 
00376     for (i=0 ; i<MAX_CACHE_ENTRYS ; i++) {
00377         if (cache_index[i].bloque==NULL)
00378             break;
00379         if (cache_index[i].sector == sector) {
00380             //kprintf("***Sector se encontraba en el cache***");
00381             return (cache_index[i].bloque);
00382         }
00383     }       
00384     
00385     if ( i >= MAX_CACHE_ENTRYS )        {    // Debe implementarse algun algoritmo de sustitucion
00386         //kprintf("***excedido de MAX_CACHE_ENTRYS en el cache***");
00387         return NULL;
00388     }
00389 
00390     // Como los sectores leidos los alloco en paginas, puedo meter en cada uno de ellos PAGINA_SIZE / SECTOR_SIZE (en casos
00391     //  normales 8 sectores por pagina). Los indices 0,8,16,24,etc deberan pedir una nueva pagina, mientras que los sectores
00392     //  "internos" (1,2,3,4,5,6,7) no.
00393      
00394     if ( (i % (PAGINA_SIZE / SECTOR_SIZE))==0 )  {
00395         //kprintf("***Sector multiplo de: %d***", PAGINA_SIZE / SECTOR_SIZE);
00396         if ( (cache_index[i].bloque = (byte *) kmalloc_page()) == NULL )
00397             return NULL;
00398         flag=TRUE;
00399     }
00400     // El sector es un sector "interno", no es necesario pedir memoria
00401     else {
00402         if ( cache_index[i-1].bloque==NULL ) {  //Hay problemas de consistencia ?
00403             kprintf("Floppy cache PANIC");
00404             return NULL;
00405         }           
00406         else {  //Si todo esta bien
00407             //kprintf("***Sector NO multiplo de: %d***", PAGINA_SIZE / SECTOR_SIZE);
00408             cache_index[i].bloque = cache_index[i-1].bloque + SECTOR_SIZE;
00409         }
00410     }
00411 
00412     
00413     if (leer_sector( sector, cache_index[i].bloque)!=OK) {
00414         if (flag==TRUE)
00415             kfree_page(cache_index[i].bloque);
00416         return NULL;
00417     }
00418 
00419     sectores_cache++;   //Fines depurativos
00420     cache_index[i].sector = sector;
00421     return cache_index[i].bloque;
00422     
00423 }
00424 */
00426 // Funcion de cache que utiliza listas enlazadas (malloc y free) la cual tiraba excepciones al cachear el sector quinceavo
00427 // no logre averiguar porque pero intuyo que tiene que ver con la implementacion de las primitivas de malloc y free
00428 /*   
00429 void *floppy_cache (dword sector)
00430 {
00431     struct floppy_cache *aux = header_floppy_cache;
00432     
00433     // Verificar si aun no se aloco ningun sector en el cache
00434     if ( aux==NULL ) {
00435                 kprintf("ACA\n");
00436         aux = (struct floppy_cache *) malloc ( sizeof(struct floppy_cache));
00437         if ( aux == NULL) {
00438            kprintf("Malloc no me dio memoria 1\n");
00439             while(1);
00440         }           
00441         if ( leer_sector(sector, aux->bloque)!=OK ) {
00442             free (aux);
00443             aux->next = NULL;
00444             return NULL;
00445         }
00446         aux->sector = sector;
00447         aux->next = NULL;
00448         header_floppy_cache = aux;
00449         sectores_cache++;
00450         return aux->bloque;
00451     }
00452 
00453     // Verificar si en la lista enlazada del cache se encuentra el sector buscado       
00454     for (  ;  aux->next  ;  aux=aux->next ) {
00455         if ( aux->sector == sector ) {
00456            return aux->bloque;
00457         }
00458     }
00459 
00460     // Este bloque es necesario para saber si el sector buscado es el ultimo nodo en la lista
00461     if (aux->sector == sector) {
00462         return aux->bloque;
00463     }
00464     // Si estoy aca, es que el sector no se encuentra en el cache
00465     aux->next = (struct floppy_cache *) malloc ( sizeof(struct floppy_cache));
00466     if ( aux->next == NULL) {
00467         kprintf("Malloc no me dio memoria 2\n");
00468             while(1);
00469     }       
00470     
00471     if ( leer_sector(sector, aux->next->bloque)!=OK ) {
00472         free (aux->next);
00473         aux->next = NULL;
00474         return NULL;
00475     }
00476     
00477     aux = aux->next;
00478     aux->sector = sector;
00479     aux->next = NULL;
00480  
00481     sectores_cache++;
00482     return aux->bloque;
00483     
00484 }       
00485 */
00486 
00487 // **************************************************************************************************************
00488 // Estas funciones solo son usadas a modo de prueba, no son parte del manejo de FAT12
00489 // **************************************************************************************************************
00490 
00491 void print_fat_info (void)
00492 {
00493     putchar('\n');
00494     boot_sector_t *p= (boot_sector_t *) buffer;
00495 
00496     if ( p->BPB_RsvdSecCnt != 1)
00497         kprintf("Filesystem no reconocido\n");
00498     else kprintf("Disco es FAT12\n");
00499 
00500     byte i;
00501     kprintf("BS_FilSysType:");
00502     for(i=0; i<8;i++)
00503         putchar(p->BS_FilSysType[i]);
00504     putchar('\n');
00505 
00506     kprintf("Sectores por FAT: %d\n", dev_fat[0].fat_size);
00507     kprintf("Cantidad de FATs: %d\n", dev_fat[0].cantidad_de_fats);
00508     kprintf("Fat start: %d\n", dev_fat[0].fat_start);
00509     kprintf("Sectores ocultos: %d\n", dev_fat[0].sectores_ocultos);
00510     kprintf("Sectores totales: %d\n", dev_fat[0].sectores_totales);
00511     kprintf("Sectores por Cluster: %d\n", dev_fat[0].sectores_por_cluster);
00512     kprintf("Sectores asignados al directorio root: %d\n", dev_fat[0].root_dir_size);
00513     kprintf("Comienzo del root dir: sector %d\n", dev_fat[0].root_dir_start);
00514 }       
00515 
00516 
00518 // Esta funcion imprime los nombres de todos los archivos que se hallen en el Root (no tiene utilidad real)
00520 void fat_root_dir (void)
00521 {       
00522     if ((dev_fat[0].boot_leido==FALSE) || (dev_fat[0].fat_levantada==FALSE) )
00523         if ( init_floppy_fs() != OK ) {
00524             kprintf("No se puede leer disco\n");
00525         }
00526     
00527     byte root_dir_sector;
00528     byte x;
00529     fat12_entry_t *datos;
00530 
00531     char nombre[MAX_PATH_LEN];
00532     
00533     for (root_dir_sector=dev_fat[0].root_dir_start;root_dir_sector<(dev_fat[0].root_dir_start+dev_fat[0].root_dir_size) \
00534     ; root_dir_sector++) {
00535         //if ( leer_sector(root_dir_sector, buffer) != OK) {
00536         if ( CACHE_READ(fd0,root_dir_sector, buffer) == -1 ) {
00537             kprintf("No se puede leer sector\n");
00538             return;
00539         }
00540         datos = (fat12_entry_t *) buffer;
00541     
00542         for( x=0 ; x < (SECTOR_SIZE / sizeof(fat12_entry_t)) ; x++) {   
00543             if ((datos->nombre[0]!=FAT_EMPTY) && (datos->nombre[0]!=FAT_SUBDIR) && \
00544                             (datos->nombre[0]!=FAT_DELETED)) {
00545                 fat_adapta_name( datos->nombre , nombre);
00546                 kprintf("Archivo: %s\n", nombre);
00547             }   
00548             datos++;
00549         }
00550     }    
00551 }
00552 
00554 // Funcion llamada desde el shell al ejecutar "flop find"
00556 void fat_test(void)
00557 {
00558 
00559     if ((dev_fat[0].boot_leido==FALSE) || (dev_fat[0].fat_levantada==FALSE) )
00560         if ( init_floppy_fs() != OK ) {
00561             kprintf("No se puede leer disco\n");
00562         }
00563 
00564     byte nombre[25];
00565     fat12_entry_t datos_archivo;
00566     kprintf("Archivo a buscar:");
00567     gets(nombre);
00568     if ( fat_file_find (nombre, &datos_archivo) ) {
00569         kprintf("Tamaņo: %d\n", datos_archivo.size);
00570 
00571         if (datos_archivo.atributo & 0x10)
00572             kprintf("El archivo es un Directorio\n");
00573         
00574         kprintf("Comienza en Cluster: %d\n", \
00575         (datos_archivo.sector * dev_fat[0].sectores_por_cluster) + dev_fat[0].root_dir_start + dev_fat[0].root_dir_size -2); 
00576     }
00577     else {
00578         kprintf("Archivo no encontrado: %s\n", nombre);
00579         return;
00580     }
00581     if (dev_fat[0].fat_levantada==FALSE) {
00582         levantar_fat();
00583     }
00584 
00585     
00586     int sector=(datos_archivo.sector*dev_fat[0].sectores_por_cluster)+dev_fat[0].root_dir_start+dev_fat[0].root_dir_size-2;
00587 
00588     sector = fat_next_sector(sector);
00589 
00590     while (  (sector > 0) && (sector < 0xff0) ) {
00591         kprintf("%d->", sector);
00592         sector = fat_next_sector(sector);
00593     }
00594     kprintf("FIN\n");    
00595 }       
00596 
00598 // Equivalente a un "cat nombre_archivo". (solo con fines de depuracion)
00600 /*
00601 void printing (file_loaded_t *archivo)
00602 {
00603     word i;
00604     byte n=0;
00605     char pepe[30];
00606     while (archivo) {
00607 
00608         for (i=0 ; i<512 ; i++) {
00609             if (archivo->bloque[i]=='\n')
00610                 n++;
00611             if (n==23) {
00612                 n=0;
00613                 kprintf("\nPresione una tecla para continuar...");
00614                 gets(pepe);
00615             }
00616             putchar(archivo->bloque[i]);
00617         }           
00618         archivo = archivo->next;
00619     }       
00620     putchar('\n');
00621 }       
00622 */

Generated on Sun May 30 18:38:34 2004 for Routix OS by doxygen 1.3.6