diff options
Diffstat (limited to 'cpukit/libfs/src/imfs/imfs_debug.c')
-rw-r--r-- | cpukit/libfs/src/imfs/imfs_debug.c | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/cpukit/libfs/src/imfs/imfs_debug.c b/cpukit/libfs/src/imfs/imfs_debug.c new file mode 100644 index 0000000000..0a4e3a9bba --- /dev/null +++ b/cpukit/libfs/src/imfs/imfs_debug.c @@ -0,0 +1,159 @@ +/* + * IMFS debug support routines + * + * COPYRIGHT (c) 1989-1999. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + * + * $Id$ + */ + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +#include <string.h> +#include <fcntl.h> +#include <errno.h> +#include <stdlib.h> +#include <unistd.h> /* for close */ +#include <inttypes.h> + +#include <stdio.h> +#include <sys/stat.h> + +#include "imfs.h" +#include <rtems/libio_.h> + +/* + * IMFS_print_jnode + * + * This routine prints the contents of the specified jnode. + */ +void IMFS_print_jnode( + IMFS_jnode_t *the_jnode +) +{ + IMFS_assert( the_jnode ); + + fprintf(stdout, "%s", the_jnode->name ); + switch( the_jnode->type ) { + case IMFS_DIRECTORY: + fprintf(stdout, "/" ); + break; + + case IMFS_DEVICE: + fprintf(stdout, " (device %" PRId32 ", %" PRId32 ")", + the_jnode->info.device.major, the_jnode->info.device.minor ); + break; + + case IMFS_LINEAR_FILE: + fprintf(stdout, " (file %" PRId32 " %p)", + (uint32_t)the_jnode->info.linearfile.size, + the_jnode->info.linearfile.direct + ); + break; + + case IMFS_MEMORY_FILE: + /* Useful when debugging .. varies between targets */ +#if 0 + fprintf(stdout, " (file %" PRId32 " %p %p %p)", + (uint32_t)the_jnode->info.file.size, + the_jnode->info.file.indirect, + the_jnode->info.file.doubly_indirect, + the_jnode->info.file.triply_indirect + ); +#else + fprintf(stdout, " (file %" PRId32 ")", + (uint32_t)the_jnode->info.file.size ); +#endif + break; + + case IMFS_HARD_LINK: + fprintf(stdout, " links not printed\n" ); + return; + + case IMFS_SYM_LINK: + fprintf(stdout, " links not printed\n" ); + return; + + case IMFS_FIFO: + fprintf(stdout, " FIFO not printed\n" ); + return; + + default: + fprintf(stdout, " bad type %d\n", the_jnode->type ); + return; + } + puts(""); +} + +/* + * IMFS_dump_directory + * + * This routine prints the contents of a directory in the IMFS. If a + * directory is encountered, then this routine will recurse to process + * the subdirectory. + */ +void IMFS_dump_directory( + IMFS_jnode_t *the_directory, + int level +) +{ + rtems_chain_node *the_node; + rtems_chain_control *the_chain; + IMFS_jnode_t *the_jnode; + int i; + + IMFS_assert( the_directory ); + IMFS_assert( level >= 0 ); + IMFS_assert( the_directory->type == IMFS_DIRECTORY ); + + the_chain = &the_directory->info.directory.Entries; + + for ( the_node = rtems_chain_first( the_chain ); + !rtems_chain_is_tail( the_chain, the_node ); + the_node = the_node->next ) { + + the_jnode = (IMFS_jnode_t *) the_node; + + for ( i=0 ; i<=level ; i++ ) + fprintf(stdout, "...." ); + IMFS_print_jnode( the_jnode ); + if ( the_jnode->type == IMFS_DIRECTORY ) + IMFS_dump_directory( the_jnode, level + 1 ); + } +} + +/* + * IMFS_dump + * + * This routine dumps the entire IMFS that is mounted at the root + * directory. + * + * NOTE: Assuming the "/" directory is bad. + * Not checking that the starting directory is in an IMFS is bad. + */ + +void IMFS_dump( void ) +{ + fprintf(stdout, "*************** Dump of Entire IMFS ***************\n" ); + fprintf(stdout, "/\n" ); + IMFS_dump_directory( rtems_filesystem_root.node_access, 0 ); + fprintf(stdout, "*************** End of Dump ***************\n" ); +} + +/* + * IMFS_memfile_maximum_size() + * + * This routine returns the size of the largest file which can be created + * using the IMFS memory file type. + * + */ +int IMFS_memfile_maximum_size( void ) +{ + return IMFS_MEMFILE_MAXIMUM_SIZE; +} |