Added better debugging output, fix a bug converting ASCII to words.
This commit is contained in:
+36
-10
@@ -166,8 +166,8 @@ sub fill_inode {
|
|||||||
$flags |= I_LARGE if ( $size > WORDSPERBLK * I_NUMBLKS );
|
$flags |= I_LARGE if ( $size > WORDSPERBLK * I_NUMBLKS );
|
||||||
$Block[$blocknum][ $offset + I_FLAGS ] = $flags;
|
$Block[$blocknum][ $offset + I_FLAGS ] = $flags;
|
||||||
|
|
||||||
dprintf( "fill inum %d: flags %06o uid %06o size %d\n",
|
dprintf( "Fill inum %d: flags %06o uid %06o size %d => blk %d off %d\n",
|
||||||
$inum, $flags, $uid, $size );
|
$inum, $flags, $uid, $size, $blocknum, $offset );
|
||||||
return ($inum);
|
return ($inum);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -177,6 +177,8 @@ sub fill_inode {
|
|||||||
sub ascii2words {
|
sub ascii2words {
|
||||||
my $str = shift;
|
my $str = shift;
|
||||||
my @words;
|
my @words;
|
||||||
|
# Pad the string to eight characters
|
||||||
|
$str = sprintf( "%-8s", substr( $str, 0, 8 ) );
|
||||||
for ( my $i = 0 ; $i < length($str) ; $i += 2 ) {
|
for ( my $i = 0 ; $i < length($str) ; $i += 2 ) {
|
||||||
my $c1 = substr( $str, $i, 1 ) || "\0";
|
my $c1 = substr( $str, $i, 1 ) || "\0";
|
||||||
my $c2 = substr( $str, $i + 1, 1 ) || "\0";
|
my $c2 = substr( $str, $i + 1, 1 ) || "\0";
|
||||||
@@ -206,35 +208,38 @@ sub add_block_to_inode {
|
|||||||
# directory stack.
|
# directory stack.
|
||||||
sub add_direntry {
|
sub add_direntry {
|
||||||
my ( $name, $inum ) = @_;
|
my ( $name, $inum ) = @_;
|
||||||
dprint("Adding $name inode $inum to current directory\n");
|
|
||||||
|
|
||||||
# Get the block and offset to the next empty slot in the directory
|
# Get the block and offset to the next empty slot in the directory
|
||||||
my $dirref = $Dirstack[-1];
|
my $dirref = $Dirstack[-1];
|
||||||
|
|
||||||
if ( !defined($dirref) ) {
|
if ( !defined($dirref) ) {
|
||||||
|
dprint("Adding $name inode $inum to current directory\n");
|
||||||
dprint("Empty dirstack, we must be building the root dir\n");
|
dprint("Empty dirstack, we must be building the root dir\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
my $blocknum = $dirref->[0];
|
my $blocknum = $dirref->[0];
|
||||||
my $offset = $dirref->[1];
|
my $offset = $dirref->[1];
|
||||||
|
dprint("Adding $name inode $inum to curdir inum $dirref->[2]" .
|
||||||
|
" blk $blocknum off $offset\n");
|
||||||
|
|
||||||
# Convert the name into four words
|
# Convert the name into four words
|
||||||
my @wlist = ascii2words($name);
|
my @wlist = ascii2words($name);
|
||||||
|
|
||||||
# Fill in the directory entry
|
# Fill in the directory entry
|
||||||
$Block[$blocknum][ $offset + D_INUM ] = $inum;
|
$Block[$blocknum][ $offset + D_INUM ] = $inum;
|
||||||
$Block[$blocknum][ $offset + D_NAME ] = pop(@wlist);
|
$Block[$blocknum][ $offset + D_NAME ] = shift(@wlist);
|
||||||
$Block[$blocknum][ $offset + D_NAME + 1 ] = pop(@wlist);
|
$Block[$blocknum][ $offset + D_NAME + 1 ] = shift(@wlist);
|
||||||
$Block[$blocknum][ $offset + D_NAME + 2 ] = pop(@wlist);
|
$Block[$blocknum][ $offset + D_NAME + 2 ] = shift(@wlist);
|
||||||
$Block[$blocknum][ $offset + D_NAME + 3 ] = pop(@wlist);
|
$Block[$blocknum][ $offset + D_NAME + 3 ] = shift(@wlist);
|
||||||
|
|
||||||
# Move up to the next position in the directory.
|
# Move up to the next position in the directory.
|
||||||
$dirref->[1] += D_NUMWORDS;
|
$dirref->[1] += D_NUMWORDS;
|
||||||
|
|
||||||
# If we have filled the directory up, allocate another block to it
|
# If we have filled the directory up, allocate another block to it
|
||||||
if ( $dirref->[1] == WORDSPERBLK ) {
|
if ( $dirref->[1] == WORDSPERBLK ) {
|
||||||
my $nextblock = allocate_blocks(WORDSPERBLK);
|
my ($nextblock) = allocate_blocks(WORDSPERBLK);
|
||||||
|
dprint("Extra block $nextblock for this directory\n");
|
||||||
$dirref->[0] = $nextblock;
|
$dirref->[0] = $nextblock;
|
||||||
$dirref->[1] = 0;
|
$dirref->[1] = 0;
|
||||||
|
|
||||||
@@ -253,7 +258,7 @@ sub make_dir {
|
|||||||
$inum = allocate_inode($inum);
|
$inum = allocate_inode($inum);
|
||||||
|
|
||||||
# Get a block for this directory
|
# Get a block for this directory
|
||||||
my $dirblock = allocate_blocks(WORDSPERBLK);
|
my ($dirblock) = allocate_blocks(WORDSPERBLK);
|
||||||
|
|
||||||
# Add this to the previous directory
|
# Add this to the previous directory
|
||||||
# and fill the i-node with the details
|
# and fill the i-node with the details
|
||||||
@@ -266,7 +271,7 @@ sub make_dir {
|
|||||||
|
|
||||||
# Add a "dd" entry to this directory
|
# Add a "dd" entry to this directory
|
||||||
add_direntry( "dd", DD_INUM );
|
add_direntry( "dd", DD_INUM );
|
||||||
dprintf( "Made directory %s perms %06o uid %d in i-node %d\n\n",
|
dprintf( "Made directory %s perms %06o uid %d in inum %d\n\n",
|
||||||
$dirname, $perms, $uid, $inum );
|
$dirname, $perms, $uid, $inum );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -410,6 +415,7 @@ sub parse_proto_file {
|
|||||||
# If the first word is a $, then pop a directory from the stack
|
# If the first word is a $, then pop a directory from the stack
|
||||||
if ( $words[0] eq '$' ) {
|
if ( $words[0] eq '$' ) {
|
||||||
pop(@Dirstack);
|
pop(@Dirstack);
|
||||||
|
dprint("Popping back a directory in the dirstack\n\n");
|
||||||
next;
|
next;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -435,6 +441,18 @@ sub parse_proto_file {
|
|||||||
close($IN);
|
close($IN);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Convert an 18-bit word into two ASCII characters and return them.
|
||||||
|
# Don't return NUL characters
|
||||||
|
sub word2ascii {
|
||||||
|
my $word = shift;
|
||||||
|
my $c1 = ( $word >> 9 ) & 0177;
|
||||||
|
my $c2 = $word & 0177;
|
||||||
|
my $result = "";
|
||||||
|
$result .= (($c1 >= 32) && ($c1 <= 126)) ? chr($c1) : ' ';
|
||||||
|
$result .= (($c2 >= 32) && ($c2 <= 126)) ? chr($c2) : ' ';
|
||||||
|
return ($result);
|
||||||
|
}
|
||||||
|
|
||||||
# Convert an 18-bit word into a scalar which has three sixbit
|
# Convert an 18-bit word into a scalar which has three sixbit
|
||||||
# values in three bytes. Set the msb in the first byte
|
# values in three bytes. Set the msb in the first byte
|
||||||
sub word2three {
|
sub word2three {
|
||||||
@@ -456,11 +474,19 @@ sub dump_image {
|
|||||||
foreach my $blocknum ( 0 .. NUMBLOCKS - 1 ) {
|
foreach my $blocknum ( 0 .. NUMBLOCKS - 1 ) {
|
||||||
printf( $OUT "Block %d (%06o)\n", $blocknum, $blocknum );
|
printf( $OUT "Block %d (%06o)\n", $blocknum, $blocknum );
|
||||||
foreach my $line ( 0 .. 7 ) {
|
foreach my $line ( 0 .. 7 ) {
|
||||||
|
|
||||||
|
# Print out the words in octal
|
||||||
foreach my $offset ( 0 .. 7 ) {
|
foreach my $offset ( 0 .. 7 ) {
|
||||||
printf( $OUT "%06o ",
|
printf( $OUT "%06o ",
|
||||||
$Block[$blocknum][ 8 * $line + $offset ] || 0
|
$Block[$blocknum][ 8 * $line + $offset ] || 0
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Now print out the ASCII characters in the word
|
||||||
|
foreach my $offset ( 0 .. 7 ) {
|
||||||
|
print( $OUT word2ascii(
|
||||||
|
$Block[$blocknum][ 8 * $line + $offset ] || 0));
|
||||||
|
}
|
||||||
print( $OUT "\n" );
|
print( $OUT "\n" );
|
||||||
}
|
}
|
||||||
print( $OUT "\n" );
|
print( $OUT "\n" );
|
||||||
|
|||||||
Reference in New Issue
Block a user