]>
git.ipfire.org Git - thirdparty/e2fsprogs.git/blob - ext2ed/inode_com.c
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
);