diff options
Diffstat (limited to 'ext2ed/inodebitmap_com.c')
-rw-r--r-- | ext2ed/inodebitmap_com.c | 215 |
1 files changed, 215 insertions, 0 deletions
diff --git a/ext2ed/inodebitmap_com.c b/ext2ed/inodebitmap_com.c new file mode 100644 index 0000000..157807a --- /dev/null +++ b/ext2ed/inodebitmap_com.c @@ -0,0 +1,215 @@ +/* + +/usr/src/ext2ed/inodebitmap_com.c + +A part of the extended file system 2 disk editor. + +------------------------- +Handles the inode bitmap. +------------------------- + +Please refer to the documentation in blockbitmap_com.c - Those two files are almost equal. + +First written on: July 25 1995 + +Copyright (C) 1995 Gadi Oxman + +*/ + +#include "config.h" +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "ext2ed.h" + + +void type_ext2_inode_bitmap___entry (char *command_line) + +{ + unsigned long entry_num; + char *ptr,buffer [80]; + + ptr=parse_word (command_line,buffer); + if (*ptr==0) { + wprintw (command_win,"Error - No argument specified\n");refresh_command_win ();return; + } + ptr=parse_word (ptr,buffer); + + entry_num=atol (buffer); + + if (entry_num >= file_system_info.super_block.s_inodes_per_group) { + wprintw (command_win,"Error - Entry number out of bounds\n");refresh_command_win ();return; + } + + inode_bitmap_info.entry_num=entry_num; + strcpy (buffer,"show");dispatch (buffer); +} + +void type_ext2_inode_bitmap___next (char *command_line) + +{ + long entry_offset=1; + char *ptr,buffer [80]; + + ptr=parse_word (command_line,buffer); + if (*ptr!=0) { + ptr=parse_word (ptr,buffer); + entry_offset=atol (buffer); + } + + sprintf (buffer,"entry %ld",inode_bitmap_info.entry_num+entry_offset); + dispatch (buffer); +} + +void type_ext2_inode_bitmap___prev (char *command_line) + +{ + long entry_offset=1; + char *ptr,buffer [80]; + + ptr=parse_word (command_line,buffer); + if (*ptr!=0) { + ptr=parse_word (ptr,buffer); + entry_offset=atol (buffer); + } + + sprintf (buffer,"entry %ld",inode_bitmap_info.entry_num-entry_offset); + dispatch (buffer); +} + +void type_ext2_inode_bitmap___allocate (char *command_line) + +{ + long entry_num,num=1; + char *ptr,buffer [80]; + + ptr=parse_word (command_line,buffer); + if (*ptr!=0) { + ptr=parse_word (ptr,buffer); + num=atol (buffer); + } + + entry_num=inode_bitmap_info.entry_num; + if (num > file_system_info.super_block.s_inodes_per_group-entry_num) { + wprintw (command_win,"Error - There aren't that much inodes in the group\n"); + refresh_command_win ();return; + } + + while (num) { + allocate_inode (entry_num); + num--;entry_num++; + } + + dispatch ("show"); +} + +void type_ext2_inode_bitmap___deallocate (char *command_line) + +{ + long entry_num,num=1; + char *ptr,buffer [80]; + + ptr=parse_word (command_line,buffer); + if (*ptr!=0) { + ptr=parse_word (ptr,buffer); + num=atol (buffer); + } + + entry_num=inode_bitmap_info.entry_num; + if (num > file_system_info.super_block.s_inodes_per_group-entry_num) { + wprintw (command_win,"Error - There aren't that much inodes in the group\n"); + refresh_command_win ();return; + } + + while (num) { + deallocate_inode (entry_num); + num--;entry_num++; + } + + dispatch ("show"); +} + + +void allocate_inode (long entry_num) + +{ + unsigned char bit_mask=1; + int byte_offset,j; + + byte_offset=entry_num/8; + for (j=0;j<entry_num%8;j++) + bit_mask*=2; + type_data.u.buffer [byte_offset] |= bit_mask; +} + +void deallocate_inode (long entry_num) + +{ + unsigned char bit_mask=1; + int byte_offset,j; + + byte_offset=entry_num/8; + for (j=0;j<entry_num%8;j++) + bit_mask*=2; + bit_mask^=0xff; + + type_data.u.buffer [byte_offset] &= bit_mask; +} + +void type_ext2_inode_bitmap___show (char *command_line) + +{ + int i,j; + unsigned char *ptr; + unsigned long inode_num,entry_num; + + ptr=type_data.u.buffer; + show_pad_info.line=0;show_pad_info.max_line=-1; + + wmove (show_pad,0,0); + for (i=0,entry_num=0;i<file_system_info.super_block.s_inodes_per_group/8;i++,ptr++) { + for (j=1;j<=128;j*=2) { + if (entry_num==inode_bitmap_info.entry_num) { + wattrset (show_pad,A_REVERSE); + show_pad_info.line=show_pad_info.max_line-show_pad_info.display_lines/2; + } + + if ((*ptr) & j) + wprintw (show_pad,"1"); + else + wprintw (show_pad,"0"); + + if (entry_num==inode_bitmap_info.entry_num) + wattrset (show_pad,A_NORMAL); + + entry_num++; + } + wprintw (show_pad," "); + if (i%8==7) { + wprintw (show_pad,"\n"); + show_pad_info.max_line++; + } + } + + if (i%8!=7) { + wprintw (show_pad,"\n"); + show_pad_info.max_line++; + } + + refresh_show_pad (); + show_info (); + wmove (show_win,1,0);wprintw (show_win,"Inode bitmap of block group %ld\n",inode_bitmap_info.group_num); + + inode_num=1+inode_bitmap_info.entry_num+inode_bitmap_info.group_num*file_system_info.super_block.s_inodes_per_group; + wprintw (show_win,"Status of inode %ld - ",inode_num); + ptr=type_data.u.buffer+inode_bitmap_info.entry_num/8; + j=1; + for (i=inode_bitmap_info.entry_num % 8;i>0;i--) + j*=2; + if ((*ptr) & j) + wprintw (show_win,"Allocated\n"); + else + wprintw (show_win,"Free\n"); + refresh_show_win (); +} |