Main Page   Modules   Alphabetical List   Data Structures   File List   Data Fields   Globals   Related Pages  

Ext2
[File Systems]


Data Structures

struct  dir_ff
struct  group_descriptor
struct  i_node
struct  super_block

Defines

#define SIZE_SEC   512
#define N_EXT2_NUMERO_MAGICO   0xEF53
#define P_EXT2_NUMERO_MAGICO   0xEF51
#define EXT2_ERRORS_CONTINUE   1
#define EXT2_ERRORS_RO   2
#define EXT3_ERRORS_PANIC   3
#define EXT2_OS_LINUX   0
#define EXT2_OS_HURD   1
#define EXT2_MASIX   2
#define EXT2_FREEBSD   3
#define EXT2_OS_LITES4   4
#define EXT2_GOOD_OLD_REV   0
#define EXT2DYNAMIC_REV   1
#define EXT2_BAD_INO   0x01
#define EXT2_ROOT_INO   0x02
#define EXT2_ACL_IDX_INO   0x03
#define EXT2_ACL_DARA_INO   0x04
#define EXT2_BOOTLOADER   INO 0x05
#define EXT2_UNDEL_DIR_INO   0x06
#define MODE_MASK   0xF000
#define MODE_SOCK   0xC000
#define MODE_LINK   0xA000
#define MODE_FILE   0x8000
#define MODE_BDEV   0x6000
#define MODE_DIR   0x4000
#define MODE_CDEV   0x2000
#define MODE_FIFO   0x1000
#define EXT2_S_ISUID   0x0800
#define EXT2_S_ISGID   0x0400
#define EXT2_S_ISVTX   0x0200
#define EXT2_S_IRWXU   0x01C0
#define EXT2_S_IRUSR   0x0100
#define EXT2_S_IWUSR   0x0080
#define EXT2_S_IXUSR   0x0040
#define EXT2_S_IRWXG   0x0038
#define EXT2_S_IRGRP   0x0020
#define EXT2_S_IWGRP   0x0010
#define EXT2_S_IXGRP   0x0008
#define EXT2_S_IRWXO   0x0007
#define EXT2_S_IROTH   0x0004
#define EXT2_S_IWOTH   0x0003
#define EXT2_S_IXOTH   0x0001
#define EXT2_FT_UNKNOWN   0
#define EXT2_FT_REG_FILE   1
#define EXT2_FT_DIR   2
#define EXT2_FT_CHRDEV   3
#define EXT2_FT_BLKDEV   4
#define EXT2_FT_FIFO   5
#define EXT2_FT_SOCK   6
#define EXT2_FT_SYMLINK   7
#define EXT2_FT_MAX   8
#define DIM_SUPER_BLOCK   1024
#define START_SUPER_BLOCK   1024

Functions

bool init_ext2 ()
char * pwd_ext2 ()
void ls_ext2 ()
void cd_ext2 (char *param)
void cat_ext2 (char *stringa)

Detailed Description

The ext2 file system.

Define Documentation

#define DIM_SUPER_BLOCK   1024
 

Definition at line 97 of file ext2.h.

#define EXT2_ACL_DARA_INO   0x04
 

Definition at line 50 of file ext2.h.

#define EXT2_ACL_IDX_INO   0x03
 

Definition at line 49 of file ext2.h.

#define EXT2_BAD_INO   0x01
 

Definition at line 47 of file ext2.h.

#define EXT2_BOOTLOADER   INO 0x05
 

Definition at line 51 of file ext2.h.

#define EXT2_ERRORS_CONTINUE   1
 

Definition at line 31 of file ext2.h.

#define EXT2_ERRORS_RO   2
 

Definition at line 32 of file ext2.h.

#define EXT2_FREEBSD   3
 

Definition at line 39 of file ext2.h.

#define EXT2_FT_BLKDEV   4
 

Definition at line 90 of file ext2.h.

#define EXT2_FT_CHRDEV   3
 

Definition at line 89 of file ext2.h.

#define EXT2_FT_DIR   2
 

