1 /* 2 3 /usr/src/ext2ed/inodebitmap_com.c 4 5 A part of the extended file system 2 disk editor. 6 7 ------------------------- 8 Handles the inode bitmap. 9 ------------------------- 10 11 Please refer to the documentation in blockbitmap_com.c - Those two files are almost equal. 12 13 First written on: July 25 1995 14 15 Copyright (C) 1995 Gadi Oxman 16 17 */ 18 19 #include <stdio.h> 20 #include <stdlib.h> 21 #include <string.h> 22 23 #include "ext2ed.h" 24 25 26 void type_ext2_inode_bitmap___entry (char *command_line) 27 28 { 29 unsigned long entry_num; 30 char *ptr,buffer [80]; 31 32 ptr=parse_word (command_line,buffer); 33 if (*ptr==0) { 34 wprintw (command_win,"Error - No argument specified\n");refresh_command_win ();return; 35 } 36 ptr=parse_word (ptr,buffer); 37 38 entry_num=atol (buffer); 39 40 if (entry_num >= file_system_info.super_block.s_inodes_per_group) { 41 wprintw (command_win,"Error - Entry number out of bounds\n");refresh_command_win ();return; 42 } 43 44 inode_bitmap_info.entry_num=entry_num; 45 strcpy (buffer,"show");dispatch (buffer); 46 } 47 48 void type_ext2_inode_bitmap___next (char *command_line) 49 50 { 51 long entry_offset=1; 52 char *ptr,buffer [80]; 53 54 ptr=parse_word (command_line,buffer); 55 if (*ptr!=0) { 56 ptr=parse_word (ptr,buffer); 57 entry_offset=atol (buffer); 58 } 59 60 sprintf (buffer,"entry %ld",inode_bitmap_info.entry_num+entry_offset); 61 dispatch (buffer); 62 } 63 64 void type_ext2_inode_bitmap___prev (char *command_line) 65 66 { 67 long entry_offset=1; 68 char *ptr,buffer [80]; 69 70 ptr=parse_word (command_line,buffer); 71 if (*ptr!=0) { 72 ptr=parse_word (ptr,buffer); 73 entry_offset=atol (buffer); 74 } 75 76 sprintf (buffer,"entry %ld",inode_bitmap_info.entry_num-entry_offset); 77 dispatch (buffer); 78 } 79 80 void type_ext2_inode_bitmap___allocate (char *command_line) 81 82 { 83 long entry_num,num=1; 84 char *ptr,buffer [80]; 85 86 ptr=parse_word (command_line,buffer); 87 if (*ptr!=0) { 88 ptr=parse_word (ptr,buffer); 89 num=atol (buffer); 90 } 91 92 entry_num=inode_bitmap_info.entry_num; 93 if (num > file_system_info.super_block.s_inodes_per_group-entry_num) { 94 wprintw (command_win,"Error - There aren't that much inodes in the group\n"); 95 refresh_command_win ();return; 96 } 97 98 while (num) { 99 allocate_inode (entry_num); 100 num--;entry_num++; 101 } 102 103 dispatch ("show"); 104 } 105 106 void type_ext2_inode_bitmap___deallocate (char *command_line) 107 108 { 109 long entry_num,num=1; 110 char *ptr,buffer [80]; 111 112 ptr=parse_word (command_line,buffer); 113 if (*ptr!=0) { 114 ptr=parse_word (ptr,buffer); 115 num=atol (buffer); 116 } 117 118 entry_num=inode_bitmap_info.entry_num; 119 if (num > file_system_info.super_block.s_inodes_per_group-entry_num) { 120 wprintw (command_win,"Error - There aren't that much inodes in the group\n"); 121 refresh_command_win ();return; 122 } 123 124 while (num) { 125 deallocate_inode (entry_num); 126 num--;entry_num++; 127 } 128 129 dispatch ("show"); 130 } 131 132 133 void allocate_inode (long entry_num) 134 135 { 136 unsigned char bit_mask=1; 137 int byte_offset,j; 138 139 byte_offset=entry_num/8; 140 for (j=0;j<entry_num%8;j++) 141 bit_mask*=2; 142 type_data.u.buffer [byte_offset] |= bit_mask; 143 } 144 145 void deallocate_inode (long entry_num) 146 147 { 148 unsigned char bit_mask=1; 149 int byte_offset,j; 150 151 byte_offset=entry_num/8; 152 for (j=0;j<entry_num%8;j++) 153 bit_mask*=2; 154 bit_mask^=0xff; 155 156 type_data.u.buffer [byte_offset] &= bit_mask; 157 } 158 159 void type_ext2_inode_bitmap___show (char *command_line) 160 161 { 162 int i,j; 163 unsigned char *ptr; 164 unsigned long inode_num,entry_num; 165 166 ptr=type_data.u.buffer; 167 show_pad_info.line=0;show_pad_info.max_line=-1; 168 169 wmove (show_pad,0,0); 170 for (i=0,entry_num=0;i<file_system_info.super_block.s_inodes_per_group/8;i++,ptr++) { 171 for (j=1;j<=128;j*=2) { 172 if (entry_num==inode_bitmap_info.entry_num) { 173 wattrset (show_pad,A_REVERSE); 174 show_pad_info.line=show_pad_info.max_line-show_pad_info.display_lines/2; 175 } 176 177 if ((*ptr) & j) 178 wprintw (show_pad,"1"); 179 else 180 wprintw (show_pad,"0"); 181 182 if (entry_num==inode_bitmap_info.entry_num) 183 wattrset (show_pad,A_NORMAL); 184 185 entry_num++; 186 } 187 wprintw (show_pad," "); 188 if (i%8==7) { 189 wprintw (show_pad,"\n"); 190 show_pad_info.max_line++; 191 } 192 } 193 194 if (i%8!=7) { 195 wprintw (show_pad,"\n"); 196 show_pad_info.max_line++; 197 } 198 199 refresh_show_pad (); 200 show_info (); 201 wmove (show_win,1,0);wprintw (show_win,"Inode bitmap of block group %ld\n",inode_bitmap_info.group_num); 202 203 inode_num=1+inode_bitmap_info.entry_num+inode_bitmap_info.group_num*file_system_info.super_block.s_inodes_per_group; 204 wprintw (show_win,"Status of inode %ld - ",inode_num); 205 ptr=type_data.u.buffer+inode_bitmap_info.entry_num/8; 206 j=1; 207 for (i=inode_bitmap_info.entry_num % 8;i>0;i--) 208 j*=2; 209 if ((*ptr) & j) 210 wprintw (show_win,"Allocated\n"); 211 else 212 wprintw (show_win,"Free\n"); 213 refresh_show_win (); 214 } 215