3 /usr/src/ext2ed/inode_com.c
5 A part of the extended file system 2 disk editor.
7 Commands relevant to ext2_inode type.
9 First written on: April 9 1995
11 Copyright (C) 1995 Gadi Oxman
22 void type_ext2_inode___prev (char *command_line)
26 char *ptr,buffer [80];
28 long group_num,group_offset,entry_num,block_num,first_entry,last_entry;
29 long inode_num,mult=1;
30 struct ext2_group_desc desc;
32 ptr=parse_word (command_line,buffer);
35 ptr=parse_word (ptr,buffer);
39 block_num=device_offset/file_system_info.block_size;
41 group_num=inode_offset_to_group_num (device_offset);
42 group_offset=file_system_info.first_group_desc_offset+group_num*sizeof (struct ext2_group_desc);
44 low_read ((char *) &desc,sizeof (struct ext2_group_desc),group_offset);
46 entry_num=(device_offset-desc.bg_inode_table*file_system_info.block_size)/sizeof (struct ext2_inode);
48 first_entry=0;last_entry=file_system_info.super_block.s_inodes_per_group-1;
51 if (entry_num-mult+1>0) {
52 device_offset-=sizeof (struct ext2_inode)*mult;
55 sprintf (buffer,"setoffset %ld",device_offset);dispatch (buffer);
56 strcpy (buffer,"show");dispatch (buffer);
60 wprintw (command_win,"Error - Entry out of limits\n");refresh_command_win ();
64 wprintw (command_win,"Reached first inode in current group descriptor\n");
65 refresh_command_win ();
69 void type_ext2_inode___next (char *command_line)
73 char *ptr,buffer [80];
75 long group_num,group_offset,entry_num,block_num,first_entry,last_entry;
76 long inode_num,mult=1;
77 struct ext2_group_desc desc;
79 ptr=parse_word (command_line,buffer);
82 ptr=parse_word (ptr,buffer);
87 block_num=device_offset/file_system_info.block_size;
89 group_num=inode_offset_to_group_num (device_offset);
90 group_offset=file_system_info.first_group_desc_offset+group_num*sizeof (struct ext2_group_desc);
92 low_read ((char *) &desc,sizeof (struct ext2_group_desc),group_offset);
94 entry_num=(device_offset-desc.bg_inode_table*file_system_info.block_size)/sizeof (struct ext2_inode);
96 first_entry=0;last_entry=file_system_info.super_block.s_inodes_per_group-1;
99 if (entry_num+mult-1<last_entry) {
100 device_offset+=sizeof (struct ext2_inode)*mult;
103 sprintf (buffer,"setoffset %ld",device_offset);dispatch (buffer);
104 strcpy (buffer,"show");dispatch (buffer);
108 wprintw (command_win,"Error - Entry out of limits\n");refresh_command_win ();
111 if (entry_num==last_entry) {
112 wprintw (command_win,"Reached last inode in current group descriptor\n");
113 refresh_command_win ();
118 void type_ext2_inode___show (char *command_line)
121 struct ext2_inode *inode_ptr;
126 long group_num,group_offset,entry_num,block_num,first_entry,last_entry,inode_num;
127 struct ext2_group_desc desc;
129 block_num=device_offset/file_system_info.block_size;
131 group_num=inode_offset_to_group_num (device_offset);
132 group_offset=file_system_info.first_group_desc_offset+group_num*sizeof (struct ext2_group_desc);
134 low_read ((char *) &desc,sizeof (struct ext2_group_desc),group_offset);
136 entry_num=(device_offset-desc.bg_inode_table*file_system_info.block_size)/sizeof (struct ext2_inode);
137 first_entry=0;last_entry=file_system_info.super_block.s_inodes_per_group-1;
138 inode_num=group_num*file_system_info.super_block.s_inodes_per_group+1;
139 inode_num+=entry_num;
141 inode_ptr=&type_data.u.t_ext2_inode;
145 wmove (show_pad,0,40);wprintw (show_pad,"octal = %06o ",inode_ptr->i_mode);
146 for (i=6;i>=0;i-=3) {
147 temp=inode_ptr->i_mode & 0x1ff;
150 wprintw (show_pad,"r");
152 wprintw (show_pad,"-");
155 wprintw (show_pad,"w");
157 wprintw (show_pad,"-");
160 wprintw (show_pad,"x");
162 wprintw (show_pad,"-");
164 wmove (show_pad,3,40);wprintw (show_pad,"%s",ctime ((time_t *) &type_data.u.t_ext2_inode.i_atime));
165 wmove (show_pad,4,40);wprintw (show_pad,"%s",ctime ((time_t *) &type_data.u.t_ext2_inode.i_ctime));
166 wmove (show_pad,5,40);wprintw (show_pad,"%s",ctime ((time_t *) &type_data.u.t_ext2_inode.i_mtime));
167 wmove (show_pad,6,40);wprintw (show_pad,"%s",ctime ((time_t *) &type_data.u.t_ext2_inode.i_dtime));
169 wmove (show_pad,10,40);
170 temp=inode_ptr->i_flags;
172 if (temp & EXT2_SECRM_FL)
173 wprintw (show_pad,"s");
175 wprintw (show_pad,"-");
178 if (temp & EXT2_UNRM_FL)
179 wprintw (show_pad,"u");
181 wprintw (show_pad,"-");
183 if (temp & EXT2_COMPR_FL)
184 wprintw (show_pad,"c");
186 wprintw (show_pad,"-");
188 if (temp & EXT2_SYNC_FL)
189 wprintw (show_pad,"S");
191 wprintw (show_pad,"-");
193 if (temp & EXT2_IMMUTABLE_FL)
194 wprintw (show_pad,"i");
196 wprintw (show_pad,"-");
198 if (temp & EXT2_APPEND_FL)
199 wprintw (show_pad,"a");
201 wprintw (show_pad,"-");
203 if (temp & EXT2_NODUMP_FL)
204 wprintw (show_pad,"d");
206 wprintw (show_pad,"-");
210 wmove (show_win,1,0);
212 wprintw (show_win,"Inode %ld of %ld. Entry %ld of %ld in group descriptor %ld.\n"
213 ,inode_num,file_system_info.super_block.s_inodes_count,entry_num,last_entry,group_num);
215 wprintw (show_win,"Inode type: ");
217 if (inode_num < EXT2_GOOD_OLD_FIRST_INO) {
220 wprintw (show_win,"Bad blocks inode - ");
223 wprintw (show_win,"Root inode - ");
225 case EXT2_ACL_IDX_INO:
226 wprintw (show_win,"ACL index inode - ");
228 case EXT2_ACL_DATA_INO:
229 wprintw (show_win,"ACL data inode - ");
231 case EXT2_BOOT_LOADER_INO:
232 wprintw (show_win,"Boot loader inode - ");
234 case EXT2_UNDEL_DIR_INO:
235 wprintw (show_win,"Undelete directory inode - ");
238 wprintw (show_win,"Reserved inode - ");
242 if (type_data.u.t_ext2_inode.i_mode==0)
243 wprintw (show_win,"Free. ");
245 if (S_ISREG (type_data.u.t_ext2_inode.i_mode))
246 wprintw (show_win,"File. ");
248 if (S_ISDIR (type_data.u.t_ext2_inode.i_mode))
249 wprintw (show_win,"Directory. ");
251 if (S_ISLNK (type_data.u.t_ext2_inode.i_mode)) {
252 wprintw (show_win,"Symbolic link. ");
253 wmove (show_pad,12,40);
255 if (inode_ptr->i_size <= 60)
256 wprintw (show_pad,"-> %s",(char *) &type_data.u.t_ext2_inode.i_block [0]);
258 wprintw (show_pad,"Slow symbolic link\n");
262 if (S_ISCHR (type_data.u.t_ext2_inode.i_mode))
263 wprintw (show_win,"Character device.");
265 if (S_ISBLK (type_data.u.t_ext2_inode.i_mode))
266 wprintw (show_win,"Block device. ");
268 wprintw (show_win,"\n");refresh_show_win ();
270 if (entry_num==last_entry) {
271 wprintw (command_win,"Reached last inode in current group descriptor\n");
272 refresh_command_win ();
275 if (entry_num==first_entry) {
276 wprintw (command_win,"Reached first inode in current group descriptor\n");
277 refresh_command_win ();
282 void type_ext2_inode___entry (char *command_line)
285 char *ptr,buffer [80];
287 long group_num,group_offset,entry_num,block_num,wanted_entry;
288 struct ext2_group_desc desc;
290 ptr=parse_word (command_line,buffer);
292 ptr=parse_word (ptr,buffer);
293 wanted_entry=atol (buffer);
295 block_num=device_offset/file_system_info.block_size;
297 group_num=inode_offset_to_group_num (device_offset);
298 group_offset=file_system_info.first_group_desc_offset+group_num*sizeof (struct ext2_group_desc);
300 low_read ((char *) &desc,sizeof (struct ext2_group_desc),group_offset);
302 entry_num=(device_offset-desc.bg_inode_table*file_system_info.block_size)/sizeof (struct ext2_inode);
304 if (wanted_entry > entry_num) {
305 sprintf (buffer,"next %ld",wanted_entry-entry_num);
309 else if (wanted_entry < entry_num) {
310 sprintf (buffer,"prev %ld",entry_num-wanted_entry);
315 void type_ext2_inode___group (char *command_line)
320 long group_num,group_offset;
322 group_num=inode_offset_to_group_num (device_offset);
323 group_offset=file_system_info.first_group_desc_offset+group_num*sizeof (struct ext2_group_desc);
325 sprintf (buffer,"setoffset %ld",group_offset);dispatch (buffer);
326 sprintf (buffer,"settype ext2_group_desc");dispatch (buffer);
329 void type_ext2_inode___file (char *command_line)
334 if (!S_ISREG (type_data.u.t_ext2_inode.i_mode)) {
335 wprintw (command_win,"Error - Inode type is not file\n");refresh_command_win ();
339 if (!init_file_info ()) {
340 wprintw (command_win,"Error - Unable to show file\n");refresh_command_win ();
344 sprintf (buffer,"settype file");dispatch (buffer);
347 void type_ext2_inode___dir (char *command_line)
352 if (!S_ISDIR (type_data.u.t_ext2_inode.i_mode)) {
353 wprintw (command_win,"Error - Inode type is not directory\n");refresh_command_win ();
357 /* It is very important to init first_file_info first, as search_dir_entries relies on it */
359 if (!init_dir_info (&first_file_info)) {
360 wprintw (command_win,"Error - Unable to show directory\n");refresh_command_win ();
364 file_info=first_file_info;
366 sprintf (buffer,"settype dir");dispatch (buffer);
369 long inode_offset_to_group_num (long inode_offset)
373 struct ext2_group_desc desc;
375 long block_num,group_offset,group_num;
377 block_num=inode_offset/file_system_info.block_size;
379 group_offset=file_system_info.first_group_desc_offset;
380 group_num=(group_offset-file_system_info.first_group_desc_offset)/sizeof (struct ext2_group_desc);
382 while (!found && group_num>=0 && group_num<file_system_info.groups_count) {
383 low_read ((char *) &desc,sizeof (struct ext2_group_desc),group_offset);
384 if (block_num>=desc.bg_inode_table && block_num<desc.bg_inode_table+file_system_info.blocks_per_group)
387 group_offset+=sizeof (struct ext2_group_desc);
388 group_num=(group_offset-file_system_info.first_group_desc_offset)/sizeof (struct ext2_group_desc);
399 long int inode_offset_to_inode_num (long inode_offset)
402 long group_num,group_offset,entry_num,block_num,first_entry,last_entry,inode_num;
403 struct ext2_group_desc desc;
405 block_num=inode_offset/file_system_info.block_size;
407 group_num=inode_offset_to_group_num (inode_offset);
408 group_offset=file_system_info.first_group_desc_offset+group_num*sizeof (struct ext2_group_desc);
410 low_read ((char *) &desc,sizeof (struct ext2_group_desc),group_offset);
412 entry_num=(inode_offset-desc.bg_inode_table*file_system_info.block_size)/sizeof (struct ext2_inode);
413 first_entry=0;last_entry=file_system_info.super_block.s_inodes_per_group-1;
414 inode_num=group_num*file_system_info.super_block.s_inodes_per_group+1;
415 inode_num+=entry_num;
420 long int inode_num_to_inode_offset (long inode_num)
423 long group_num,group_offset,inode_offset,inode_entry;
424 struct ext2_group_desc desc;
428 group_num=inode_num/file_system_info.super_block.s_inodes_per_group;
429 inode_entry=inode_num%file_system_info.super_block.s_inodes_per_group;
430 group_offset=file_system_info.first_group_desc_offset+group_num*sizeof (struct ext2_group_desc);
431 low_read ((char *) &desc,sizeof (struct ext2_group_desc),group_offset);
433 inode_offset=desc.bg_inode_table*file_system_info.block_size+inode_entry*sizeof (struct ext2_inode);
435 return (inode_offset);