1583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/* 2583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 3583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/usr/src/ext2ed/blockbitmap_com.c 4583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 5583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oA part of the extended file system 2 disk editor. 6583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 7583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o------------------------- 8583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oHandles the block bitmap. 9583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o------------------------- 10583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 11583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oThis file implements the commands which are specific to the blockbitmap type. 12583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 13583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oFirst written on: July 5 1995 14583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 15583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oCopyright (C) 1995 Gadi Oxman 16583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 17583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/ 18583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 19583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o#include <stdio.h> 20583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o#include <stdlib.h> 21583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o#include <string.h> 22583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 23583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o#include "ext2ed.h" 24583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 25583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/* 26583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 27583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oThe functions in this file use the flobal structure block_bitmap_info. This structure contains the current 28583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oposition in the bitmap. 29583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 30583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/ 31583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 32583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_ext2_block_bitmap___entry (char *command_line) 33583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 34583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/* 35583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 36583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oThis function changes the current entry in the bitmap. It just changes the entry_num variable in block_bitmap_info 37583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oand dispatches a show command to show the new entry. 38583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 39583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/ 40583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 41583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{ 42583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o unsigned long entry_num; 43583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o char *ptr,buffer [80]; 44efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 45efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 46efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 47583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o ptr=parse_word (command_line,buffer); /* Get the requested entry */ 48583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (*ptr==0) { 49583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wprintw (command_win,"Error - No argument specified\n"); 50583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o refresh_command_win (); return; 51583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 52583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o ptr=parse_word (ptr,buffer); 53583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 54583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o entry_num=atol (buffer); 55583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 56efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 57583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (entry_num >= file_system_info.super_block.s_blocks_per_group) { /* Check if it is a valid entry number */ 58583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 59583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wprintw (command_win,"Error - Entry number out of bounds\n"); 60583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o refresh_command_win ();return; 61583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 62efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 63efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 64efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 65583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o block_bitmap_info.entry_num=entry_num; /* If it is, just change entry_num and */ 66583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o strcpy (buffer,"show");dispatch (buffer); /* dispatch a show command */ 67583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o} 68583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 69583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_ext2_block_bitmap___next (char *command_line) 70583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 71583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/* 72583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 73583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oThis function passes to the next entry in the bitmap. We just call the above entry command. 74583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 75583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/ 76583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 77583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{ 78583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o long entry_offset=1; 79583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o char *ptr,buffer [80]; 80efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 81583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o ptr=parse_word (command_line,buffer); 82583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (*ptr!=0) { 83583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o ptr=parse_word (ptr,buffer); 84583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o entry_offset=atol (buffer); 85583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 86583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 87583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o sprintf (buffer,"entry %ld",block_bitmap_info.entry_num+entry_offset); 88583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o dispatch (buffer); 89583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o} 90583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 91583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_ext2_block_bitmap___prev (char *command_line) 92583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 93583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{ 94583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o long entry_offset=1; 95583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o char *ptr,buffer [80]; 96efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 97583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o ptr=parse_word (command_line,buffer); 98583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (*ptr!=0) { 99583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o ptr=parse_word (ptr,buffer); 100583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o entry_offset=atol (buffer); 101583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 102583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 103583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o sprintf (buffer,"entry %ld",block_bitmap_info.entry_num-entry_offset); 104583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o dispatch (buffer); 105583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o} 106583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 107583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_ext2_block_bitmap___allocate (char *command_line) 108583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 109583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/* 110583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 111583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oThis function starts allocating block from the current position. Allocating involves setting the correct bits 112583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oin the bitmap. This function is a vector version of allocate_block below - We just run on the blocks that 113583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'owe need to allocate, and call allocate_block for each one. 114583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 115583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/ 116583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 117583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{ 118583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o long entry_num,num=1; 119583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o char *ptr,buffer [80]; 120efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 121583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o ptr=parse_word (command_line,buffer); /* Get the number of blocks to allocate */ 122583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (*ptr!=0) { 123583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o ptr=parse_word (ptr,buffer); 124583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o num=atol (buffer); 125583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 126efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 127583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o entry_num=block_bitmap_info.entry_num; 128583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o /* Check for limits */ 129583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (num > file_system_info.super_block.s_blocks_per_group-entry_num) { 130efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o wprintw (command_win,"Error - There aren't that much blocks in the group\n"); 131efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o refresh_command_win ();return; 132583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 133efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 134583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o while (num) { /* And call allocate_block */ 135583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o allocate_block (entry_num); /* for each block */ 136583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o num--;entry_num++; 137583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 138efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 139583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o dispatch ("show"); /* Show the result */ 140583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o} 141583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 142583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_ext2_block_bitmap___deallocate (char *command_line) 143583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 144583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/* This is the opposite of the above function - We call deallocate_block instead of allocate_block */ 145583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 146583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{ 147583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o long entry_num,num=1; 148583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o char *ptr,buffer [80]; 149efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 150583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o ptr=parse_word (command_line,buffer); 151583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (*ptr!=0) { 152583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o ptr=parse_word (ptr,buffer); 153583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o num=atol (buffer); 154583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 155efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 156583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o entry_num=block_bitmap_info.entry_num; 157583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (num > file_system_info.super_block.s_blocks_per_group-entry_num) { 158efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o wprintw (command_win,"Error - There aren't that much blocks in the group\n"); 159efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o refresh_command_win ();return; 160583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 161efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 162583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o while (num) { 163583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o deallocate_block (entry_num); 164583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o num--;entry_num++; 165583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 166efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 167583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o dispatch ("show"); 168583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o} 169583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 170583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 171583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid allocate_block (long entry_num) 172583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 173583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/* In this function we convert the bit number into the right byte and inner bit positions. */ 174583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 175583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{ 176583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o unsigned char bit_mask=1; 177583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o int byte_offset,j; 178efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 179583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o byte_offset=entry_num/8; /* Find the correct byte - entry_num/8 */ 180583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o /* The position inside the byte is entry_num %8 */ 181583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o for (j=0;j<entry_num%8;j++) 182583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o bit_mask*=2; /* Generate the or mask - 1 at the right place */ 183583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o type_data.u.buffer [byte_offset] |= bit_mask; /* And apply it */ 184583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o} 185583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 186583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid deallocate_block (long entry_num) 187583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 188583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/* This is the opposite of allocate_block above. We use an and mask instead of an or mask. */ 189583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 190583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{ 191583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o unsigned char bit_mask=1; 192583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o int byte_offset,j; 193efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 194583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o byte_offset=entry_num/8; 195583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o for (j=0;j<entry_num%8;j++) 196583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o bit_mask*=2; 197583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o bit_mask^=0xff; 198efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 199583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o type_data.u.buffer [byte_offset] &= bit_mask; 200583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o} 201583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 202583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_ext2_block_bitmap___show (char *command_line) 203583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 204583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/* 205583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 206583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oWe show the bitmap as a series of bits, grouped at 8-bit intervals. We display 8 such groups on each line. 207583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oThe current position (as known from block_bitmap_info.entry_num) is highlighted. 208583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 209583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/ 210583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 211583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{ 212583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o int i,j; 213583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o unsigned char *ptr; 214583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o unsigned long block_num,entry_num; 215583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 216583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o ptr=type_data.u.buffer; 217583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o show_pad_info.line=0;show_pad_info.max_line=-1; 218efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 219583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wmove (show_pad,0,0); 220583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o for (i=0,entry_num=0;i<file_system_info.super_block.s_blocks_per_group/8;i++,ptr++) { 221583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o for (j=1;j<=128;j*=2) { /* j contains the and bit mask */ 222583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (entry_num==block_bitmap_info.entry_num) { /* Highlight the current entry */ 223583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wattrset (show_pad,A_REVERSE); 224583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o show_pad_info.line=show_pad_info.max_line-show_pad_info.display_lines/2; 225583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 226583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 227583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if ((*ptr) & j) /* Apply the mask */ 228583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wprintw (show_pad,"1"); 229583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o else 230583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wprintw (show_pad,"0"); 231583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 232583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (entry_num==block_bitmap_info.entry_num) 233583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wattrset (show_pad,A_NORMAL); 234583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 235583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o entry_num++; /* Pass to the next entry */ 236583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 237583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wprintw (show_pad," "); 238583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o if (i%8==7) { /* Display 8 groups in a row */ 239583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wprintw (show_pad,"\n"); 240583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o show_pad_info.max_line++; 241583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 242583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o } 243efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 244efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o refresh_show_pad (); 245583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o show_info (); /* Show the usual information */ 246583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 247583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o /* Show the group number */ 248583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wmove (show_win,1,0); 249583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wprintw (show_win,"Block bitmap of block group %ld\n",block_bitmap_info.group_num); 250583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o /* Show the block number */ 251efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 252583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o block_num=block_bitmap_info.entry_num+block_bitmap_info.group_num*file_system_info.super_block.s_blocks_per_group; 253efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o block_num+=file_system_info.super_block.s_first_data_block; 254583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o 255583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wprintw (show_win,"Status of block %ld - ",block_num); /* and the allocation status */ 256583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o ptr=type_data.u.buffer+block_bitmap_info.entry_num/8; 257583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o j=1; 258583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o for (i=block_bitmap_info.entry_num % 8;i>0;i--) 259583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o j*=2; 260efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o if ((*ptr) & j) 261583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wprintw (show_win,"Allocated\n"); 262583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o else 263583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o wprintw (show_win,"Free\n"); 264583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o refresh_show_win (); 265583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o} 266