summaryrefslogblamecommitdiffstats
path: root/c/src/lib/libc/imfs_debug.c
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;
}