*/
+#include "config.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
if (entry_num-mult+1>0) {
device_offset-=sizeof (struct ext2_inode)*mult;
entry_num-=mult;
-
+
sprintf (buffer,"setoffset %ld",device_offset);dispatch (buffer);
strcpy (buffer,"show");dispatch (buffer);
}
else {
wprintw (command_win,"Error - Entry out of limits\n");refresh_command_win ();
}
-
+
if (entry_num==0) {
wprintw (command_win,"Reached first inode in current group descriptor\n");
refresh_command_win ();
struct ext2_group_desc desc;
ptr=parse_word (command_line,buffer);
-
+
if (*ptr!=0) {
ptr=parse_word (ptr,buffer);
mult=atol (buffer);
if (entry_num+mult-1<last_entry) {
device_offset+=sizeof (struct ext2_inode)*mult;
entry_num+=mult;
-
+
sprintf (buffer,"setoffset %ld",device_offset);dispatch (buffer);
strcpy (buffer,"show");dispatch (buffer);
}
else {
wprintw (command_win,"Error - Entry out of limits\n");refresh_command_win ();
}
-
+
if (entry_num==last_entry) {
wprintw (command_win,"Reached last inode in current group descriptor\n");
refresh_command_win ();
{
struct ext2_inode *inode_ptr;
-
+
unsigned short temp;
int i;
-
+
long group_num,group_offset,entry_num,block_num,first_entry,last_entry,inode_num;
struct ext2_group_desc desc;
wprintw (show_pad,"r");
else
wprintw (show_pad,"-");
-
+
if (temp & 2)
wprintw (show_pad,"w");
else
wmove (show_pad,10,40);
temp=inode_ptr->i_flags;
-
+
if (temp & EXT2_SECRM_FL)
wprintw (show_pad,"s");
else
wprintw (show_pad,"d");
else
wprintw (show_pad,"-");
-
+
refresh_show_pad ();
wmove (show_win,1,0);
wprintw (show_win,"Inode %ld of %ld. Entry %ld of %ld in group descriptor %ld.\n"
,inode_num,file_system_info.super_block.s_inodes_count,entry_num,last_entry,group_num);
-
+
wprintw (show_win,"Inode type: ");
- if (inode_num < EXT2_FIRST_INO) {
+ if (inode_num < EXT2_GOOD_OLD_FIRST_INO) {
switch (inode_num) {
case EXT2_BAD_INO:
wprintw (show_win,"Bad blocks inode - ");
case EXT2_ROOT_INO:
wprintw (show_win,"Root inode - ");
break;
- case EXT2_ACL_IDX_INO:
- wprintw (show_win,"ACL index inode - ");
+ case EXT4_USR_QUOTA_INO:
+ wprintw (show_win,"User quota inode - ");
break;
- case EXT2_ACL_DATA_INO:
- wprintw (show_win,"ACL data inode - ");
+ case EXT4_GRP_QUOTA_INO:
+ wprintw (show_win,"Group quota inode - ");
break;
case EXT2_BOOT_LOADER_INO:
wprintw (show_win,"Boot loader inode - ");
}
if (type_data.u.t_ext2_inode.i_mode==0)
wprintw (show_win,"Free. ");
-
+
if (S_ISREG (type_data.u.t_ext2_inode.i_mode))
wprintw (show_win,"File. ");
if (inode_ptr->i_size <= 60)
wprintw (show_pad,"-> %s",(char *) &type_data.u.t_ext2_inode.i_block [0]);
else
- wprintw (show_pad,"Slow symbolic link\n");
+ wprintw (show_pad,"Slow symbolic link\n");
refresh_show_pad ();
}
wprintw (show_win,"Block device. ");
wprintw (show_win,"\n");refresh_show_win ();
-
+
if (entry_num==last_entry) {
wprintw (command_win,"Reached last inode in current group descriptor\n");
refresh_command_win ();
sprintf (buffer,"next %ld",wanted_entry-entry_num);
dispatch (buffer);
}
-
+
else if (wanted_entry < entry_num) {
sprintf (buffer,"prev %ld",entry_num-wanted_entry);
dispatch (buffer);
{
char buffer [80];
-
+
long group_num,group_offset;
-
+
group_num=inode_offset_to_group_num (device_offset);
group_offset=file_system_info.first_group_desc_offset+group_num*sizeof (struct ext2_group_desc);
-
+
sprintf (buffer,"setoffset %ld",group_offset);dispatch (buffer);
sprintf (buffer,"settype ext2_group_desc");dispatch (buffer);
}
{
char buffer [80];
-
+
if (!S_ISREG (type_data.u.t_ext2_inode.i_mode)) {
wprintw (command_win,"Error - Inode type is not file\n");refresh_command_win ();
- return;
+ return;
}
-
+
if (!init_file_info ()) {
wprintw (command_win,"Error - Unable to show file\n");refresh_command_win ();
- return;
+ return;
}
-
+
sprintf (buffer,"settype file");dispatch (buffer);
}
{
char buffer [80];
-
+
if (!S_ISDIR (type_data.u.t_ext2_inode.i_mode)) {
wprintw (command_win,"Error - Inode type is not directory\n");refresh_command_win ();
- return;
+ return;
}
-/* It is very important to init first_file_info first, as search_dir_entries relies on it */
+/* It is very important to init first_file_info first, as search_dir_entries relies on it */
if (!init_dir_info (&first_file_info)) {
wprintw (command_win,"Error - Unable to show directory\n");refresh_command_win ();
- return;
+ return;
}
-
+
file_info=first_file_info;
-
+
sprintf (buffer,"settype dir");dispatch (buffer);
}
{
int found=0;
struct ext2_group_desc desc;
-
+
long block_num,group_offset,group_num;
-
+
block_num=inode_offset/file_system_info.block_size;
group_offset=file_system_info.first_group_desc_offset;
group_offset+=sizeof (struct ext2_group_desc);
group_num=(group_offset-file_system_info.first_group_desc_offset)/sizeof (struct ext2_group_desc);
}
-
+
if (!found)
return (-1);
return (group_num);
}
-
+
long int inode_offset_to_inode_num (long inode_offset)
first_entry=0;last_entry=file_system_info.super_block.s_inodes_per_group-1;
inode_num=group_num*file_system_info.super_block.s_inodes_per_group+1;
inode_num+=entry_num;
-
+
return (inode_num);
}
struct ext2_group_desc desc;
inode_num--;
-
+
group_num=inode_num/file_system_info.super_block.s_inodes_per_group;
inode_entry=inode_num%file_system_info.super_block.s_inodes_per_group;
group_offset=file_system_info.first_group_desc_offset+group_num*sizeof (struct ext2_group_desc);