Cover V01, I02
Article
Figure 1
Figure 2
Figure 3
Figure 4
Listing 1
Listing 2
Listing 3
Listing 4
Listing 5
Listing 6
Listing 7
Table 1
Table 2

jul92.tar


Listing 6

/*
@(#) sb.c - dump the contents of the superblock in a meaningful
format
Copyright 1990, Chris Hare

To compile for Motorola VME UNIX Systems, (R3V4 or later)
cc -o sb -DMCS sb.c

To Compile for SCO XENIX Systems (286)
cc -o sb -DXENIX sb.c

To Compile for SCO XENIX Systems (386)
cc -o sb -DXENIX sb.c

To Compile for SCO UNIX Systems (386)
cc -o sb -DXENIX sb.c

*/
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#ifdef MCS                       /* Motorola VME UNIX Systems */
#   include <sys/fs/s5param.h>
#   include <sys/fs/s5filsys.h>
#endif
#ifdef XENIX
#   include <sys/param.h>
#   include <sys/filsys.h>
#endif
#include <sys/stat.h>
#include <string.h>
#include <memory.h>
#include <errno.h>
#include <time.h>

#define LONG_ZERO (long)0

extern int errno;                  /* system call error value */
extern int sys_err;                /* system call error value */
extern char *sys_errlist[];        /* error list for perror() */

main( argc, argv )
int argc;
char *argv[];
{
int ReturnCode = 0,        /* function call return code */
FileDescriptor,            /* device file descriptor */
LoopCounter ,              /* LoopCounter  counter */
LoopCounter2;              /* LoopCounter  counter */

char *ctime(),             /* declare ctime(S) */
*timestr;                  /* storage area for time string */
long int SeekReturnCode,   /* long function call return code */
time();                    /* declare time(S) */
struct stat StatBuf;       /* stat(S) structore for getting file type */
struct filsys FsBuf;       /* filesys (superblock) structure */

/* check to see that we have enough arguements */
if ( argc < 2 )
usage( argv[0] );

/* get the mode of the file */
ReturnCode = stat( argv[1], &StatBuf );

/* check for block special type */
if ( ( StatBuf.st_mode & S_IFMT ) != ( S_IFBLK ) )
{
fprintf( stderr, "%s: not a block device\n", argv[1] );
usage( argv[0] );
}

/* open the device file */
FileDescriptor = open( argv[1], O_RDONLY );
if ( FileDescriptor < 0 )
{
/* failures here will most likely be :
no permission to open device
*/
perror( argv[0] );
exit(2);
}

/* make sure that we are at byte 0 in the device */
SeekReturnCode = lseek( FileDescriptor, (long)0, 0 );
if ( SeekReturnCode < LONG_ZERO )
{
fprintf( stderr, "%s : Can't seek to byte 0\n", argv[0] );
perror( argv[0] );
exit(3);
}
/* Seek past the boot block to the superblock */
SeekReturnCode = lseek( FileDescriptor, (long)BSIZE, 1 );
if ( SeekReturnCode < LONG_ZERO )
{
fprintf( stderr, "%s : Can't seek to byte %d\n", argv[0], BSIZE);
perror( argv[0] );
exit(3);
}

/* Read the superblock */
ReturnCode = read( FileDescriptor, &FsBuf, BSIZE );
if ( ReturnCode < 0 )
{
perror( argv[0] );
exit(5);
}

/* Lets change the last modified time to something meaningful */
timestr = ctime(&FsBuf.s_time);

/* Lets have a look at what is in the superblock */
/* and print the most useful stuff */
printf( "Superblock dump for file system Name : %s\n", FsBuf.s_fname);
printf( "Superblock dump for file system pack : %s\n", FsBuf.s_fpack);
printf( "File System Block Size               : %d\n", FsBuf.s_type
* 512 );
if ( FsBuf.s_type == 1 ) /* 512 byte blocks */
{
printf( "Size of i-list in blocks ( 512 byte) : %d\n",
FsBuf.s_isize );
printf( "Size of Entire Volume    ( 512 byte) : %ld\n",
FsBuf.s_fsize );
printf( "Total Free Blocks        ( 512 byte) : %d\n",
FsBuf.s_tfree );
}
if ( FsBuf.s_type == 2 ) /* 1024 byte blocks */

{
printf( "Size of i-list in blocks (1024 byte) : %d\n",
FsBuf.s_isize );
printf( "Size of Entire Volume    (1024 byte) : %ld\n",
FsBuf.s_fsize );
printf( "Total Free Blocks        (1024 byte) : %d\n",
FsBuf.s_tfree );
}
printf( "Total Free Inodes                    : %d\n",
FsBuf.s_tinode);

/* Modify the report based upon the s_fmod status */
if ( FsBuf.s_fmod == NULL )
printf( "Has the super block been modified?   : No\n" );
else
printf( "Has the super block been modified?   : Yes\n" );

/* Modify the report based upon the s_ronly status */
if ( FsBuf.s_ronly == NULL )
printf( "Is the file system mounted read-only : No\n" );
else
printf( "Is the file system mounted read-only : Yes\n" );

printf( "Last super block update at           : %s\n", timestr );

/* Print the free block list */
printf( "\nNo of Addresses in free block list   : %d  Maximum : %d\n",
FsBuf.s_nfree, NICFREE );
printf( "Current Free block list reads        :\n" );
for ( LoopCounter  = 0; LoopCounter  < FsBuf.s_nfree; LoopCounter +=5)
{
for ( LoopCounter2 = LoopCounter; LoopCounter2 < LoopCounter +5;
LoopCounter2++ )
{
if ( LoopCounter2 >= FsBuf.s_nfree )
break;
printf( "a%02d:%10ld ",LoopCounter2,
FsBuf.s_free[LoopCounter2]);
}
printf( "\n");
}

/* print the free inode list */
printf( "\nNo of inodes in free inode list      : %d  Maximum : %d\n",
FsBuf.s_ninode, NICINOD );
printf( "Current Free Inode list reads        :\n" );
for ( LoopCounter  = 0; LoopCounter  < FsBuf.s_ninode; LoopCounter +=4 )
{
for ( LoopCounter2 = LoopCounter ; LoopCounter2 < LoopCounter +4;
LoopCounter2++ )
{
if ( LoopCounter2 >= FsBuf.s_ninode )
break;
printf( "i%03d:%10u ",LoopCounter2,
FsBuf.s_inode[LoopCounter2]
);
}
printf( "\n");
}

/* Close the filesystem device file */
ReturnCode = close( FileDescriptor );
if ( ReturnCode < 0 )
{
perror( argv[0] );
exit(7);
}

printf( "\n");
exit (0);
}

int usage( cmd )
char *cmd;
{
printf( "%s usage : %s block_filesystem_device \n", cmd, cmd );
exit (1);
}