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
23 void type_ext2_inode___prev (char *command_line)
27 char *ptr,buffer [80];
29 long group_num,group_offset,entry_num,block_num,first_entry,last_entry;
30 long inode_num,mult=1;
31 struct ext2_group_desc desc;
33 ptr=parse_word (command_line,buffer);
36 ptr=parse_word (ptr,buffer);
40 block_num=device_offset/file_system_info.block_size;
42 group_num=inode_offset_to_group_num (device_offset);
43 group_offset=file_system_info.first_group_desc_offset+group_num*sizeof (struct ext2_group_desc);
45 low_read ((char *) &desc,sizeof (struct ext2_group_desc),group_offset);
47 entry_num=(device_offset-desc.bg_inode_table*file_system_info.block_size)/sizeof (struct ext2_inode);
49 first_entry=0;last_entry=file_system_info.super_block.s_inodes_per_group-1;
52 if (entry_num-mult+1>0) {
53 device_offset-=sizeof (struct ext2_inode)*mult;
56 sprintf (buffer,"setoffset %ld",device_offset);dispatch (buffer);
57 strcpy (buffer,"show");dispatch (buffer);
61 wprintw (command_win,"Error - Entry out of limits\n");refresh_command_win ();
65 wprintw (command_win,"Reached first inode in current group descriptor\n");
66 refresh_command_win ();
70 void type_ext2_inode___next (char *command_line)
74 char *ptr,buffer [80];
76 long group_num,group_offset,entry_num,block_num,first_entry,last_entry;
77 long inode_num,mult=1;
78 struct ext2_group_desc desc;
80 ptr=parse_word (command_line,buffer);
83 ptr=parse_word (ptr,buffer);
88 block_num=device_offset/file_system_info.block_size;
90 group_num=inode_offset_to_group_num (device_offset);
91 group_offset=file_system_info.first_group_desc_offset+group_num*sizeof (struct ext2_group_desc);
93 low_read ((char *) &desc,sizeof (struct ext2_group_desc),group_offset);
95 entry_num=(device_offset-desc.bg_inode_table*file_system_info.block_size)/sizeof (struct ext2_inode);
97 first_entry=0;last_entry=file_system_info.super_block.s_inodes_per_group-1;
100 if (entry_num+mult-1<last_entry) {
101 device_offset+=sizeof (struct ext2_inode)*mult;
104 sprintf (buffer,"setoffset %ld",device_offset);dispatch (buffer);
105 strcpy (buffer,"show");dispatch (buffer);
109 wprintw (command_win,"Error - Entry out of limits\n");refresh_command_win ();
112 if (entry_num==last_entry) {
113 wprintw (command_win,"Reached last inode in current group descriptor\n");
114 refresh_command_win ();
119 void type_ext2_inode___show (char *command_line)
122 struct ext2_inode *inode_ptr;
127 long group_num,group_offset,entry_num,block_num,first_entry,last_entry,inode_num;
128 struct ext2_group_desc desc;
130 block_num=device_offset/file_system_info.block_size;
132 group_num=inode_offset_to_group_num (device_offset);
133 group_offset=file_system_info.first_group_desc_offset+group_num*sizeof (struct ext2_group_desc);
135 low_read ((char *) &desc,sizeof (struct ext2_group_desc),group_offset);
137 entry_num=(device_offset-desc.bg_inode_table*file_system_info.block_size)/sizeof (struct ext2_inode);
138 first_entry=0;last_entry=file_system_info.super_block.s_inodes_per_group-1;
139 inode_num=group_num*file_system_info.super_block.s_inodes_per_group+1;
140 inode_num+=entry_num;
142 inode_ptr=&type_data.u.t_ext2_inode;
146 wmove (show_pad,0,40);wprintw (show_pad,"octal = %06o ",inode_ptr->i_mode);
147 for (i=6;i>=0;i-=3) {
148 temp=inode_ptr->i_mode & 0x1ff;
151 wprintw (show_pad,"r");
153 wprintw (show_pad,"-");
156 wprintw (show_pad,"w");
158 wprintw (show_pad,"-");
161 wprintw (show_pad,"x");
163 wprintw (show_pad,"-");
165 wmove (show_pad,3,40);wprintw (show_pad,"%s",ctime ((time_t *) &type_data.u.t_ext2_inode.i_atime));
166 wmove (show_pad,4,40);wprintw (show_pad,"%s",ctime ((time_t *) &type_data.u.t_ext2_inode.i_ctime));
167 wmove (show_pad,5,40);wprintw (show_pad,"%s",ctime ((time_t *) &type_data.u.t_ext2_inode.i_mtime));
168 wmove (show_pad,6,40);wprintw (show_pad,"%s",ctime ((time_t *) &type_data.u.t_ext2_inode.i_dtime));
170 wmove (show_pad,10,40);
171 temp=inode_ptr->i_flags;
173 if (temp & EXT2_SECRM_FL)
174 wprintw (show_pad,"s");
176 wprintw (show_pad,"-");
179 if (temp & EXT2_UNRM_FL)
180 wprintw (show_pad,"u");
182 wprintw (show_pad,"-");
184 if (temp & EXT2_COMPR_FL)
185 wprintw (show_pad,"c");
187 wprintw (show_pad,"-");
189 if (temp & EXT2_SYNC_FL)
190 wprintw (show_pad,"S");
192 wprintw (show_pad,"-");
194 if (temp & EXT2_IMMUTABLE_FL)
195 wprintw (show_pad,"i");
197 wprintw (show_pad,"-");
199 if (temp & EXT2_APPEND_FL)
200 wprintw (show_pad,"a");
202 wprintw (show_pad,"-");
204 if (temp & EXT2_NODUMP_FL)
205 wprintw (show_pad,"d");
207 wprintw (show_pad,"-");
211 wmove (show_win,1,0);
213 wprintw (show_win,"Inode %ld of %ld. Entry %ld of %ld in group descriptor %ld.\n"
214 ,inode_num,file_system_info.super_block.s_inodes_count,entry_num,last_entry,group_num);
216 wprintw (show_win,"Inode type: ");
218 if (inode_num < EXT2_GOOD_OLD_FIRST_INO) {
221 wprintw (show_win,"Bad blocks inode - ");
224 wprintw (show_win,"Root inode - ");
226 case EXT4_USR_QUOTA_INO:
227 wprintw (show_win,"User quota inode - ");
229 case EXT4_GRP_QUOTA_INO:
230 wprintw (show_win,"Group quota inode - ");
232 case EXT2_BOOT_LOADER_INO:
233 wprintw (show_win,"Boot loader inode - ");
235 case EXT2_UNDEL_DIR_INO:
236 wprintw (show_win,"Undelete directory inode - ");
239 wprintw (show_win,"Reserved inode - ");
243 if (type_data.u.t_ext2_inode.i_mode==0)
244 wprintw (show_win,"Free. ");
246 if (S_ISREG (type_data.u.t_ext2_inode.i_mode))
247 wprintw (show_win,"File. ");
249 if (S_ISDIR (type_data.u.t_ext2_inode.i_mode))
250 wprintw (show_win,"Directory. ");
252 if (S_ISLNK (type_data.u.t_ext2_inode.i_mode)) {
253 wprintw (show_win,"Symbolic link. ");
254 wmove (show_pad,12,40);
256 if (inode_ptr->i_size <= 60)
257 wprintw (show_pad,"-> %s",(char *) &type_data.u.t_ext2_inode.i_block [0]);
259 wprintw (show_pad,"Slow symbolic link\n");
263 if (S_ISCHR (type_data.u.t_ext2_inode.i_mode))
264 wprintw (show_win,"Character device.");
266 if (S_ISBLK (type_data.u.t_ext2_inode.i_mode))
267 wprintw (show_win,"Block device. ");
269 wprintw (show_win,"\n");refresh_show_win ();
271 if (entry_num==last_entry) {
272 wprintw (command_win,"Reached last inode in current group descriptor\n");
273 refresh_command_win ();
276 if (entry_num==first_entry) {
277 wprintw (command_win,"Reached first inode in current group descriptor\n");
278 refresh_command_win ();
283 void type_ext2_inode___entry (char *command_line)
286 char *ptr,buffer [80];
288 long group_num,group_offset,entry_num,block_num,wanted_entry;
289 struct ext2_group_desc desc;
291 ptr=parse_word (command_line,buffer);
293 ptr=parse_word (ptr,buffer);
294 wanted_entry=atol (buffer);
296 block_num=device_offset/file_system_info.block_size;
298 group_num=inode_offset_to_group_num (device_offset);
299 group_offset=file_system_info.first_group_desc_offset+group_num*sizeof (struct ext2_group_desc);
301 low_read ((char *) &desc,sizeof (struct ext2_group_desc),group_offset);
303 entry_num=(device_offset-desc.bg_inode_table*file_system_info.block_size)/sizeof (struct ext2_inode);
305 if (wanted_entry > entry_num) {
306 sprintf (buffer,"next %ld",wanted_entry-entry_num);
310 else if (wanted_entry < entry_num) {
311 sprintf (buffer,"prev %ld",entry_num-wanted_entry);
316 void type_ext2_inode___group (char *command_line)
321 long group_num,group_offset;
323 group_num=inode_offset_to_group_num (device_offset);
324 group_offset=file_system_info.first_group_desc_offset+group_num*sizeof (struct ext2_group_desc);
326 sprintf (buffer,"setoffset %ld",group_offset);dispatch (buffer);
327 sprintf (buffer,"settype ext2_group_desc");dispatch (buffer);
330 void type_ext2_inode___file (char *command_line)
335 if (!S_ISREG (type_data.u.t_ext2_inode.i_mode)) {
336 wprintw (command_win,"Error - Inode type is not file\n");refresh_command_win ();
340 if (!init_file_info ()) {
341 wprintw (command_win,"Error - Unable to show file\n");refresh_command_win ();
345 sprintf (buffer,"settype file");dispatch (buffer);
348 void type_ext2_inode___dir (char *command_line)
353 if (!S_ISDIR (type_data.u.t_ext2_inode.i_mode)) {
354 wprintw (command_win,"Error - Inode type is not directory\n");refresh_command_win ();
358 /* It is very important to init first_file_info first, as search_dir_entries relies on it */
360 if (!init_dir_info (&first_file_info)) {
361 wprintw (command_win,"Error - Unable to show directory\n");refresh_command_win ();
365 file_info=first_file_info;
367 sprintf (buffer,"settype dir");dispatch (buffer);
370 long inode_offset_to_group_num (long inode_offset)
374 struct ext2_group_desc desc;
376 long block_num,group_offset,group_num;
378 block_num=inode_offset/file_system_info.block_size;
380 group_offset=file_system_info.first_group_desc_offset;
381 group_num=(group_offset-file_system_info.first_group_desc_offset)/sizeof (struct ext2_group_desc);
383 while (!found && group_num>=0 && group_num<file_system_info.groups_count) {
384 low_read ((char *) &desc,sizeof (struct ext2_group_desc),group_offset);
385 if (block_num>=desc.bg_inode_table && block_num<desc.bg_inode_table+file_system_info.blocks_per_group)
388 group_offset+=sizeof (struct ext2_group_desc);
389 group_num=(group_offset-file_system_info.first_group_desc_offset)/sizeof (struct ext2_group_desc);
400 long int inode_offset_to_inode_num (long inode_offset)
403 long group_num,group_offset,entry_num,block_num,first_entry,last_entry,inode_num;
404 struct ext2_group_desc desc;
406 block_num=inode_offset/file_system_info.block_size;
408 group_num=inode_offset_to_group_num (inode_offset);
409 group_offset=file_system_info.first_group_desc_offset+group_num*sizeof (struct ext2_group_desc);
411 low_read ((char *) &desc,sizeof (struct ext2_group_desc),group_offset);
413 entry_num=(inode_offset-desc.bg_inode_table*file_system_info.block_size)/sizeof (struct ext2_inode);
414 first_entry=0;last_entry=file_system_info.super_block.s_inodes_per_group-1;
415 inode_num=group_num*file_system_info.super_block.s_inodes_per_group+1;
416 inode_num+=entry_num;
421 long int inode_num_to_inode_offset (long inode_num)
424 long group_num,group_offset,inode_offset,inode_entry;
425 struct ext2_group_desc desc;
429 group_num=inode_num/file_system_info.super_block.s_inodes_per_group;
430 inode_entry=inode_num%file_system_info.super_block.s_inodes_per_group;
431 group_offset=file_system_info.first_group_desc_offset+group_num*sizeof (struct ext2_group_desc);
432 low_read ((char *) &desc,sizeof (struct ext2_group_desc),group_offset);
434 inode_offset=desc.bg_inode_table*file_system_info.block_size+inode_entry*sizeof (struct ext2_inode);
436 return (inode_offset);