blob: 856f21317e5217fda8da5121b29bf3626df3cc21 (
plain) (
tree)
|
|
/*
* IMFS debug support routines
*
* COPYRIGHT (c) 1989-1998.
* On-Line Applications Research Corporation (OAR).
* Copyright assigned to U.S. Government, 1994.
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.OARcorp.com/rtems/license.html.
*
* $Id$
*/
#include <assert.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h> /* for close */
#include <stdio.h>
#include <sys/stat.h>
#include "imfs.h"
#include "libio_.h"
/*
* IMFS_types
*
* Printable names for each of the IMFS file system types.
*/
char *IMFS_types[ IMFS_NUMBER_OF_TYPES ] = {
"directory",
"device",
"link",
"memory file"
};
/*
* IMFS_print_jnode
*
* This routine prints the contents of the specified jnode.
*/
void IMFS_print_jnode(
IMFS_jnode_t *the_jnode
)
{
assert( the_jnode );
printf( "%s", the_jnode->name );
switch( the_jnode->type ) {
case IMFS_DIRECTORY:
printf( "/" );
break;
case IMFS_DEVICE:
printf( " (device %d, %d)",
the_jnode->info.device.major, the_jnode->info.device.minor );
break;
case IMFS_MEMORY_FILE:
printf( " (file %d %p %p %p)",
(int)the_jnode->info.file.size,
the_jnode->info.file.indirect,
the_jnode->info.file.doubly_indirect,
the_jnode->info.file.triply_indirect
);
break;
case IMFS_HARD_LINK:
printf( " links not printed\n" );
assert(0);
break;
case IMFS_SYM_LINK:
printf( " links not printed\n" );
assert(0);
break;
default:
printf( " bad type %d\n", the_jnode->type );
assert(0);
break;
}
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
)
{
Chain_Node *the_node;
Chain_Control *the_chain;
IMFS_jnode_t *the_jnode;
int i;
assert( the_directory );
assert( level >= 0 );
assert( the_directory->type == IMFS_DIRECTORY );
the_chain = &the_directory->info.directory.Entries;
for ( the_node = the_chain->first;
!_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++ )
printf( " " );
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 )
{
printf( "*************** Dump of Entire IMFS ***************\n" );
printf( "/\n" );
IMFS_dump_directory( rtems_filesystem_root.node_access, 0 );
printf( "*************** 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;
}
|