Definition at line 88 of file ext2.h.

#define EXT2_FT_FIFO   5
 

Definition at line 91 of file ext2.h.

#define EXT2_FT_MAX   8
 

Definition at line 94 of file ext2.h.

#define EXT2_FT_REG_FILE   1
 

Definition at line 87 of file ext2.h.

#define EXT2_FT_SOCK   6
 

Definition at line 92 of file ext2.h.

#define EXT2_FT_SYMLINK   7
 

Definition at line 93 of file ext2.h.

#define EXT2_FT_UNKNOWN   0
 

Definition at line 86 of file ext2.h.

#define EXT2_GOOD_OLD_REV   0
 

Definition at line 43 of file ext2.h.

#define EXT2_MASIX   2
 

Definition at line 38 of file ext2.h.

#define EXT2_OS_HURD   1
 

Definition at line 37 of file ext2.h.

#define EXT2_OS_LINUX   0
 

Definition at line 36 of file ext2.h.

#define EXT2_OS_LITES4   4
 

Definition at line 40 of file ext2.h.

#define EXT2_ROOT_INO   0x02
 

Definition at line 48 of file ext2.h.

#define EXT2_S_IRGRP   0x0020
 

Definition at line 75 of file ext2.h.

#define EXT2_S_IROTH   0x0004
 

Definition at line 79 of file ext2.h.

#define EXT2_S_IRUSR   0x0100
 

Definition at line 71 of file ext2.h.

#define EXT2_S_IRWXG   0x0038
 

Definition at line 74 of file ext2.h.

#define EXT2_S_IRWXO   0x0007
 

Definition at line 78 of file ext2.h.

#define EXT2_S_IRWXU   0x01C0
 

Definition at line 70 of file ext2.h.

#define EXT2_S_ISGID   0x0400
 

Definition at line 68 of file ext2.h.

#define EXT2_S_ISUID   0x0800
 

Definition at line 67 of file ext2.h.

#define EXT2_S_ISVTX   0x0200
 

Definition at line 69 of file ext2.h.

#define EXT2_S_IWGRP   0x0010
 

Definition at line 76 of file ext2.h.

#define EXT2_S_IWOTH   0x0003
 

Definition at line 80 of file ext2.h.

#define EXT2_S_IWUSR   0x0080
 

Definition at line 72 of file ext2.h.

#define EXT2_S_IXGRP   0x0008
 

Definition at line 77 of file ext2.h.

#define EXT2_S_IXOTH   0x0001
 

Definition at line 81 of file ext2.h.

#define EXT2_S_IXUSR   0x0040
 

Definition at line 73 of file ext2.h.

#define EXT2_UNDEL_DIR_INO   0x06
 

Definition at line 52 of file ext2.h.

#define EXT2DYNAMIC_REV   1
 

Definition at line 44 of file ext2.h.

#define EXT3_ERRORS_PANIC   3
 

Definition at line 33 of file ext2.h.

#define MODE_BDEV   0x6000
 

Definition at line 61 of file ext2.h.

#define MODE_CDEV   0x2000
 

Definition at line 63 of file ext2.h.

#define MODE_DIR   0x4000
 

Definition at line 62 of file ext2.h.

#define MODE_FIFO   0x1000
 

Definition at line 64 of file ext2.h.

#define MODE_FILE   0x8000
 

Definition at line 60 of file ext2.h.

#define MODE_LINK   0xA000
 

Definition at line 59 of file ext2.h.

#define MODE_MASK   0xF000
 

Definition at line 57 of file ext2.h.

#define MODE_SOCK   0xC000
 

Definition at line 58 of file ext2.h.

#define N_EXT2_NUMERO_MAGICO   0xEF53
 

Definition at line 27 of file ext2.h.

#define P_EXT2_NUMERO_MAGICO   0xEF51
 

Definition at line 28 of file ext2.h.

#define SIZE_SEC   512
 

Definition at line 24 of file ext2.h.

#define START_SUPER_BLOCK   1024
 

