Home | History | Annotate | Download | only in ext2ed
      1 /*
      2 
      3 /usr/src/ext2ed/blockbitmap_com.c
      4 
      5 A part of the extended file system 2 disk editor.
      6 
      7 -------------------------
      8 Handles the block bitmap.
      9 -------------------------
     10 
     11 This file implements the commands which are specific to the blockbitmap type.
     12 
     13 First written on: July 5 1995
     14 
     15 Copyright (C) 1995 Gadi Oxman
     16 
     17 */
     18 
     19 #include "config.h"
     20 #include <stdio.h>
     21 #include <stdlib.h>
     22 #include <string.h>
     23 
     24 #include "ext2ed.h"
     25 
     26 /*
     27 
     28 The functions in this file use the flobal structure block_bitmap_info. This structure contains the current
     29 position in the bitmap.
     30 
     31 */
     32 
     33 void type_ext2_block_bitmap___entry (char *command_line)
     34 
     35 /*
     36 
     37 This function changes the current entry in the bitmap. It just changes the entry_num variable in block_bitmap_info
     38 and dispatches a show command to show the new entry.
     39 
     40 */
     41 
     42 {
     43 	unsigned long entry_num;
     44 	char *ptr,buffer [80];
     45 
     46 
     47 
     48 	ptr=parse_word (command_line,buffer);					/* Get the requested entry */
     49 	if (*ptr==0) {
     50 		wprintw (command_win,"Error - No argument specified\n");
     51 		refresh_command_win ();	return;
     52 	}
     53 	ptr=parse_word (ptr,buffer);
     54 
     55 	entry_num=atol (buffer);
     56 
     57 
     58 	if (entry_num >= file_system_info.super_block.s_blocks_per_group) {	/* Check if it is a valid entry number */
     59 
     60 		wprintw (command_win,"Error - Entry number out of bounds\n");
     61 		refresh_command_win ();return;
     62 	}
     63 
     64 
     65 
     66 	block_bitmap_info.entry_num=entry_num;					/* If it is, just change entry_num and */
     67 	strcpy (buffer,"show");dispatch (buffer);				/* dispatch a show command */
     68 }
     69 
     70 void type_ext2_block_bitmap___next (char *command_line)
     71 
     72 /*
     73 
     74 This function passes to the next entry in the bitmap. We just call the above entry command.
     75 
     76 */
     77 
     78 {
     79 	long entry_offset=1;
     80 	char *ptr,buffer [80];
     81 
     82 	ptr=parse_word (command_line,buffer);
     83 	if (*ptr!=0) {
     84 		ptr=parse_word (ptr,buffer);
     85 		entry_offset=atol (buffer);
     86 	}
     87 
     88 	sprintf (buffer,"entry %ld",block_bitmap_info.entry_num+entry_offset);
     89 	dispatch (buffer);
     90 }
     91 
     92 void type_ext2_block_bitmap___prev (char *command_line)
     93 
     94 {
     95 	long entry_offset=1;
     96 	char *ptr,buffer [80];
     97 
     98 	ptr=parse_word (command_line,buffer);
     99 	if (*ptr!=0) {
    100 		ptr=parse_word (ptr,buffer);
    101 		entry_offset=atol (buffer);
    102 	}
    103 
    104 	sprintf (buffer,"entry %ld",block_bitmap_info.entry_num-entry_offset);
    105 	dispatch (buffer);
    106 }
    107 
    108 void type_ext2_block_bitmap___allocate (char *command_line)
    109 
    110 /*
    111 
    112 This function starts allocating block from the current position. Allocating involves setting the correct bits
    113 in the bitmap. This function is a vector version of allocate_block below - We just run on the blocks that
    114 we need to allocate, and call allocate_block for each one.
    115 
    116 */
    117 
    118 {
    119 	long entry_num,num=1;
    120 	char *ptr,buffer [80];
    121 
    122 	ptr=parse_word (command_line,buffer);					/* Get the number of blocks to allocate */
    123 	if (*ptr!=0) {
    124 		ptr=parse_word (ptr,buffer);
    125 		num=atol (buffer);
    126 	}
    127 
    128 	entry_num=block_bitmap_info.entry_num;
    129 										/* Check for limits */
    130 	if (num > file_system_info.super_block.s_blocks_per_group-entry_num) {
    131 		wprintw (command_win,"Error - There aren't that much blocks in the group\n");
    132 		refresh_command_win ();return;
    133 	}
    134 
    135 	while (num) {								/* And call allocate_block */
    136 		allocate_block (entry_num);					/* for each block */
    137 		num--;entry_num++;
    138 	}
    139 
    140 	dispatch ("show");							/* Show the result */
    141 }
    142 
    143 void type_ext2_block_bitmap___deallocate (char *command_line)
    144 
    145 /* This is the opposite of the above function - We call deallocate_block instead of allocate_block */
    146 
    147 {
    148 	long entry_num,num=1;
    149 	char *ptr,buffer [80];
    150 
    151 	ptr=parse_word (command_line,buffer);
    152 	if (*ptr!=0) {
    153 		ptr=parse_word (ptr,buffer);
    154 		num=atol (buffer);
    155 	}
    156 
    157 	entry_num=block_bitmap_info.entry_num;
    158 	if (num > file_system_info.super_block.s_blocks_per_group-entry_num) {
    159 		wprintw (command_win,"Error - There aren't that much blocks in the group\n");
    160 		refresh_command_win ();return;
    161 	}
    162 
    163 	while (num) {
    164 		deallocate_block (entry_num);
    165 		num--;entry_num++;
    166 	}
    167 
    168 	dispatch ("show");
    169 }
    170 
    171 
    172 void allocate_block (long entry_num)
    173 
    174 /* In this function we convert the bit number into the right byte and inner bit positions. */
    175 
    176 {
    177 	unsigned char bit_mask=1;
    178 	int byte_offset,j;
    179 
    180 	byte_offset=entry_num/8;					/* Find the correct byte - entry_num/8 */
    181 									/* The position inside the byte is entry_num %8 */
    182 	for (j=0;j<entry_num%8;j++)
    183 		bit_mask*=2;						/* Generate the or mask - 1 at the right place */
    184 	type_data.u.buffer [byte_offset] |= bit_mask;			/* And apply it */
    185 }
    186 
    187 void deallocate_block (long entry_num)
    188 
    189 /* This is the opposite of allocate_block above. We use an and mask instead of an or mask. */
    190 
    191 {
    192 	unsigned char bit_mask=1;
    193 	int byte_offset,j;
    194 
    195 	byte_offset=entry_num/8;
    196 	for (j=0;j<entry_num%8;j++)
    197 		bit_mask*=2;
    198 	bit_mask^=0xff;
    199 
    200 	type_data.u.buffer [byte_offset] &= bit_mask;
    201 }
    202 
    203 void type_ext2_block_bitmap___show (char *command_line)
    204 
    205 /*
    206 
    207 We show the bitmap as a series of bits, grouped at 8-bit intervals. We display 8 such groups on each line.
    208 The current position (as known from block_bitmap_info.entry_num) is highlighted.
    209 
    210 */
    211 
    212 {
    213 	int i,j;
    214 	unsigned char *ptr;
    215 	unsigned long block_num,entry_num;
    216 
    217 	ptr=type_data.u.buffer;
    218 	show_pad_info.line=0;show_pad_info.max_line=-1;
    219 
    220 	wmove (show_pad,0,0);
    221 	for (i=0,entry_num=0;i<file_system_info.super_block.s_blocks_per_group/8;i++,ptr++) {
    222 		for (j=1;j<=128;j*=2) {						/* j contains the and bit mask */
    223 			if (entry_num==block_bitmap_info.entry_num) {		/* Highlight the current entry */
    224 				wattrset (show_pad,A_REVERSE);
    225 				show_pad_info.line=show_pad_info.max_line-show_pad_info.display_lines/2;
    226 			}
    227 
    228 			if ((*ptr) & j)						/* Apply the mask */
    229 				wprintw (show_pad,"1");
    230 			else
    231 				wprintw (show_pad,"0");
    232 
    233 			if (entry_num==block_bitmap_info.entry_num)
    234 				wattrset (show_pad,A_NORMAL);
    235 
    236 			entry_num++;						/* Pass to the next entry */
    237 		}
    238 		wprintw (show_pad," ");
    239 		if (i%8==7) {							/* Display 8 groups in a row */
    240 			wprintw (show_pad,"\n");
    241 			show_pad_info.max_line++;
    242 		}
    243 	}
    244 
    245 	refresh_show_pad ();
    246 	show_info ();								/* Show the usual information */
    247 
    248 										/* Show the group number */
    249 	wmove (show_win,1,0);
    250 	wprintw (show_win,"Block bitmap of block group %ld\n",block_bitmap_info.group_num);
    251 										/* Show the block number */
    252 
    253 	block_num=block_bitmap_info.entry_num+block_bitmap_info.group_num*file_system_info.super_block.s_blocks_per_group;
    254 	block_num+=file_system_info.super_block.s_first_data_block;
    255 
    256 	wprintw (show_win,"Status of block %ld - ",block_num);			/* and the allocation status */
    257 	ptr=type_data.u.buffer+block_bitmap_info.entry_num/8;
    258 	j=1;
    259 	for (i=block_bitmap_info.entry_num % 8;i>0;i--)
    260 		j*=2;
    261 	if ((*ptr) & j)
    262 		wprintw (show_win,"Allocated\n");
    263 	else
    264 		wprintw (show_win,"Free\n");
    265 	refresh_show_win ();
    266 }
    267