| 326 | | |
| 327 | | |
| 328 | | ////////////////////////////////////////////////////////////////////////////////// |
| 329 | | // The following function accesses directly the FS_INFO block on the block device, |
| 330 | | // to update the "first_free_cluster" and "free_clusters_number" values, |
| 331 | | // using only the Fat-Descriptor single block buffer. |
| 332 | | // It return 0 on success. |
| 333 | | // It return 1 on error. |
| 334 | | ////////////////////////////////////////////////////////////////////////////////// |
| 335 | | |
| 336 | | static unsigned int _update_fs_info(); |
| 337 | | |
| 338 | | ////////////////////////////////////////////////////////////////////////////// |
| 339 | | // The following function read a data field (from one to four bytes) |
| 340 | | // from an unsigned char[] buffer, taking endianness into account. |
| 341 | | // The analysed field is defined by the <offset> and <size> arguments. |
| 342 | | ////////////////////////////////////////////////////////////////////////////// |
| 343 | | |
| 344 | | static unsigned int _read_entry( unsigned int offset, |
| 345 | | unsigned int size, |
| 346 | | unsigned char* buffer, |
| 347 | | unsigned int little_indian ); |
| 348 | | |
| 349 | | ////////////////////////////////////////////////////////////////////////////////// |
| 350 | | // The following function returns the lba of first sector in DATA region |
| 351 | | // from the cluster index. The cluster index must be larger than 2. |
| 352 | | ////////////////////////////////////////////////////////////////////////////////// |
| 353 | | |
| 354 | | static unsigned int _cluster_to_lba( unsigned int cluster ); |
| 355 | | |
| 356 | | ////////////////////////////////////////////////////////////////////////////////// |
| 357 | | // The following function returns in the "nb_entries" argument the number of files |
| 358 | | // (or directories) contained in a directory identified by the "inode " pointer. |
| 359 | | // It returns 0 on success. |
| 360 | | // It returns 1 on error. |
| 361 | | ////////////////////////////////////////////////////////////////////////////////// |
| 362 | | |
| 363 | | static unsigned int _get_nb_entries( fat_inode_t* inode, |
| 364 | | unsigned int* nb_entries ); |
| 365 | | |
| 366 | | ////////////////////////////////////////////////////////////////////////////////// |
| 367 | | // The following function search in the directory identified by the <parent> |
| 368 | | // inode pointer a child (file or directory) identified by its <name>. |
| 369 | | // It returns in the <inode> argument the searched child inode pointer. |
| 370 | | // If the searched name is not found in the Inode-Tree, the function accesses |
| 371 | | // the File-cache associated to the parent directory. |
| 372 | | // If the child exists on block device, the Inode-Tree is updated, and |
| 373 | | // a success code is returned. |
| 374 | | // If the file/dir does not exist on block device, a error code is returned. |
| 375 | | // It returns 0 if inode found. |
| 376 | | // It returns 1 if inode not found. |
| 377 | | // It returns 2 on error in cache access. |
| 378 | | ////////////////////////////////////////////////////////////////////////////////// |
| 379 | | |
| 380 | | static unsigned int _get_child_from_parent( fat_inode_t* parent, |
| 381 | | char* name, |
| 382 | | fat_inode_t** inode ); |
| 383 | | |
| 384 | | ///////////////////////////////////////////////////////////////////////////////// |
| 385 | | // For a file (or a directory) identified by the "pathname" argument, the |
| 386 | | // following function returns in the "inode" argument the inode pointer |
| 387 | | // associated to the searched file (or directory), with code (0). |
| 388 | | // If the searched file (or directory) is not found, but the parent directory |
| 389 | | // is found, it returns in the "inode" argument the pointer on the parent inode, |
| 390 | | // with code (1). Finally, code (2) and code (3) are error codes. |
| 391 | | // Both the Inode-Tree and the involved Cache-Files are updated from the block |
| 392 | | // device in case of miss on one inode during the search in path. |
| 393 | | // Neither the Fat-Cache, nor the block device are updated. |
| 394 | | // It returns 0 if searched inode found |
| 395 | | // It returns 1 if searched inode not found but parent directory found |
| 396 | | // It returns 2 if searched inode not found and parent directory not found |
| 397 | | // It returns 3 if one name too long |
| 398 | | ///////////////////////////////////////////////////////////////////////////////// |
| 399 | | |
| 400 | | static unsigned int _get_inode_from_path( char* pathname, |
| 401 | | fat_inode_t** inode ); |
| 402 | | |
| 403 | | ////////////////////////////////////////////////////////////////////////////////// |
| 404 | | // The following function checks if node "a" is an ancestor of inode "b". |
| 405 | | // It returns 0 on failure. |
| 406 | | // It returns 1 otherwise. |
| 407 | | ////////////////////////////////////////////////////////////////////////////////// |
| 408 | | |
| 409 | | static unsigned int _is_ancestor( fat_inode_t* a, |
| 410 | | fat_inode_t* b); |
| | 326 | === __unsigned int '''_update_fs_info()'''__ === |
| | 327 | This function accesses directly the FS_INFO block on the block device, to update the "first_free_cluster" and "free_clusters_number" values, using only the Fat-Descriptor single block buffer. |
| | 328 | It return 0 on success. It return 1 on error. |
| | 329 | |
| | 330 | === __unsigned int '''_read_entry'''( unsigned int offset , unsigned int size , unsigned char* buffer , unsigned int little_indian )__ === |
| | 331 | This function read a data field (one to four bytes) from an unsigned char[] <buffer>, taking endianness into account. |
| | 332 | The analysed field is defined by the <offset> and <size> arguments. |
| | 333 | |
| | 334 | === __unsigned int '''_cluster_to_lba'''( unsigned int cluster )__ === |
| | 335 | This function returns the lba (logic block address in DATA region) from the <cluster> index. Exit if the cluster value is smaller than 2. |
| | 336 | |
| | 337 | === __unsigned int '''_get_nb_entries'''( fat_inode_t* inode , unsigned int* nb_entries )__ === |
| | 338 | This function returns in the <nb_entries> argument the number of entries contained in a directory identified by the <inode> pointer. It returns 0 on success. It returns 1 on error. |
| | 339 | |
| | 340 | === __unsigned int '''_get_child_from_parent'''( fat_inode_t* parent , char* name , fat_inode_t** inode )__ === |
| | 341 | This function search in the directory identified by the <parent> inode pointer a child (file or directory) identified by its <name>. |
| | 342 | It returns in the <inode> argument the searched child inode pointer. |
| | 343 | If the searched name is not found in the Inode-Tree, the function accesses the File-cache associated to the parent directory. |
| | 344 | If the child exists on block device, the Inode-Tree is updated, and a success code is returned. |
| | 345 | If the file/dir does not exist on block device, a error code is returned. |
| | 346 | It returns 0 if inode found. It returns 1 if inode not found. It returns 2 in case of error in cache access. |
| | 347 | |
| | 348 | === __unsigned int '''_get_inode_from_path'''( char* pathname , fat_inode_t** inode )__ === |
| | 349 | For a file (or a directory) identified by the <pathname> argument, this function returns in the <inode> argument the inode pointer associated to the searched file (or directory), with code (0). |
| | 350 | If the searched file (or directory) is not found, but the parent directory is found, it returns in the <inode> argument the pointer on the parent inode, with code (1). Code (2) and code (3) are error codes. Both the Inode-Tree and the involved Cache-Files are updated from the block device in case of miss on one inode during the search. Neither the Fat-Cache, nor the block device are updated. |
| | 351 | It returns 0 if searched inode found It returns 1 if searched inode not found but parent directory found. It returns 2 if searched inode not found and parent directory not found. It returns 3 if one name too long |
| | 352 | |
| | 353 | === __unsigned int '''_is_ancestor'''( fat_inode_t* a , fat_inode_t* b )__ ===; |
| | 354 | The following function checks if inode <a> is an ancestor of inode <b>. |
| | 355 | It returns 0 on failure. It returns 1 otherwise. |
| | 356 | |
| | 357 | |
| | 358 | |