Definition at line 98 of file ext2.h.


Function Documentation

void cat_ext2 char *    stringa
 

Definition at line 1057 of file ext2.c.

01057                           {
01058         struct i_node * ino;
01059         dword i;
01060         word block_file;
01061         char *c=NULL;
01062         int stop=0,ll=0;
01063         dword ino_file;
01064 
01065         if (!mount_ext2)
01066         {
01067                 kprintf("\n\rUnmounted File System Ext2\n\r");
01068                 return;
01069         }
01070 
01071         if (!(ino_file = FindFile(param)))
01072         {
01073                 kprintf("\n\rNo such file\n\r");
01074                 return;
01075         }
01076         else if (!(ino=get_inode(ino_file)))
01077                 {
01078                         // invalid inode number
01079                 }
01080                 else if (!(isFile(ino)||isFastSymbolicLink(ino)))
01081                 {
01082                         kprintf("\n\rNot a regular file\n\r");
01083                         return;
01084                 }
01085                 else if (Open_File(ino,ino->i_mode & MODE_MASK))
01086                         {
01087                                 // dimensione in blocchi del file
01088                                 block_file = 0;
01089                                 stop = 3;
01090                                 data_block = (byte *)kmalloc(dim_block);
01091                                 memset(data_block,0,dim_block);
01092                                 //clrscr();
01093                                 set_color(LIGHT_BLUE);
01094                                 kprintf("filename: %s\n\n\r",param);
01095                                 set_color(DEFAULT_COLOR);
01096                                 for (i=0;i<ino->i_size;i++)
01097                                 {
01098                                         if (i % dim_block ==0)
01099                                         {
01100                                                 if ( (err = ReadSectorsLba(0,(int64_t)blocco_to_LBA(ptr_dir[block_file]),spb,(word *)data_block,TRUE)) )
01101                                                 {
01102                                                         kprintf ("\n\rError reading file data block");
01103                                                         ShowIdeErrorMessage(err,TRUE);
01104                                                         kfree(ptr_dir);
01105                                                         kfree(data_block);
01106                                                         return;
01107                                                 }
01108                                                 block_file++;
01109                                                 c = (char *)data_block;
01110                                         }
01111 
01112 
01113                                         if (*c==10) // carattere di fine linea
01114                                         {
01115                                                 stop++;
01116                                                 kprintf("\n\r");
01117                                                 ll=0;
01118                                         }
01119                                         else
01120                                         {
01121                                                 kputchar(*c);
01122                                                 if(ll++>70)
01123                                                 {
01124                                                         // se la linea eccede in lunghezza la dimensione
01125                                                         //dello schermo si divide in due linee
01126                                                         stop++;
01127                                                         ll = 0;
01128                                                 }
01129                                         }
01130 
01131                                         c++;
01132 
01133                                         if (((stop)%22)==0)
01134                                         {
01135                                                 kprintf ("\n\r ------ Continue ------");
01136                                                 if ( kgetchar()==CTRL_C )
01137                                                 {
01138                                                         // *** Andrea Righi 2003-10-04 *** //
01139                                                         kfree(data_block);
01140                                                         //********************************//
01141                                                         kprintf("\n\r");
01142                                                         return;
01143                                                 }
01144                                                 clrscr();
01145                                                 stop = 3;
01146                                                 set_color(LIGHT_BLUE);
01147                                                 kprintf("filename: %s\n\n\r",param);
01148                                                 set_color(DEFAULT_COLOR);
01149                                         }
01150                                 }
01151                                 kfree(data_block);
01152                         }
01153 }

void cd_ext2 char *    param
 

Definition at line 905 of file ext2.c.

