1583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/*
2583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
3583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o/usr/src/ext2ed/file_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'oCommands which handle a file
9583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o----------------------------
10583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
11583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oFirst written on: April 18 1995
12583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
13583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oCopyright (C) 1995 Gadi Oxman
14583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
15583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o*/
16583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
17583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o#include <stdio.h>
18583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o#include <stdlib.h>
19583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o#include <string.h>
20583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
21583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o#include "ext2ed.h"
22583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
23583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'oint init_file_info (void)
24583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
25583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
26583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	struct ext2_inode *ptr;
27efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
28583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	ptr=&type_data.u.t_ext2_inode;
29efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
30583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	file_info.inode_ptr=ptr;
31583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	file_info.inode_offset=device_offset;
32583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
33583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	file_info.global_block_num=ptr->i_block [0];
34583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	file_info.global_block_offset=ptr->i_block [0]*file_system_info.block_size;
35583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	file_info.block_num=0;
36583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	file_info.blocks_count=(ptr->i_size+file_system_info.block_size-1)/file_system_info.block_size;
37583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	file_info.file_offset=0;
38583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	file_info.file_length=ptr->i_size;
39583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	file_info.level=0;
40583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	file_info.offset_in_block=0;
41efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
42583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	file_info.display=HEX;
43583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
44583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	low_read (file_info.buffer,file_system_info.block_size,file_info.global_block_offset);
45efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
46583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	return (1);
47583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
48583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
49583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
50583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_file___inode (char *command_line)
51583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
52583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
53583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	dispatch ("settype ext2_inode");
54583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
55583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
56583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_file___show (char *command_line)
57583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
58583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
59583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (file_info.display==HEX)
60583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		file_show_hex ();
61583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (file_info.display==TEXT)
62583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		file_show_text ();
63583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
64583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
65583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_file___nextblock (char *command_line)
66583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
67583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
68583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	long block_offset=1;
69583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	char *ptr,buffer [80];
70583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
71583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	ptr=parse_word (command_line,buffer);
72efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
73583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (*ptr!=0) {
74583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		ptr=parse_word (ptr,buffer);
75583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		block_offset*=atol (buffer);
76583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
77583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
78583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (file_info.block_num+block_offset >= file_info.blocks_count) {
79583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		wprintw (command_win,"Error - Block offset out of range\n");wrefresh (command_win);
80583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		return;
81583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
82efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
83583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	file_info.block_num+=block_offset;
84583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	file_info.global_block_num=file_block_to_global_block (file_info.block_num,&file_info);
85583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	file_info.global_block_offset=file_info.global_block_num*file_system_info.block_size;
86583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	file_info.file_offset=file_info.block_num*file_system_info.block_size;
87583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
88583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	low_read (file_info.buffer,file_system_info.block_size,file_info.global_block_offset);
89583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
90583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	strcpy (buffer,"show");dispatch (buffer);
91583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
92583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
93583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_file___next (char *command_line)
94583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
95583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
96583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	int offset=1;
97583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	char *ptr,buffer [80];
98583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
99583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	ptr=parse_word (command_line,buffer);
100efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
101583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (*ptr!=0) {
102583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		ptr=parse_word (ptr,buffer);
103583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		offset*=atol (buffer);
104583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
105efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
106583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (file_info.offset_in_block+offset < file_system_info.block_size) {
107583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		file_info.offset_in_block+=offset;
108583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		sprintf (buffer,"show");dispatch (buffer);
109583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
110efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
111583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	else {
112583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		wprintw (command_win,"Error - Offset out of block\n");refresh_command_win ();
113583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
114583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
115583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
116583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_file___offset (char *command_line)
117583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
118583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
119583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	unsigned long offset;
120583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	char *ptr,buffer [80];
121583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
122583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	ptr=parse_word (command_line,buffer);
123efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
124583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (*ptr!=0) {
125583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		ptr=parse_word (ptr,buffer);
126583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		offset=atol (buffer);
127583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
128583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	else {
129583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		wprintw (command_win,"Error - Argument not specified\n");refresh_command_win ();
130583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		return;
131583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
132efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
133583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (offset < file_system_info.block_size) {
134583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		file_info.offset_in_block=offset;
135583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		sprintf (buffer,"show");dispatch (buffer);
136583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
137583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
138583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	else {
139583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		wprintw (command_win,"Error - Offset out of block\n");refresh_command_win ();
140583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
141583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
142583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
143583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_file___prev (char *command_line)
144583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
145583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
146583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	int offset=1;
147583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	char *ptr,buffer [80];
148583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
149583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	ptr=parse_word (command_line,buffer);
150efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
151583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (*ptr!=0) {
152583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		ptr=parse_word (ptr,buffer);
153583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		offset*=atol (buffer);
154583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
155efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
156583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (file_info.offset_in_block-offset >= 0) {
157583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		file_info.offset_in_block-=offset;
158583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		sprintf (buffer,"show");dispatch (buffer);
159583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
160efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
161583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	else {
162583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		wprintw (command_win,"Error - Offset out of block\n");refresh_command_win ();
163583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
164583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
165583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
166583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_file___prevblock (char *command_line)
167583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
168583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
169583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	long block_offset=1;
170583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	char *ptr,buffer [80];
171583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
172583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	ptr=parse_word (command_line,buffer);
173efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
174583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (*ptr!=0) {
175583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		ptr=parse_word (ptr,buffer);
176583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		block_offset*=atol (buffer);
177583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
178583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
179583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (file_info.block_num-block_offset < 0) {
180583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		wprintw (command_win,"Error - Block offset out of range\n");wrefresh (command_win);
181583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		return;
182583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
183efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
184583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	file_info.block_num-=block_offset;
185583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	file_info.global_block_num=file_block_to_global_block (file_info.block_num,&file_info);
186583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	file_info.global_block_offset=file_info.global_block_num*file_system_info.block_size;
187583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	file_info.file_offset=file_info.block_num*file_system_info.block_size;
188583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
189583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	low_read (file_info.buffer,file_system_info.block_size,file_info.global_block_offset);
190583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
191583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	strcpy (buffer,"show");dispatch (buffer);
192583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
193583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
194583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_file___block (char *command_line)
195583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
196583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
197583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	long block_offset=1;
198583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	char *ptr,buffer [80];
199583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
200583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	ptr=parse_word (command_line,buffer);
201efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
202583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (*ptr==0) {
203583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		wprintw (command_win,"Error - Invalid arguments\n");wrefresh (command_win);
204583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		return;
205583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
206efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
207583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	ptr=parse_word (ptr,buffer);
208583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	block_offset=atol (buffer);
209583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
210583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (block_offset < 0 || block_offset >= file_info.blocks_count) {
211583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		wprintw (command_win,"Error - Block offset out of range\n");wrefresh (command_win);
212583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		return;
213583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
214583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
215583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	file_info.block_num=block_offset;
216583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	file_info.global_block_num=file_block_to_global_block (file_info.block_num,&file_info);
217583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	file_info.global_block_offset=file_info.global_block_num*file_system_info.block_size;
218583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	file_info.file_offset=file_info.block_num*file_system_info.block_size;
219583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
220583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	low_read (file_info.buffer,file_system_info.block_size,file_info.global_block_offset);
221583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
222583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	strcpy (buffer,"show");dispatch (buffer);
223583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
224583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
225583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_file___display (char *command_line)
226583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
227583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
228583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	char *ptr,buffer [80];
229efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
230583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	ptr=parse_word (command_line,buffer);
231efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o	if (*ptr==0)
232583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		strcpy (buffer,"hex");
233583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	else
234583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		ptr=parse_word (ptr,buffer);
235efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
236583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (strcasecmp (buffer,"hex")==0) {
237583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		wprintw (command_win,"Display set to hex\n");wrefresh (command_win);
238583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		file_info.display=HEX;
239583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		sprintf (buffer,"show");dispatch (buffer);
240583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
241efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
242583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	else if (strcasecmp (buffer,"text")==0) {
243583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		wprintw (command_win,"Display set to text\n");wrefresh (command_win);
244583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		file_info.display=TEXT;
245583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		sprintf (buffer,"show");dispatch (buffer);
246583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
247efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
248583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	else {
249583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		wprintw (command_win,"Error - Invalid arguments\n");wrefresh (command_win);
250583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
251583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
252583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
253583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid file_show_hex (void)
254583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
255583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
256583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	long offset=0,l,i;
257583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	unsigned char *ch_ptr;
258efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
259583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	/* device_offset and type_data points to the inode */
260583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
261583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	show_pad_info.line=0;
262efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
263583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	wmove (show_pad,0,0);
264583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	ch_ptr=file_info.buffer;
265583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	for (l=0;l<file_system_info.block_size/16;l++) {
266583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		if (file_info.file_offset+offset>file_info.file_length-1) break;
267583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		wprintw (show_pad,"%08ld :  ",offset);
268583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		for (i=0;i<16;i++) {
269efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
270583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			if (file_info.file_offset+offset+i>file_info.file_length-1) {
271583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o				wprintw (show_pad," ");
272583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			}
273efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
274583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			else {
275583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o				if (file_info.offset_in_block==offset+i)
276583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o					wattrset (show_pad,A_REVERSE);
277583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
278583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o				if (ch_ptr [i]>=' ' && ch_ptr [i]<='z')
279583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o					wprintw (show_pad,"%c",ch_ptr [i]);
280583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o				else
281583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o					wprintw (show_pad,".");
282583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
283583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o				if (file_info.offset_in_block==offset+i)
284583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o					wattrset (show_pad,A_NORMAL);
285583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			}
286583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		}
287583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
288583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		wprintw (show_pad,"   ");
289583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		for (i=0;i<16;i++) {
290583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			if (file_info.file_offset+offset+i>file_info.file_length-1) break;
291583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			if (file_info.offset_in_block==offset+i)
292583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o				wattrset (show_pad,A_REVERSE);
293583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
294583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			wprintw (show_pad,"%02x",ch_ptr [i]);
295583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
296583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			if (file_info.offset_in_block==offset+i) {
297583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o				wattrset (show_pad,A_NORMAL);
298583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o				show_pad_info.line=l-l % show_pad_info.display_lines;
299583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			}
300efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
301583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			wprintw (show_pad," ");
302efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
303583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		}
304583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
305583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		wprintw (show_pad,"\n");
306583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		offset+=i;
307583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		ch_ptr+=i;
308583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
309efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
310583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	show_pad_info.max_line=l-1;
311efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
312583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	refresh_show_pad ();
313efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
314583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	show_status ();
315583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
316583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
317583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid file_show_text (void)
318583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
319583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
320583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	long offset=0,last_offset,l=0,cols=0;
321583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	unsigned char *ch_ptr;
322efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
323583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	/* device_offset and type_data points to the inode */
324583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
325583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	show_pad_info.line=0;
326583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	wmove (show_pad,0,0);
327583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	ch_ptr=file_info.buffer;
328583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
329583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	last_offset=file_system_info.block_size-1;
330583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
331583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (file_info.file_offset+last_offset > file_info.file_length-1)
332583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		last_offset=file_info.file_length-1-file_info.file_offset;
333efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
334583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	while ( (offset <= last_offset) && l<SHOW_PAD_LINES) {
335583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
336583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		if (cols==SHOW_PAD_COLS-1) {
337583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			wprintw (show_pad,"\n");
338583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			l++;cols=0;
339583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		}
340efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
341583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
342583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		if (file_info.offset_in_block==offset)
343583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			wattrset (show_pad,A_REVERSE);
344583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
345583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		if (*ch_ptr >= ' ' && *ch_ptr <= 'z')
346583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			wprintw (show_pad,"%c",*ch_ptr);
347583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
348583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
349583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		else {
350583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			if (*ch_ptr == 0xa) {
351583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o				wprintw (show_pad,"\n");
352583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o				l++;cols=0;
353583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			}
354583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
355583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			else if (*ch_ptr == 0x9)
356583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o				wprintw (show_pad,"    ");
357efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
358583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			else
359583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o				wprintw (show_pad,".");
360583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		}
361583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
362583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		if (file_info.offset_in_block==offset) {
363583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			wattrset (show_pad,A_NORMAL);
364583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			show_pad_info.line=l-l % show_pad_info.display_lines;
365583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		}
366efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
367583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
368583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		offset++;cols++;ch_ptr++;
369583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
370efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
371583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	wprintw (show_pad,"\n");
372583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	show_pad_info.max_line=l;
373efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
374583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	refresh_show_pad ();
375efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
376efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o	show_status ();
377583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
378583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
379583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid show_status (void)
380583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
381583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
382583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	long inode_num;
383efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
384583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	werase (show_win);wmove (show_win,0,0);
385583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	wprintw (show_win,"File contents. Block %ld. ",file_info.global_block_num);
386583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	wprintw (show_win,"File block %ld of %ld. ",file_info.block_num,file_info.blocks_count-1);
387583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	wprintw (show_win,"File Offset %ld of %ld.",file_info.file_offset,file_info.file_length-1);
388efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
389583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	wmove (show_win,1,0);
390583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	inode_num=inode_offset_to_inode_num (file_info.inode_offset);
391583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	wprintw (show_win,"File inode %ld. Indirection level %ld.",inode_num,file_info.level);
392583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
393583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	refresh_show_win ();
394583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
395583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
396583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_file___remember (char *command_line)
397583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
398583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
399583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	int found=0;
400583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	long entry_num;
401583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	char *ptr,buffer [80];
402583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	struct struct_descriptor *descriptor_ptr;
403efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
404583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	ptr=parse_word (command_line,buffer);
405efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
406583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (*ptr==0) {
407583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		wprintw (command_win,"Error - Argument not specified\n");wrefresh (command_win);
408efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o		return;
409583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
410efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
411583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	ptr=parse_word (ptr,buffer);
412583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
413583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	entry_num=remember_lifo.entries_count++;
414583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (entry_num>REMEMBER_COUNT-1) {
415583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		entry_num=0;
416583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		remember_lifo.entries_count--;
417583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
418efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
419583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	descriptor_ptr=first_type;
420583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	while (descriptor_ptr!=NULL && !found) {
421583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		if (strcmp (descriptor_ptr->name,"ext2_inode")==0)
422583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			found=1;
423583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		else
424583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			descriptor_ptr=descriptor_ptr->next;
425583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
426583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
427583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
428583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	remember_lifo.offset [entry_num]=device_offset;
429583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	remember_lifo.type [entry_num]=descriptor_ptr;
430583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	strcpy (remember_lifo.name [entry_num],buffer);
431efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
432583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	wprintw (command_win,"Object %s in Offset %ld remembered as %s\n",descriptor_ptr->name,device_offset,buffer);
433583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	wrefresh (command_win);
434583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
435583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
436583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_file___set (char *command_line)
437583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
438583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
439583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	unsigned char tmp;
440583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	char *ptr,buffer [80],*ch_ptr;
441583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	int mode=HEX;
442efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
443583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	ptr=parse_word (command_line,buffer);
444583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (*ptr==0) {
445583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		wprintw (command_win,"Error - Argument not specified\n");refresh_command_win ();return;
446583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
447583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
448583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	ptr=parse_word (ptr,buffer);
449583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
450583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (strcasecmp (buffer,"text")==0) {
451583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		mode=TEXT;
452583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		strcpy (buffer,ptr);
453583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
454583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
455583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	else if (strcasecmp (buffer,"hex")==0) {
456583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		mode=HEX;
457583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		ptr=parse_word (ptr,buffer);
458583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
459583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
460583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (*buffer==0) {
461583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		wprintw (command_win,"Error - Data not specified\n");refresh_command_win ();return;
462583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
463583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
464583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (mode==HEX) {
465583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		do {
466583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			tmp=(unsigned char) strtol (buffer,NULL,16);
467583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			file_info.buffer [file_info.offset_in_block]=tmp;
468583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			file_info.offset_in_block++;
469583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			ptr=parse_word (ptr,buffer);
470583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			if (file_info.offset_in_block==file_system_info.block_size) {
471583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o				if (*ptr) {
472583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o					wprintw (command_win,"Error - Ending offset outside block, only partial string changed\n");
473583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o					refresh_command_win ();
474583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o				}
475583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o				file_info.offset_in_block--;
476583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			}
477583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		} while (*buffer) ;
478583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
479583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
480583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	else {
481583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		ch_ptr=buffer;
482583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		while (*ch_ptr) {
483583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			tmp=(unsigned char) *ch_ptr++;
484583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			file_info.buffer [file_info.offset_in_block]=tmp;
485583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			file_info.offset_in_block++;
486583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			if (file_info.offset_in_block==file_system_info.block_size) {
487583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o				if (*ch_ptr) {
488583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o					wprintw (command_win,"Error - Ending offset outside block, only partial string changed\n");
489583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o					refresh_command_win ();
490583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o				}
491583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o				file_info.offset_in_block--;
492583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o			}
493583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		}
494583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
495efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
496583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	strcpy (buffer,"show");dispatch (buffer);
497583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
498583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
499583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'ovoid type_file___writedata (char *command_line)
500583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
501583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
502583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	low_write (file_info.buffer,file_system_info.block_size,file_info.global_block_offset);
503583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	return;
504583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
505583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
506583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'olong file_block_to_global_block (long file_block,struct struct_file_info *file_info_ptr)
507583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
508583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
509583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	long last_direct,last_indirect,last_dindirect;
510efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
511583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	last_direct=EXT2_NDIR_BLOCKS-1;
512583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	last_indirect=last_direct+file_system_info.block_size/4;
513583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	last_dindirect=last_indirect+(file_system_info.block_size/4)*(file_system_info.block_size/4);
514583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
515583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (file_block <= last_direct) {
516583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		file_info_ptr->level=0;
517583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		return (file_info_ptr->inode_ptr->i_block [file_block]);
518583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
519efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
520583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (file_block <= last_indirect) {
521583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		file_info_ptr->level=1;
522583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		file_block=file_block-last_direct-1;
523583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		return (return_indirect (file_info_ptr->inode_ptr->i_block [EXT2_IND_BLOCK],file_block));
524583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
525583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
526583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	if (file_block <= last_dindirect) {
527583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		file_info_ptr->level=2;
528583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		file_block=file_block-last_indirect-1;
529583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o		return (return_dindirect (file_info_ptr->inode_ptr->i_block [EXT2_DIND_BLOCK],file_block));
530583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	}
531583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
532583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	file_info_ptr->level=3;
533583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	file_block=file_block-last_dindirect-1;
534583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	return (return_tindirect (file_info_ptr->inode_ptr->i_block [EXT2_TIND_BLOCK],file_block));
535583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
536583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
537583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'olong return_indirect (long table_block,long block_num)
538583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
539583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
540583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	long block_table [EXT2_MAX_BLOCK_SIZE/4];
541efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
542583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	low_read ((char *) block_table,file_system_info.block_size,table_block*file_system_info.block_size);
543efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o	return (block_table [block_num]);
544583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
545583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
546583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'olong return_dindirect (long table_block,long block_num)
547583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
548583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
549583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	long f_indirect;
550efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
551583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	f_indirect=block_num/(file_system_info.block_size/4);
552583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	f_indirect=return_indirect (table_block,f_indirect);
553583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	return (return_indirect (f_indirect,block_num%(file_system_info.block_size/4)));
554583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
555583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
556583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'olong return_tindirect (long table_block,long block_num)
557583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o
558583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o{
559583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	long s_indirect;
560efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
561583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	s_indirect=block_num/((file_system_info.block_size/4)*(file_system_info.block_size/4));
562583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	s_indirect=return_indirect (table_block,s_indirect);
563583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o	return (return_dindirect (s_indirect,block_num%((file_system_info.block_size/4)*(file_system_info.block_size/4))));
564583a1ce5d1b225a6b01fc2b30a3bcb21fd0d48c9Theodore Ts'o}
565