1 /****************************************************************/
5 /* Displaying information from the "Disk editor". */
7 /****************************************************************/
8 /* origination 1989-Jan-15 Terrence W. Holm */
9 /****************************************************************/
12 #include <minix/config.h>
13 #include <sys/types.h>
26 #include <minix/const.h>
27 #include <minix/type.h>
28 #include "../../servers/mfs/const.h"
29 #include "../../servers/mfs/type.h"
30 #include "../../servers/mfs/inode.h"
31 #include <minix/fslib.h>
36 #define major(x) ( (x>>8) & 0377)
37 #define minor(x) (x & 0377)
40 /****************************************************************/
41 /* Code for handling termcap */
42 /****************************************************************/
45 #define TC_BUFFER 1024 /* Size of termcap(3) buffer */
46 #define TC_STRINGS 200 /* Enough room for cm,cl,so,se */
49 static char *Tmove
; /* (cm) - Format for tgoto */
50 static char *Tclr_all
; /* (cl) - Clear screen */
51 static char *Treverse
; /* (so) - Start reverse mode */
52 static char *Tnormal
; /* (se) - End reverse mode */
54 char Kup
= 0; /* (ku) - Up arrow key */
55 char Kdown
= 0; /* (kd) - Down arrow key */
56 char Kleft
= 0; /* (kl) - Left arrow key */
57 char Kright
= 0; /* (kr) - Right arrow key */
59 _PROTOTYPE(void Goto
, (int column
, int line
));
60 _PROTOTYPE(void Block_Type
, (de_state
*s
));
61 _PROTOTYPE(void Draw_Words
, (de_state
*s
));
62 _PROTOTYPE(void Draw_Info
, (de_state
*s
));
63 _PROTOTYPE(void Draw_Block
, (char *block
));
64 _PROTOTYPE(void Draw_Map
, (char *block
, int max_bits
));
65 _PROTOTYPE(void Draw_Offset
, (de_state
*s
));
66 _PROTOTYPE(void Word_Pointers
, (off_t old_addr
, off_t new_addr
));
67 _PROTOTYPE(void Block_Pointers
, (off_t old_addr
, off_t new_addr
));
68 _PROTOTYPE(void Map_Pointers
, (off_t old_addr
, off_t new_addr
));
69 _PROTOTYPE(void Print_Number
, (Word_t number
, int output_base
));
70 _PROTOTYPE(void Draw_Zone_Numbers
, (de_state
*s
, struct inode
*inode
,
71 int zindex
, int zrow
));
75 /****************************************************************/
79 /* Initializes the external variables for the */
80 /* current terminal. */
82 /****************************************************************/
89 char buffer
[ TC_BUFFER
];
90 static char strings
[ TC_STRINGS
];
91 char *s
= &strings
[0];
95 term
= getenv( "TERM" );
100 if ( tgetent( buffer
, term
) != 1 )
104 if ( (Tmove
= tgetstr( "cm", &s
)) == NULL
)
107 if ( (Tclr_all
= tgetstr( "cl", &s
)) == NULL
)
110 if ( (Treverse
= tgetstr( "so", &s
)) == NULL
)
112 Treverse
= Tnormal
= s
;
116 else if ( (Tnormal
= tgetstr( "se", &s
)) == NULL
)
120 /* See if there are single character arrow key codes */
122 if ( (Kcode
= tgetstr( "ku", &s
)) != NULL
&& strlen( Kcode
) == 1 )
125 if ( (Kcode
= tgetstr( "kd", &s
)) != NULL
&& strlen( Kcode
) == 1 )
128 if ( (Kcode
= tgetstr( "kl", &s
)) != NULL
&& strlen( Kcode
) == 1 )
131 if ( (Kcode
= tgetstr( "kr", &s
)) != NULL
&& strlen( Kcode
) == 1 )
143 /****************************************************************/
145 /* Goto( column, line ) */
147 /* Use the termcap string to move the cursor. */
149 /****************************************************************/
152 void Goto( column
, line
)
157 fputs( tgoto( Tmove
, column
, line
), stdout
);
165 /****************************************************************/
166 /* Output routines */
167 /****************************************************************/
172 /****************************************************************/
174 /* Draw_Help_Screen() */
176 /****************************************************************/
179 void Draw_Help_Screen( s
)
188 case WORD
: down
= 2; right
= 32; break;
189 case BLOCK
: down
= 64; right
= 1; break;
190 case MAP
: down
= 256; right
= 4; break;
193 printf( "%s ", Tclr_all
);
194 printf( "%sDE COMMANDS%s\r\n\n\n", Treverse
, Tnormal
);
197 printf( " PGUP b Back one block h Help\r\n" );
198 printf( " PGDN f Forward one block q Quit\r\n" );
199 printf( " HOME B Goto first block m Minix shell\r\n" );
200 printf( " END F Goto last block\r\n" );
201 printf( " v Visual mode (w b m)\r\n" );
202 printf( " g Goto specified block o Output base (h d o b)\r\n" );
203 printf( " G Goto block indirectly\r\n" );
204 printf( " i Goto i-node c Change file name\r\n" );
205 printf( " I Filename to i-node w Write ASCII block\r\n" );
206 printf( " W Write block exactly\r\n" );
207 printf( " / Search\r\n" );
208 printf( " n Next occurrence x Extract lost entry\r\n" );
209 printf( " p Previous address X Extract lost blocks\r\n" );
210 printf( " s Store word\r\n" );
211 printf( " UP u Move back %d bytes\r\n", down
);
212 printf( " DOWN d Move forward %d bytes\r\n", down
);
213 printf( " LEFT l Move back %d byte%s\r\n", right
,
214 right
== 1 ? "" : "s" );
215 printf( " RIGHT r Move forward %d byte%s\r\n\n\n", right
,
216 right
== 1 ? "" : "s" );
224 /****************************************************************/
228 /* The user must press a key to continue. */
230 /****************************************************************/
236 Draw_Prompt( "Press a key to continue..." );
246 /****************************************************************/
248 /* Draw_Prompt( string ) */
250 /* Write a message in the "prompt" area. */
252 /****************************************************************/
255 void Draw_Prompt( string
)
259 Goto( PROMPT_COLUMN
, PROMPT_LINE
);
261 printf( "%s%s%s ", Treverse
, string
, Tnormal
);
269 /****************************************************************/
273 /* Erase the message in the "prompt" area. */
275 /****************************************************************/
281 Goto( PROMPT_COLUMN
, PROMPT_LINE
);
283 printf( "%77c", ' ' );
285 Goto( PROMPT_COLUMN
, PROMPT_LINE
);
293 /****************************************************************/
295 /* Draw_Screen( state ) */
297 /* Redraw everything, except pointers. */
299 /****************************************************************/
302 void Draw_Screen( s
)
306 fputs( Tclr_all
, stdout
);
313 case WORD
: Draw_Words( s
);
317 case BLOCK
: Draw_Block( s
->buffer
);
321 int max_bits
= 2 * K
;
323 /* Don't display the bits after the end */
324 /* of the i-node or zone bit maps. */
326 if ( s
->block
== 2 + s
->inode_maps
- 1 )
329 - CHAR_BIT
* K
* (ino_t
) (s
->inode_maps
- 1)
330 - CHAR_BIT
* (ino_t
) (s
->offset
& ~ MAP_MASK
));
332 else if ( s
->block
== 2 + s
->inode_maps
+ s
->zone_maps
- 1 )
335 - CHAR_BIT
* K
* (zone_t
) (s
->zone_maps
- 1)
336 - CHAR_BIT
* (zone_t
) (s
->offset
& ~ MAP_MASK
));
341 Draw_Map( &s
->buffer
[ s
->offset
& ~ MAP_MASK
], max_bits
);
352 /****************************************************************/
354 /* Draw_Strings( state ) */
356 /* The first status line contains the device name, */
357 /* the current write file name (if one is open) */
358 /* and the current search string (if one has */
361 /* Long strings are truncated. */
363 /****************************************************************/
366 void Draw_Strings( s
)
373 Goto( STATUS_COLUMN
, STATUS_LINE
);
375 printf( "Device %s= %-14.14s ",
376 s
->device_mode
== O_RDONLY
? "" : "(w) ", s
->device_name
);
380 case SUPER_MAGIC
: printf( "V1 file system ");
382 case SUPER_REV
: printf( "V1-bytes-swapped file system (?) ");
384 case SUPER_V2
: printf( "V2 file system ");
386 case SUPER_V2_REV
: printf( "V2-bytes-swapped file system (?) ");
388 case SUPER_V3
: printf( "V3 file system ");
390 default : printf( "not a Minix file system ");
394 len
= strlen( s
->file_name
);
397 printf( "%29s", " " );
398 else if ( len
<= 20 )
399 printf( "File = %-20s ", s
->file_name
);
401 printf( "File = ...%17.17s ", s
->file_name
+ len
- 17 );
404 len
= strlen( s
->search_string
);
407 printf( "%20s", " " );
410 printf( "Search = " );
414 for ( i
= 0; i
< len
; ++i
)
415 Print_Ascii( s
->search_string
[ i
] );
417 for ( ; i
< 11; ++i
)
422 for ( i
= 0; i
< 8; ++i
)
423 Print_Ascii( s
->search_string
[ i
] );
435 /****************************************************************/
437 /* Block_Type( state ) */
439 /* Display the current block type. */
441 /****************************************************************/
448 Goto( STATUS_COLUMN
, STATUS_LINE
+ 1 );
450 printf( "Block = %5u of %-5u ", s
->block
, s
->zones
);
455 if ( s
->block
== BOOT_BLOCK
)
456 printf( "Boot block" );
458 else if ( s
->block
== 1 )
459 printf( "Super block" );
461 else if ( s
->block
< 2 + s
->inode_maps
)
462 printf( "I-node bit map" );
464 else if ( s
->block
< 2 + s
->inode_maps
+ s
->zone_maps
)
465 printf( "Zone bit map" );
467 else if ( s
->block
< s
->first_data
)
471 printf( "Data block (%sin use)",
472 In_Use( (bit_t
) (s
->block
- (s
->first_data
- 1)), s
->zone_map
)
481 /****************************************************************/
483 /* Draw_Words( state ) */
485 /* Draw a page in word format. */
487 /****************************************************************/
495 int addr
= s
->offset
& ~ PAGE_MASK
;
498 for ( line
= 0; line
< 16; ++line
, addr
+= 2 )
500 Goto( BLOCK_COLUMN
, BLOCK_LINE
+ line
);
502 printf( "%5d ", addr
);
504 Print_Number( *( (word_t
*) &s
->buffer
[ addr
] ), s
->output_base
);
507 Goto( BLOCK_COLUMN
+ 64, BLOCK_LINE
);
508 printf( "(base %d)", s
->output_base
);
516 /****************************************************************/
518 /* Draw_Info( state ) */
520 /* Add information to a page drawn in word format. */
521 /* The routine recognizes the super block, inodes, */
522 /* executables and "ar" archives. If the current */
523 /* page is not one of these, then ASCII characters */
524 /* are printed from the data words. */
526 /****************************************************************/
529 char *super_block_info
[] = { "number of inodes",
530 "V1 number of zones",
531 "inode bit map blocks",
532 "zone bit map blocks",
534 "blocks per zone shift & flags",
539 "V2 number of zones" };
547 int page
= s
->offset
>> PAGE_SHIFT
;
551 if ( s
->is_fs
&& s
->block
== 1 && page
== 0 )
552 for ( i
= 0; i
< 11; ++i
)
554 Goto( INFO_COLUMN
, INFO_LINE
+ i
);
555 printf( "%s", super_block_info
[ i
] );
558 else if ( s
->is_fs
&& s
->block
>= s
->first_data
- s
->inode_blocks
&&
559 s
->block
< s
->first_data
)
561 struct inode core_inode
;
564 struct inode
*inode
= &core_inode
;
570 dip1
= (d1_inode
*) &s
->buffer
[ s
->offset
& ~ PAGE_MASK
];
571 dip2
= (d2_inode
*) &s
->buffer
[ s
->offset
& ~ PAGE_MASK
572 & ~ (V2_INODE_SIZE
-1) ];
573 conv_inode( inode
, dip1
, dip2
, READING
, s
->magic
);
575 user
= getpwuid( inode
->i_uid
);
576 grp
= getgrgid( inode
->i_gid
);
578 if ( s
->magic
!= SUPER_MAGIC
&& page
& 1 )
580 Draw_Zone_Numbers( s
, inode
, 2, 0 );
584 Goto( INFO_COLUMN
, INFO_LINE
);
586 switch( inode
->i_mode
& S_IFMT
)
588 case S_IFDIR
: printf( "directory " );
591 case S_IFCHR
: printf( "character " );
595 case S_IFBLK
: printf( "block " );
599 case S_IFREG
: printf( "regular " );
602 case S_IFIFO
: printf( "fifo " );
606 case S_IFLNK
: printf( "symlink " );
610 case S_IFSOCK
: printf( "socket " );
613 default : printf( "unknown " );
616 for ( m
= 11; m
>= 0; --m
)
617 putchar( (inode
->i_mode
& (1<<m
)) ? "xwrxwrxwrtgu"[m
] : '-' );
619 if ( s
->magic
== SUPER_MAGIC
)
622 Goto( INFO_COLUMN
, INFO_LINE
+ 1 );
623 printf( "user %s", user
? user
->pw_name
: "" );
625 Goto( INFO_COLUMN
, INFO_LINE
+ 2 );
626 printf( "file size %lu", inode
->i_size
);
628 Goto( INFO_COLUMN
, INFO_LINE
+ 4 );
629 printf( "m_time %s", ctime( &inode
->i_mtime
) );
631 Goto( INFO_COLUMN
, INFO_LINE
+ 6 );
632 printf( "links %d, group %s",
633 inode
->i_nlinks
, grp
? grp
->gr_name
: "" );
635 Draw_Zone_Numbers( s
, inode
, 0, 7 );
639 /* V2 file system, even page. */
640 Goto( INFO_COLUMN
, INFO_LINE
+ 1 );
641 printf( "links %d ", inode
->i_nlinks
);
643 Goto( INFO_COLUMN
, INFO_LINE
+ 2 );
644 printf( "user %s", user
? user
->pw_name
: "" );
646 Goto( INFO_COLUMN
, INFO_LINE
+ 3 );
647 printf( "group %s", grp
? grp
->gr_name
: "" );
649 Goto( INFO_COLUMN
, INFO_LINE
+ 4 );
650 printf( "file size %lu", inode
->i_size
);
652 Goto( INFO_COLUMN
, INFO_LINE
+ 6 );
653 printf( "a_time %s", ctime( &inode
->i_atime
) );
655 Goto( INFO_COLUMN
, INFO_LINE
+ 8 );
656 printf( "m_time %s", ctime( &inode
->i_mtime
) );
658 Goto( INFO_COLUMN
, INFO_LINE
+ 10 );
659 printf( "c_time %s", ctime( &inode
->i_ctime
) );
661 Draw_Zone_Numbers( s
, inode
, 0, 12 );
666 Goto( INFO_COLUMN
, INFO_LINE
+ 7 );
667 dev
= (dev_t
) inode
->i_zone
[0];
668 printf( "major %d, minor %d", major(dev
), minor(dev
) );
672 else /* Print ASCII characters for each byte in page */
674 char *p
= &s
->buffer
[ s
->offset
& ~ PAGE_MASK
];
676 for ( i
= 0; i
< 16; ++i
)
678 Goto( INFO_COLUMN
, INFO_LINE
+ i
);
683 if ( s
->block
>= s
->first_data
&& page
== 0 )
685 unsigned magic
= ((s
->buffer
[1] & 0xff) << 8) | (s
->buffer
[0] & 0xff);
686 unsigned second
= ((s
->buffer
[3] & 0xff) << 8) | (s
->buffer
[2] & 0xff);
688 /* Is this block the start of an executable file? */
690 if ( magic
== (unsigned) A_OUT
)
692 Goto( INFO_COLUMN
, INFO_LINE
);
693 printf( "executable" );
695 Goto( INFO_COLUMN
, INFO_LINE
+ 1 );
697 if ( second
== (unsigned) SPLIT
)
698 printf( "separate I & D" );
700 printf( "combined I & D" );
711 /****************************************************************/
713 /* Draw_Block( block ) */
715 /* Redraw a 1k block in character format. */
717 /****************************************************************/
720 void Draw_Block( block
)
730 for ( line
= 0; line
< 16; ++line
)
732 Goto( BLOCK_COLUMN
, BLOCK_LINE
+ line
);
734 for ( column
= 0; column
< 64; ++column
)
744 if ( c
>= ' ' && c
< DEL
)
747 { fputs( Tnormal
, stdout
); reverse
= 0; }
754 { fputs( Treverse
, stdout
); reverse
= 1; }
756 putchar( c
== DEL
? '?' : '@' + c
);
758 } /* end for ( column ) */
759 } /* end for ( line ) */
762 { fputs( Tnormal
, stdout
); reverse
= 0; }
766 Goto( BLOCK_COLUMN
+ 68, BLOCK_LINE
+ 6 );
767 fputs( "(MSB)", stdout
);
776 /****************************************************************/
778 /* Draw_Map( block, max_bits ) */
780 /* Redraw a block in a bit map format. */
781 /* Display min( max_bits, 2048 ) bits. */
783 /* The 256 bytes in "block" are displayed from */
784 /* top to bottom and left to right. Bit 0 of */
785 /* a byte is towards the top of the screen. */
787 /* Special graphic codes are used to generate */
788 /* two "bits" per character position. So a 16 */
789 /* line by 64 column display is 32 "bits" by */
790 /* 64 "bits". Or 4 bytes by 64 bytes. */
792 /****************************************************************/
795 void Draw_Map( block
, max_bits
)
804 for ( line
= 0; line
< 16; ++line
)
806 char *p
= &block
[ (line
& 0xC) >> 2 ];
807 int shift
= (line
& 0x3) << 1;
809 Goto( BLOCK_COLUMN
, BLOCK_LINE
+ line
);
811 for ( column
= 0; column
< 64; ++column
, p
+= 4 )
813 char c
= (*p
>> shift
) & 0x3;
814 int current_bit
= ((p
- block
) << 3) + shift
;
816 /* Don't display bits past "max_bits" */
818 if ( current_bit
>= max_bits
)
821 /* If "max_bits" occurs in between the two bits */
822 /* I am trying to display as one character, then */
823 /* zero off the high-order bit. */
825 if ( current_bit
+ 1 == max_bits
)
830 case 0 : putchar( BOX_CLR
);
833 case 1 : putchar( BOX_TOP
);
837 case 2 : putchar( BOX_BOT
);
841 case 3 : putchar( BOX_ALL
);
845 } /* end for ( column ) */
846 } /* end for ( line ) */
849 Goto( BLOCK_COLUMN
+ 68, BLOCK_LINE
+ 6 );
850 printf( "(%d)", bit_count
);
858 /****************************************************************/
860 /* Draw_Pointers( state ) */
862 /* Redraw the pointers and the offset field. */
863 /* The rest of the screen stays intact. */
865 /****************************************************************/
868 void Draw_Pointers( s
)
876 case WORD
: Word_Pointers( s
->last_addr
, s
->address
);
879 case BLOCK
: Block_Pointers( s
->last_addr
, s
->address
);
882 case MAP
: Map_Pointers( s
->last_addr
, s
->address
);
886 Goto( PROMPT_COLUMN
, PROMPT_LINE
);
894 /****************************************************************/
896 /* Draw_Offset( state ) */
898 /* Display the offset in the current buffer */
899 /* and the relative position if within a map */
900 /* or i-node block. */
902 /****************************************************************/
905 void Draw_Offset( s
)
909 Goto( STATUS_COLUMN
, STATUS_LINE
+ 2 );
911 printf( "Offset = %5d ", s
->offset
);
917 if ( s
->block
< 2 + s
->inode_maps
)
919 long bit
= (s
->address
- 2 * K
) * 8;
921 if ( bit
< s
->inodes_in_map
)
922 printf( "I-node %ld of %d ", bit
, s
->inodes
);
924 printf( "(padding) " );
927 else if ( s
->block
< 2 + s
->inode_maps
+ s
->zone_maps
)
929 long bit
= (s
->address
- (2 + s
->inode_maps
) * K
) * 8;
931 if ( bit
< s
->zones_in_map
)
932 printf( "Block %ld of %u ", bit
+ s
->first_data
- 1, s
->zones
);
934 printf( "(padding) " );
937 else if ( s
->block
< s
->first_data
)
939 bit_t node
= (s
->address
- (2 + s
->inode_maps
+ s
->zone_maps
) * K
) /
942 if ( node
<= s
->inodes
)
943 printf( "I-node %lu of %lu (%sin use) ",
944 (unsigned long) node
, (unsigned long) s
->inodes
,
945 In_Use( node
, s
->inode_map
) ? "" : "not " );
947 printf( "(padding) " );
956 /****************************************************************/
958 /* Word_Pointers( old_addr, new_addr ) */
960 /* Block_Pointers( old_addr, new_addr ) */
962 /* Map_Pointers( old_addr, new_addr ) */
964 /* Redraw the index pointers for a each type */
965 /* of display. The pointer at "old_addr" is */
966 /* erased and a new pointer is positioned */
967 /* for "new_addr". This makes the screen */
968 /* update faster and more pleasant for the user. */
970 /****************************************************************/
973 void Word_Pointers( old_addr
, new_addr
)
978 int from
= ( (int) old_addr
& PAGE_MASK
) >> 1;
979 int to
= ( (int) new_addr
& PAGE_MASK
) >> 1;
981 Goto( BLOCK_COLUMN
- 2, BLOCK_LINE
+ from
);
984 Goto( BLOCK_COLUMN
- 2, BLOCK_LINE
+ to
);
991 void Block_Pointers( old_addr
, new_addr
)
996 int from
= (int) old_addr
& ~K_MASK
;
997 int to
= (int) new_addr
& ~K_MASK
;
999 Goto( BLOCK_COLUMN
- 2, BLOCK_LINE
+ from
/ 64 );
1002 Goto( BLOCK_COLUMN
- 2, BLOCK_LINE
+ to
/ 64 );
1005 Goto( BLOCK_COLUMN
+ from
% 64, BLOCK_LINE
+ 17 );
1008 Goto( BLOCK_COLUMN
+ to
% 64, BLOCK_LINE
+ 17 );
1015 void Map_Pointers( old_addr
, new_addr
)
1020 int from
= ( (int) old_addr
& MAP_MASK
) >> 2;
1021 int to
= ( (int) new_addr
& MAP_MASK
) >> 2;
1023 Goto( BLOCK_COLUMN
+ from
, BLOCK_LINE
+ 17 );
1026 Goto( BLOCK_COLUMN
+ to
, BLOCK_LINE
+ 17 );
1035 /****************************************************************/
1037 /* Print_Number( number, output_base ) */
1039 /* Output "number" in the output base. */
1041 /****************************************************************/
1044 void Print_Number( number
, output_base
)
1049 switch ( output_base
)
1051 case 16 : printf( "%5x", number
);
1054 case 10 : printf( "%7u", number
);
1057 case 8 : printf( "%7o", number
);
1064 for ( mask
= 0x8000; mask
> 1; mask
>>= 1 )
1065 putchar( (mask
& number
) ? (pad
= '0', '1') : pad
);
1067 putchar( (0x01 & number
) ? '1' : '0' );
1072 default : Error( "Internal fault (output_base)" );
1081 /****************************************************************/
1083 /* Print_Ascii( char ) */
1085 /* Display a character in reverse mode if it */
1086 /* is not a normal printable ASCII character. */
1088 /****************************************************************/
1091 void Print_Ascii( c
)
1098 printf( "%s%c%s", Treverse
, '@' + c
, Tnormal
);
1099 else if ( c
== DEL
)
1100 printf( "%s?%s", Treverse
, Tnormal
);
1110 /****************************************************************/
1112 /* Warning( text, arg1, arg2 ) */
1114 /* Display a message for 2 seconds. */
1116 /****************************************************************/
1120 void Warning( const char *text
, ... )
1122 void Warning( text
)
1129 printf( "%c%s", BELL
, Tclr_all
);
1131 Goto( WARNING_COLUMN
, WARNING_LINE
);
1133 printf( "%s Warning: ", Treverse
);
1134 va_start( argp
, text
);
1135 vprintf( text
, argp
);
1137 printf( " %s", Tnormal
);
1139 fflush(stdout
); /* why does everyone forget this? */
1145 void Draw_Zone_Numbers( s
, inode
, zindex
, zrow
)
1147 struct inode
*inode
;
1152 static char *plurals
[] = { "", "double ", "triple " };
1156 ++zindex
, zrow
+= s
->zone_num_size
/ sizeof (word_t
) )
1158 Goto( INFO_COLUMN
, INFO_LINE
+ zrow
);
1159 if ( zindex
< s
->ndzones
)
1160 printf( "zone %d", zindex
);
1162 printf( "%sindirect", plurals
[ zindex
- s
->ndzones
] );
1163 if ( s
->magic
!= SUPER_MAGIC
)
1165 zone
= inode
->i_zone
[ zindex
];
1166 if ( zone
!= (word_t
) zone
)
1168 Goto( INFO_COLUMN
+ 16, INFO_LINE
+ zrow
);
1169 printf("%ld", (long) zone
);