00905                          {
00906         struct i_node* ino;
00907         int i,j_param,len_param,i_param;
00908         dword ino_dir;
00909         char elem_path[256]; // si usa per il parsing della path
00910         bool errore;
00911 
00912         //kprintf("\n\rparam %s",param);
00913         if(!mount_ext2)
00914         {
00915                 kprintf("\n\rUnmounted File System Ext2\n\n\r");
00916                 return;
00917         }
00918 
00919         if (!strcmp(param,"."))
00920         {
00921                 // si rimane nella directory corrente
00922                 return;
00923         }
00924 
00925         if (!strcmp(param,"/"))
00926         {
00927                 // si ritorna alla directory radice
00928                 if (!Open_Dir(get_inode(EXT2_ROOT_INO)))
00929                 {
00930                         // se non si può più aprire la root si smonta il file system
00931                         mount_ext2 = FALSE;
00932                         return;
00933                 }
00934                 level = 0;
00935                 path_ext2[0]='\0';
00936                 return;
00937         }
00938 
00939 
00940         if ((level == 0)&&!strcmp(param,".."))
00941         {
00942                 kprintf("\n\rCannot go up from root\n\n\r");
00943         }
00944         else if ((level ==1)&&!strcmp(param,".."))
00945                 {
00946                         // si ritorna alla directory radice
00947                         if (!Open_Dir(get_inode(EXT2_ROOT_INO)))
00948                         {
00949                                 // se non si può più aprire la root si smonta il file system
00950                                 mount_ext2 = FALSE;
00951                                 return;
00952                         }
00953                         level = 0;
00954                         path_ext2[0]='\0';
00955                         ino_current_dir = EXT2_ROOT_INO;
00956                 }
00957                 else
00958                 {
00959 
00960                         errore = FALSE;
00961                         // dobbiamo effettuare il salvataggio dei componenti
00962                         memcpy(&path_ext2_backup,&path_ext2,1024);
00963                         //kprintf ("\n\rpath_ext2_backup : %s\n\r",path_ext2_backup);
00964                         level_backup = level;
00965                         ino_dir_backup = ino_current_dir;
00966 
00967                         // dobbiamo fare il parsing della path
00968                         i_param = 0;
00969                         if (param[0]=='.'&&param[1]=='/')
00970                         {
00971                                 // ./ sta ad indicare restiamo nella dir corrente
00972                                 // non ha senso riaprirla
00973                                 i_param = 2;
00974                         }
00975                         if (param[strlen(param)-1]=='/')
00976                         {
00977                                 len_param = strlen(param)-1;
00978                         }
00979                         else len_param = strlen(param);
00980                         //kprintf ("\n\rlen_param : %u\n\r",len_param);
00981 
00982                         for (j_param=0;i_param<=len_param;i_param++)
00983                                 if ((param[i_param]=='/')||i_param==len_param)
00984                                 {
00985                                         elem_path[j_param]='\0';
00986                                         j_param = 0;
00987                                         //kprintf ("\n\relem_path : %s\n\r",elem_path);
00988                                         if (!(ino_dir=FindFile(elem_path)))
00989                                         {
00990                                                 // non esiste nella directory corrente la sottodirectory param
00991                                                 kprintf("\n\rDirectory no match\n\n\r");
00992                                                 errore = TRUE;
00993                                                 break;
00994                                         }
00995                                         else if (!(ino=get_inode(ino_dir)))
00996                                                 {
00997                                                 // invalid inode number
00998                                                 errore = TRUE;
00999                                                 break;
01000                                                 }
01001                                                 else if (!(isDir(ino)||isFastSymbolicLink(ino)))
01002                                                         {
01003                                                                 kprintf("\n\rNot a directory\n\n\r");
01004                                                                 errore = TRUE;
01005                                                                 break;
01006                                                         }
01007                                                         else if (!Open_Dir(ino))
01008                                                                 {
01009                                                                         if (!isFastSymbolicLink(ino))
01010                                                                                 kprintf("\n\rOpen failed\n\n\r");
01011                                                                         errore = TRUE;
01012                                                                         break;
01013                                                                 }
01014                                                                 else
01015                                                                 {
01016                                                                         // si aggiorna la path salendo nell'albero
01017                                                                         if (!strcmp(elem_path,".."))
01018                                                                         {
01019 
01020                                                                                 if (level)
01021                                                                                 {
01022                                                                                         level--;
01023                                                                                         for (i=strlen(path_ext2)-2;path_ext2[i]!='/';i--);
01024                                                                                         path_ext2[i+1]='\0';
01025                                                                                 }
01026                                                                                 if (!level)
01027                                                                                         path_ext2[0]='\0';
01028                                                                         }
01029                                                                         else
01030                                                                         {
01031                                                                                 strcat(path_ext2,elem_path);
01032                                                                                 strcat(path_ext2,"/");
01033                                                                                 level++;
01034                                                                         }
01035                                                                         ino_current_dir = ino_dir;
01036 
01037                                                                 }
01038                                 }
01039                                 else elem_path[j_param++] = param[i_param];
01040 
01041                                 if (errore)
01042                                 {
01043                                         // si ripristina la vecchia directory
01044                                         kprintf("\n\rerrore\n\r");
01045                                         level = level_backup;
01046                                         memcpy(&path_ext2,&path_ext2_backup,1024);
01047                                         ino_current_dir = ino_dir_backup;
01048                                         Open_Dir(get_inode(ino_current_dir));
01049 
01050 
01051                                 }
01052                                 kprintf("\n\r level :%u\n\r",level);
01053 
01054                 }
01055 }

bool init_ext2  
 

Definition at line 1215 of file ext2.c.

01215                 {
01216         path_ext2[0] = '\0'; //inizializzazione della path
01217 
01218         if (!read_ext2())
01219         {
01220                 //kprintf("\n\rDisk I/O error. Unable to read the super block!!!\n\r");
01221                 return(FALSE);
01222         }
01223         // inizializzazione ext2 a buon fine
01224 
01225         if (!check_ext2())
01226         {
01227                 return(FALSE);
01228         }
01229         // ext2 é valido
01230 
01231 
01232         // calcolo parametri della versione corrente file system
01233 
01234         dim_block = 1024 << super->s_log_block_size; //dimensione dei blocchi
01235 
01236         dim_frag = 1024 << super->s_log_frag_size; // dimensione dei frammenti
01237 
01238         spb = dim_block / SIZE_SEC; //settori per blocco
01239 
01240         sbpos = super->s_first_data_block + 1; // posizione del superblocco
01241 
01242         bpg = super->s_blocks_per_group; //blocchi per gruppo
01243 
01244         gdpb = dim_block / sizeof(struct group_descriptor); // desc di gruppo per blocco
01245 
01246         ipb = dim_block / super->s_inode_size; // inodes per blocco dim inode 128 bit
01247 
01248         number_of_groups = super->s_inodes_count / super->s_inodes_per_group; // numero gruppi
01249 
01250         dir_entries_per_block = dim_block / sizeof(struct dir_ff); //directory per blocco
01251 
01252         dim_ptr = dim_block >> 2; // dim del blocco in parole da 32 bit
01253 
01254         // informazioni di carattere generale sulla ext2 corrente
01255         kprintf("\n\rExt2 parameters\n\r");
01256         kprintf("\n\rTotal number of inodes:                         %u",super->s_inodes_count);
01257         kprintf("\n\rTotal number of block:                          %u",super->s_blocks_count);
01258         kprintf("\n\rNumber of blocks reserved for the super user:   %u",super->s_r_blocks_count);
01259         kprintf("\n\rNumber of groups:                               %u",number_of_groups);
01260         kprintf("\n\rBlock per group:                                %u",bpg);
01261         kprintf("\n\rBlock dimension:                                %u",dim_block);
01262         kprintf("\n\rFragment dimension:                             %u",dim_frag);
01263         kprintf("\n\rSector per block:                               %u",spb);
01264         kprintf("\n\rDirectories per block:                          %u",dir_entries_per_block);
01265         kprintf("\n\rGroup descriptors per block:                    %u",gdpb);
01266         kprintf("\n\rInodes per group:                               %u",super->s_inodes_per_group);
01267         kprintf("\n\rFrags per group:                                %u",super->s_frags_per_group);
01268         kprintf("\n\rInodes per block:                               %u",ipb);
01269         kprintf("\n\r");
01270 
01271         // inizializzazione tabella dei descrittori di gruppo
01272         if (!init_group_desc_table())
01273         {
01274                 return(FALSE);
01275         }
01276 
01277         // inizializzazione tabella degli inode
01278         if (!init_inode_table())
01279         {
01280                 return(FALSE);
01281         }
01282 
01283         // dobbiamo leggere l'inode relativo alla directory radice "inode 2 sempre"
01284 
01285         if (!Open_Dir(get_inode(EXT2_ROOT_INO)))
01286         {
01287                 // kprintf("\n\rNot able to open the root directory\n\r");
01288                 return(FALSE);
01289         }
01290 
01291         ino_current_dir = EXT2_ROOT_INO;
01292 
01293         mount_ext2 = TRUE; //file system montato
01294 
01295         level = 0; // livello nell'albero delle directory, root = 0
01296 
01297         return(TRUE);
01298 }

void ls_ext2  
 

Definition at line 825 of file ext2.c.

00825               {
00826     int i;
00827     struct i_node* info_file;
00828     if (mount_ext2){
00829 
00830         clrscr();
00831         //kprintf("\n\r Total: %u",count_dir);
00832         for (i=0; i<count_dir; i++)
00833         {
00834 
00835                 info_file = get_inode(inode_dir[i]);
00836                 // data e ora di creazione del file
00837                 tempo = det_time(info_file->i_ctime);
00838                 data = det_date(info_file->i_ctime);
00839 
00840                 // TODO : fast symbolic link
00841                 if ((info_file->i_mode&MODE_MASK)==MODE_LINK)
00842                         continue;
00843                 switch (info_file->i_mode & MODE_MASK)
00844                 {
00845 
00846                 case MODE_FILE:
00847                 set_color(WHITE);
00848                 break;
00849 
00850                 case MODE_DIR:
00851                 set_color(LIGHT_BLUE);
00852                 break;
00853 
00854                 case MODE_CDEV:
00855                 set_color(LIGHT_GREEN);
00856                 break;
00857 
00858                 case MODE_BDEV:
00859                 set_color(LIGHT_RED);
00860                 break;
00861 
00862                 case MODE_FIFO:
00863                 set_color(LIGHT_MAGENTA);
00864                 break;
00865 
00866                 case MODE_SOCK:
00867                 set_color(LIGHT_CYAN);
00868                 break;
00869 
00870                 case MODE_LINK:
00871                 set_color(RED);
00872                 break;
00873 
00874                 }
00875 
00876                 kprintf("\n\r %s",ext2_file_name[i]);
00877                 set_color(DEFAULT_COLOR);
00878                 kprintf ("\r                    (%u)",inode_dir[i]);
00879                 set_color(WHITE);
00880                 kprintf("\r                                     %u",info_file->i_size);
00881                 kprintf("\r                                             %u:%u",tempo.ora,tempo.minuti);
00882                 kprintf("\r                                                      %u-%u-%u",data.anno,data.mese,data.giorno);
00883                 kprintf("\r                                                                     %u",info_file->i_blocks);
00884                 set_color(DEFAULT_COLOR);
00885                 if (((i+1)%22)==0)
00886                 {
00887                         kprintf ("\n\r ------ Continue ------");
00888                         if (kgetchar()==CTRL_C)
00889                         {
00890                                 kprintf("\n\n\r");
00891                                 return;
00892                         }
00893                         clrscr();
00894                 }
00895         }
00896         kprintf("\n\n");
00897     }
00898     else kprintf("\n\rUnmounted File System Ext2\n\n\r");
00899     return;
00900 }

char* pwd_ext2  
 

Definition at line 817 of file ext2.c.

00817                 {
00818     if (mount_ext2)
00819         return(path_ext2);
00820      else return('\0');
00821 }


Generated on Fri Feb 20 15:32:22 2004 for Minirighi by doxygen1.2.18