1*6a54128fSAndroid Build Coastguard Worker /*
2*6a54128fSAndroid Build Coastguard Worker
3*6a54128fSAndroid Build Coastguard Worker /usr/src/ext2ed/general_com.c
4*6a54128fSAndroid Build Coastguard Worker
5*6a54128fSAndroid Build Coastguard Worker A part of the extended file system 2 disk editor.
6*6a54128fSAndroid Build Coastguard Worker
7*6a54128fSAndroid Build Coastguard Worker ---------------------
8*6a54128fSAndroid Build Coastguard Worker General user commands
9*6a54128fSAndroid Build Coastguard Worker ---------------------
10*6a54128fSAndroid Build Coastguard Worker
11*6a54128fSAndroid Build Coastguard Worker First written on: April 9 1995
12*6a54128fSAndroid Build Coastguard Worker
13*6a54128fSAndroid Build Coastguard Worker Copyright (C) 1995 Gadi Oxman
14*6a54128fSAndroid Build Coastguard Worker
15*6a54128fSAndroid Build Coastguard Worker */
16*6a54128fSAndroid Build Coastguard Worker
17*6a54128fSAndroid Build Coastguard Worker #include "config.h"
18*6a54128fSAndroid Build Coastguard Worker #include <stdio.h>
19*6a54128fSAndroid Build Coastguard Worker #include <stdlib.h>
20*6a54128fSAndroid Build Coastguard Worker #include <string.h>
21*6a54128fSAndroid Build Coastguard Worker
22*6a54128fSAndroid Build Coastguard Worker #include "ext2ed.h"
23*6a54128fSAndroid Build Coastguard Worker #include "../version.h"
24*6a54128fSAndroid Build Coastguard Worker
help(char * command_line)25*6a54128fSAndroid Build Coastguard Worker void help (char *command_line)
26*6a54128fSAndroid Build Coastguard Worker
27*6a54128fSAndroid Build Coastguard Worker {
28*6a54128fSAndroid Build Coastguard Worker int i,max_line=0;
29*6a54128fSAndroid Build Coastguard Worker char argument [80],*ptr;
30*6a54128fSAndroid Build Coastguard Worker
31*6a54128fSAndroid Build Coastguard Worker werase (show_pad);wmove (show_pad,0,0);
32*6a54128fSAndroid Build Coastguard Worker
33*6a54128fSAndroid Build Coastguard Worker ptr=parse_word (command_line,argument);
34*6a54128fSAndroid Build Coastguard Worker
35*6a54128fSAndroid Build Coastguard Worker if (*ptr!=0) {
36*6a54128fSAndroid Build Coastguard Worker ptr=parse_word (ptr,argument);
37*6a54128fSAndroid Build Coastguard Worker if (*argument!=0) {
38*6a54128fSAndroid Build Coastguard Worker detailed_help (argument);
39*6a54128fSAndroid Build Coastguard Worker return;
40*6a54128fSAndroid Build Coastguard Worker }
41*6a54128fSAndroid Build Coastguard Worker }
42*6a54128fSAndroid Build Coastguard Worker
43*6a54128fSAndroid Build Coastguard Worker if (current_type!=NULL) {
44*6a54128fSAndroid Build Coastguard Worker
45*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad,"Type %s specific commands:\n",current_type->name);max_line++;
46*6a54128fSAndroid Build Coastguard Worker
47*6a54128fSAndroid Build Coastguard Worker if (current_type->type_commands.last_command==-1) {
48*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad,"\nnone\n");max_line+=2;
49*6a54128fSAndroid Build Coastguard Worker }
50*6a54128fSAndroid Build Coastguard Worker else
51*6a54128fSAndroid Build Coastguard Worker for (i=0;i<=current_type->type_commands.last_command;i++) {
52*6a54128fSAndroid Build Coastguard Worker if (i%5==0) {
53*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad,"\n");max_line++;
54*6a54128fSAndroid Build Coastguard Worker }
55*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad,"%-13s",current_type->type_commands.names [i]);
56*6a54128fSAndroid Build Coastguard Worker if (i%5!=4)
57*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad,"; ");
58*6a54128fSAndroid Build Coastguard Worker }
59*6a54128fSAndroid Build Coastguard Worker
60*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad,"\n\n");max_line+=2;
61*6a54128fSAndroid Build Coastguard Worker }
62*6a54128fSAndroid Build Coastguard Worker
63*6a54128fSAndroid Build Coastguard Worker if (ext2_commands.last_command != -1) {
64*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad,"ext2 filesystem general commands: \n");max_line++;
65*6a54128fSAndroid Build Coastguard Worker for (i=0;i<=ext2_commands.last_command;i++) {
66*6a54128fSAndroid Build Coastguard Worker if (i%5==0) {
67*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad,"\n");max_line++;
68*6a54128fSAndroid Build Coastguard Worker }
69*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad,"%-13s",ext2_commands.names [i]);
70*6a54128fSAndroid Build Coastguard Worker if (i%5!=4)
71*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad,"; ");
72*6a54128fSAndroid Build Coastguard Worker
73*6a54128fSAndroid Build Coastguard Worker }
74*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad,"\n\n");max_line+=2;
75*6a54128fSAndroid Build Coastguard Worker }
76*6a54128fSAndroid Build Coastguard Worker
77*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad,"General commands: \n");
78*6a54128fSAndroid Build Coastguard Worker
79*6a54128fSAndroid Build Coastguard Worker for (i=0;i<=general_commands.last_command;i++) {
80*6a54128fSAndroid Build Coastguard Worker if (i%5==0) {
81*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad,"\n");max_line++;
82*6a54128fSAndroid Build Coastguard Worker }
83*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad,"%-13s",general_commands.names [i]);
84*6a54128fSAndroid Build Coastguard Worker if (i%5!=4)
85*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad,"; ");
86*6a54128fSAndroid Build Coastguard Worker }
87*6a54128fSAndroid Build Coastguard Worker
88*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad,"\n\n");max_line+=2;
89*6a54128fSAndroid Build Coastguard Worker
90*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad,"EXT2ED ver %s (%s)\n",E2FSPROGS_VERSION, E2FSPROGS_DATE);
91*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad,"Copyright (C) 1995 Gadi Oxman\n");
92*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad,"Reviewed 2001 Christian Bac\n");
93*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad,"Modified and enhanced by Theodore Ts'o, 2002\n");
94*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad,"EXT2ED is hereby placed under the terms of the GNU General Public License.\n\n");
95*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad,"EXT2ED was programmed as a student project in the software laboratory\n");
96*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad,"of the faculty of electrical engineering in the\n");
97*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad,"Technion - Israel Institute of Technology\n");
98*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad,"with the guide of Avner Lottem and Dr. Ilana David.\n");
99*6a54128fSAndroid Build Coastguard Worker
100*6a54128fSAndroid Build Coastguard Worker max_line+=10;
101*6a54128fSAndroid Build Coastguard Worker
102*6a54128fSAndroid Build Coastguard Worker show_pad_info.line=0;show_pad_info.max_line=max_line;
103*6a54128fSAndroid Build Coastguard Worker
104*6a54128fSAndroid Build Coastguard Worker werase (show_win);wmove (show_win,0,0);
105*6a54128fSAndroid Build Coastguard Worker wprintw (show_win,"EXT2ED help");
106*6a54128fSAndroid Build Coastguard Worker
107*6a54128fSAndroid Build Coastguard Worker refresh_show_win ();
108*6a54128fSAndroid Build Coastguard Worker refresh_show_pad ();
109*6a54128fSAndroid Build Coastguard Worker }
110*6a54128fSAndroid Build Coastguard Worker
detailed_help(char * text)111*6a54128fSAndroid Build Coastguard Worker void detailed_help (char *text)
112*6a54128fSAndroid Build Coastguard Worker
113*6a54128fSAndroid Build Coastguard Worker {
114*6a54128fSAndroid Build Coastguard Worker int i;
115*6a54128fSAndroid Build Coastguard Worker
116*6a54128fSAndroid Build Coastguard Worker if (current_type != NULL)
117*6a54128fSAndroid Build Coastguard Worker for (i=0;i<=current_type->type_commands.last_command;i++) {
118*6a54128fSAndroid Build Coastguard Worker if (strcmp (current_type->type_commands.names [i],text)==0) {
119*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad,"%s - %s\n",text,current_type->type_commands.descriptions [i]);
120*6a54128fSAndroid Build Coastguard Worker refresh_show_pad ();return;
121*6a54128fSAndroid Build Coastguard Worker }
122*6a54128fSAndroid Build Coastguard Worker }
123*6a54128fSAndroid Build Coastguard Worker
124*6a54128fSAndroid Build Coastguard Worker for (i=0;i<=ext2_commands.last_command;i++) {
125*6a54128fSAndroid Build Coastguard Worker if (strcmp (ext2_commands.names [i],text)==0) {
126*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad,"%s - %s\n",text,ext2_commands.descriptions [i]);
127*6a54128fSAndroid Build Coastguard Worker refresh_show_pad ();return;
128*6a54128fSAndroid Build Coastguard Worker }
129*6a54128fSAndroid Build Coastguard Worker }
130*6a54128fSAndroid Build Coastguard Worker
131*6a54128fSAndroid Build Coastguard Worker for (i=0;i<=general_commands.last_command;i++) {
132*6a54128fSAndroid Build Coastguard Worker if (strcmp (general_commands.names [i],text)==0) {
133*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad,"%s - %s\n",text,general_commands.descriptions [i]);
134*6a54128fSAndroid Build Coastguard Worker refresh_show_pad ();return;
135*6a54128fSAndroid Build Coastguard Worker }
136*6a54128fSAndroid Build Coastguard Worker }
137*6a54128fSAndroid Build Coastguard Worker
138*6a54128fSAndroid Build Coastguard Worker if (strcmp ("quit",text)==0) {
139*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad,"quit - Exists EXT2ED");
140*6a54128fSAndroid Build Coastguard Worker refresh_show_pad ();return;
141*6a54128fSAndroid Build Coastguard Worker }
142*6a54128fSAndroid Build Coastguard Worker
143*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad,"Error - Command %s not available now\n",text);
144*6a54128fSAndroid Build Coastguard Worker refresh_show_pad ();return;
145*6a54128fSAndroid Build Coastguard Worker }
146*6a54128fSAndroid Build Coastguard Worker
147*6a54128fSAndroid Build Coastguard Worker
148*6a54128fSAndroid Build Coastguard Worker
set_device(char * command_line)149*6a54128fSAndroid Build Coastguard Worker void set_device (char *command_line)
150*6a54128fSAndroid Build Coastguard Worker
151*6a54128fSAndroid Build Coastguard Worker {
152*6a54128fSAndroid Build Coastguard Worker char *ptr,new_device [80];
153*6a54128fSAndroid Build Coastguard Worker
154*6a54128fSAndroid Build Coastguard Worker ptr=parse_word (command_line,new_device);
155*6a54128fSAndroid Build Coastguard Worker if (*ptr==0) {
156*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Error - Device name not specified\n");
157*6a54128fSAndroid Build Coastguard Worker refresh_command_win ();return;
158*6a54128fSAndroid Build Coastguard Worker }
159*6a54128fSAndroid Build Coastguard Worker parse_word (ptr,new_device);
160*6a54128fSAndroid Build Coastguard Worker check_mounted (new_device);
161*6a54128fSAndroid Build Coastguard Worker if (mounted && !AllowMountedRead) {
162*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Error - Filesystem is mounted, aborting\n");
163*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"You may wish to use the AllowMountedRead on configuration option\n");
164*6a54128fSAndroid Build Coastguard Worker refresh_command_win ();return;
165*6a54128fSAndroid Build Coastguard Worker }
166*6a54128fSAndroid Build Coastguard Worker
167*6a54128fSAndroid Build Coastguard Worker if (mounted && AllowMountedRead) {
168*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Warning - Filesystem is mounted. Displayed data may be unreliable.\n");
169*6a54128fSAndroid Build Coastguard Worker refresh_command_win ();
170*6a54128fSAndroid Build Coastguard Worker }
171*6a54128fSAndroid Build Coastguard Worker
172*6a54128fSAndroid Build Coastguard Worker if (device_handle!=NULL)
173*6a54128fSAndroid Build Coastguard Worker fclose (device_handle);
174*6a54128fSAndroid Build Coastguard Worker
175*6a54128fSAndroid Build Coastguard Worker if ( (device_handle=fopen (new_device,"rb"))==NULL) {
176*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Error - Can not open device %s\n",new_device);refresh_command_win ();
177*6a54128fSAndroid Build Coastguard Worker return;
178*6a54128fSAndroid Build Coastguard Worker }
179*6a54128fSAndroid Build Coastguard Worker else {
180*6a54128fSAndroid Build Coastguard Worker strcpy (device_name,new_device);
181*6a54128fSAndroid Build Coastguard Worker write_access=0; /* Write access disabled */
182*6a54128fSAndroid Build Coastguard Worker current_type=NULL; /* There is no type now */
183*6a54128fSAndroid Build Coastguard Worker remember_lifo.entries_count=0; /* Empty Object memory */
184*6a54128fSAndroid Build Coastguard Worker free_user_commands (&ext2_commands); /* Free filesystem specific objects */
185*6a54128fSAndroid Build Coastguard Worker free_struct_descriptors ();
186*6a54128fSAndroid Build Coastguard Worker if (!set_file_system_info ()) { /* Error while getting info --> abort */
187*6a54128fSAndroid Build Coastguard Worker free_user_commands (&ext2_commands);
188*6a54128fSAndroid Build Coastguard Worker free_struct_descriptors ();
189*6a54128fSAndroid Build Coastguard Worker fclose (device_handle);
190*6a54128fSAndroid Build Coastguard Worker device_handle=NULL; /* Notice that our device is still not set up */
191*6a54128fSAndroid Build Coastguard Worker device_offset=-1;
192*6a54128fSAndroid Build Coastguard Worker return;
193*6a54128fSAndroid Build Coastguard Worker }
194*6a54128fSAndroid Build Coastguard Worker if (*AlternateDescriptors) /* Check if user defined objects exist */
195*6a54128fSAndroid Build Coastguard Worker set_struct_descriptors (AlternateDescriptors);
196*6a54128fSAndroid Build Coastguard Worker dispatch ("setoffset 0");
197*6a54128fSAndroid Build Coastguard Worker dispatch ("help"); /* Show help screen */
198*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Device changed to %s",device_name);refresh_command_win ();
199*6a54128fSAndroid Build Coastguard Worker }
200*6a54128fSAndroid Build Coastguard Worker }
201*6a54128fSAndroid Build Coastguard Worker
set_offset(char * command_line)202*6a54128fSAndroid Build Coastguard Worker void set_offset (char *command_line)
203*6a54128fSAndroid Build Coastguard Worker
204*6a54128fSAndroid Build Coastguard Worker {
205*6a54128fSAndroid Build Coastguard Worker long mult=1;
206*6a54128fSAndroid Build Coastguard Worker long new_offset;
207*6a54128fSAndroid Build Coastguard Worker char *ptr,new_offset_buffer [80];
208*6a54128fSAndroid Build Coastguard Worker
209*6a54128fSAndroid Build Coastguard Worker if (device_handle==NULL) {
210*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Error - No device opened\n");refresh_command_win ();
211*6a54128fSAndroid Build Coastguard Worker return;
212*6a54128fSAndroid Build Coastguard Worker }
213*6a54128fSAndroid Build Coastguard Worker
214*6a54128fSAndroid Build Coastguard Worker ptr=parse_word (command_line,new_offset_buffer);
215*6a54128fSAndroid Build Coastguard Worker
216*6a54128fSAndroid Build Coastguard Worker if (*ptr==0) {
217*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Error - No argument specified\n");refresh_command_win ();
218*6a54128fSAndroid Build Coastguard Worker return;
219*6a54128fSAndroid Build Coastguard Worker }
220*6a54128fSAndroid Build Coastguard Worker
221*6a54128fSAndroid Build Coastguard Worker ptr=parse_word (ptr,new_offset_buffer);
222*6a54128fSAndroid Build Coastguard Worker
223*6a54128fSAndroid Build Coastguard Worker if (strcmp (new_offset_buffer,"block")==0) {
224*6a54128fSAndroid Build Coastguard Worker mult=file_system_info.block_size;
225*6a54128fSAndroid Build Coastguard Worker ptr=parse_word (ptr,new_offset_buffer);
226*6a54128fSAndroid Build Coastguard Worker }
227*6a54128fSAndroid Build Coastguard Worker
228*6a54128fSAndroid Build Coastguard Worker if (strcmp (new_offset_buffer,"type")==0) {
229*6a54128fSAndroid Build Coastguard Worker if (current_type==NULL) {
230*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Error - No type set\n");refresh_command_win ();
231*6a54128fSAndroid Build Coastguard Worker return;
232*6a54128fSAndroid Build Coastguard Worker }
233*6a54128fSAndroid Build Coastguard Worker
234*6a54128fSAndroid Build Coastguard Worker mult=current_type->length;
235*6a54128fSAndroid Build Coastguard Worker ptr=parse_word (ptr,new_offset_buffer);
236*6a54128fSAndroid Build Coastguard Worker }
237*6a54128fSAndroid Build Coastguard Worker
238*6a54128fSAndroid Build Coastguard Worker if (*new_offset_buffer==0) {
239*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Error - No offset specified\n");refresh_command_win ();
240*6a54128fSAndroid Build Coastguard Worker return;
241*6a54128fSAndroid Build Coastguard Worker }
242*6a54128fSAndroid Build Coastguard Worker
243*6a54128fSAndroid Build Coastguard Worker if (new_offset_buffer [0]=='+') {
244*6a54128fSAndroid Build Coastguard Worker if (device_offset==-1) {
245*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Error - Select a fixed offset first\n");refresh_command_win ();
246*6a54128fSAndroid Build Coastguard Worker return;
247*6a54128fSAndroid Build Coastguard Worker }
248*6a54128fSAndroid Build Coastguard Worker new_offset=device_offset+atol (new_offset_buffer+1)*mult;
249*6a54128fSAndroid Build Coastguard Worker }
250*6a54128fSAndroid Build Coastguard Worker
251*6a54128fSAndroid Build Coastguard Worker else if (new_offset_buffer [0]=='-') {
252*6a54128fSAndroid Build Coastguard Worker if (device_offset==-1) {
253*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Error - Select a fixed offset first\n");refresh_command_win ();
254*6a54128fSAndroid Build Coastguard Worker return;
255*6a54128fSAndroid Build Coastguard Worker }
256*6a54128fSAndroid Build Coastguard Worker new_offset=device_offset-atol (new_offset_buffer+1)*mult;
257*6a54128fSAndroid Build Coastguard Worker if (new_offset<0) new_offset=0;
258*6a54128fSAndroid Build Coastguard Worker }
259*6a54128fSAndroid Build Coastguard Worker
260*6a54128fSAndroid Build Coastguard Worker else
261*6a54128fSAndroid Build Coastguard Worker new_offset=atol (new_offset_buffer)*mult;
262*6a54128fSAndroid Build Coastguard Worker
263*6a54128fSAndroid Build Coastguard Worker if ( (fseek (device_handle,new_offset,SEEK_SET))==-1) {
264*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Error - Failed to seek to offset %ld in device %s\n",new_offset,device_name);
265*6a54128fSAndroid Build Coastguard Worker refresh_command_win ();
266*6a54128fSAndroid Build Coastguard Worker return;
267*6a54128fSAndroid Build Coastguard Worker };
268*6a54128fSAndroid Build Coastguard Worker device_offset=new_offset;
269*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Device offset changed to %ld\n",device_offset);refresh_command_win ();
270*6a54128fSAndroid Build Coastguard Worker load_type_data ();
271*6a54128fSAndroid Build Coastguard Worker type_data.offset_in_block=0;
272*6a54128fSAndroid Build Coastguard Worker }
273*6a54128fSAndroid Build Coastguard Worker
set_int(short len,void * ptr,char * name,char * value)274*6a54128fSAndroid Build Coastguard Worker void set_int(short len, void *ptr, char *name, char *value)
275*6a54128fSAndroid Build Coastguard Worker {
276*6a54128fSAndroid Build Coastguard Worker char *char_ptr;
277*6a54128fSAndroid Build Coastguard Worker short *short_ptr;
278*6a54128fSAndroid Build Coastguard Worker long *long_ptr;
279*6a54128fSAndroid Build Coastguard Worker long v;
280*6a54128fSAndroid Build Coastguard Worker char *tmp;
281*6a54128fSAndroid Build Coastguard Worker
282*6a54128fSAndroid Build Coastguard Worker v = strtol(value, &tmp, 0);
283*6a54128fSAndroid Build Coastguard Worker if (*tmp) {
284*6a54128fSAndroid Build Coastguard Worker wprintw( command_win, "Bad value - %s\n", value);
285*6a54128fSAndroid Build Coastguard Worker return;
286*6a54128fSAndroid Build Coastguard Worker }
287*6a54128fSAndroid Build Coastguard Worker switch (len) {
288*6a54128fSAndroid Build Coastguard Worker case 1:
289*6a54128fSAndroid Build Coastguard Worker char_ptr = (char *) ptr;
290*6a54128fSAndroid Build Coastguard Worker *char_ptr = v;
291*6a54128fSAndroid Build Coastguard Worker break;
292*6a54128fSAndroid Build Coastguard Worker case 2:
293*6a54128fSAndroid Build Coastguard Worker short_ptr = (short *) ptr;
294*6a54128fSAndroid Build Coastguard Worker *short_ptr = v;
295*6a54128fSAndroid Build Coastguard Worker break;
296*6a54128fSAndroid Build Coastguard Worker case 4:
297*6a54128fSAndroid Build Coastguard Worker long_ptr = (long *) ptr;
298*6a54128fSAndroid Build Coastguard Worker *long_ptr = v;
299*6a54128fSAndroid Build Coastguard Worker break;
300*6a54128fSAndroid Build Coastguard Worker default:
301*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,
302*6a54128fSAndroid Build Coastguard Worker "set_int: unsupported length: %d\n", len);
303*6a54128fSAndroid Build Coastguard Worker return;
304*6a54128fSAndroid Build Coastguard Worker }
305*6a54128fSAndroid Build Coastguard Worker wprintw (command_win, "Variable %s set to %s\n",
306*6a54128fSAndroid Build Coastguard Worker name, value);
307*6a54128fSAndroid Build Coastguard Worker }
308*6a54128fSAndroid Build Coastguard Worker
set_uint(short len,void * ptr,char * name,char * value)309*6a54128fSAndroid Build Coastguard Worker void set_uint(short len, void *ptr, char *name, char *value)
310*6a54128fSAndroid Build Coastguard Worker {
311*6a54128fSAndroid Build Coastguard Worker unsigned char *char_ptr;
312*6a54128fSAndroid Build Coastguard Worker unsigned short *short_ptr;
313*6a54128fSAndroid Build Coastguard Worker unsigned long *long_ptr;
314*6a54128fSAndroid Build Coastguard Worker unsigned long v;
315*6a54128fSAndroid Build Coastguard Worker char *tmp;
316*6a54128fSAndroid Build Coastguard Worker
317*6a54128fSAndroid Build Coastguard Worker v = strtoul(value, &tmp, 0);
318*6a54128fSAndroid Build Coastguard Worker if (*tmp) {
319*6a54128fSAndroid Build Coastguard Worker wprintw( command_win, "Bad value - %s\n", value);
320*6a54128fSAndroid Build Coastguard Worker return;
321*6a54128fSAndroid Build Coastguard Worker }
322*6a54128fSAndroid Build Coastguard Worker switch (len) {
323*6a54128fSAndroid Build Coastguard Worker case 1:
324*6a54128fSAndroid Build Coastguard Worker char_ptr = (unsigned char *) ptr;
325*6a54128fSAndroid Build Coastguard Worker *char_ptr = v;
326*6a54128fSAndroid Build Coastguard Worker break;
327*6a54128fSAndroid Build Coastguard Worker case 2:
328*6a54128fSAndroid Build Coastguard Worker short_ptr = (unsigned short *) ptr;
329*6a54128fSAndroid Build Coastguard Worker *short_ptr = v;
330*6a54128fSAndroid Build Coastguard Worker break;
331*6a54128fSAndroid Build Coastguard Worker case 4:
332*6a54128fSAndroid Build Coastguard Worker long_ptr = (unsigned long *) ptr;
333*6a54128fSAndroid Build Coastguard Worker *long_ptr = v;
334*6a54128fSAndroid Build Coastguard Worker break;
335*6a54128fSAndroid Build Coastguard Worker default:
336*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,
337*6a54128fSAndroid Build Coastguard Worker "set_uint: unsupported length: %d\n", len);
338*6a54128fSAndroid Build Coastguard Worker return;
339*6a54128fSAndroid Build Coastguard Worker }
340*6a54128fSAndroid Build Coastguard Worker wprintw (command_win, "Variable %s set to %s\n",
341*6a54128fSAndroid Build Coastguard Worker name, value);
342*6a54128fSAndroid Build Coastguard Worker }
343*6a54128fSAndroid Build Coastguard Worker
set_char(short len,void * ptr,char * name,char * value)344*6a54128fSAndroid Build Coastguard Worker void set_char(short len, void *ptr, char *name, char *value)
345*6a54128fSAndroid Build Coastguard Worker {
346*6a54128fSAndroid Build Coastguard Worker if (strlen(value)+1 > len) {
347*6a54128fSAndroid Build Coastguard Worker wprintw( command_win, "Value %s too big for field\n",
348*6a54128fSAndroid Build Coastguard Worker name, len);
349*6a54128fSAndroid Build Coastguard Worker return;
350*6a54128fSAndroid Build Coastguard Worker }
351*6a54128fSAndroid Build Coastguard Worker memset(ptr, 0, len);
352*6a54128fSAndroid Build Coastguard Worker strcpy((char *) ptr, value);
353*6a54128fSAndroid Build Coastguard Worker wprintw (command_win, "Variable %s set to %s\n",
354*6a54128fSAndroid Build Coastguard Worker name, value);
355*6a54128fSAndroid Build Coastguard Worker }
356*6a54128fSAndroid Build Coastguard Worker
357*6a54128fSAndroid Build Coastguard Worker
set(char * command_line)358*6a54128fSAndroid Build Coastguard Worker void set (char *command_line)
359*6a54128fSAndroid Build Coastguard Worker
360*6a54128fSAndroid Build Coastguard Worker {
361*6a54128fSAndroid Build Coastguard Worker unsigned short *int_ptr;
362*6a54128fSAndroid Build Coastguard Worker unsigned char *char_ptr;
363*6a54128fSAndroid Build Coastguard Worker unsigned long *long_ptr,offset=0;
364*6a54128fSAndroid Build Coastguard Worker int i,len, found=0;
365*6a54128fSAndroid Build Coastguard Worker char *ptr,buffer [80],variable [80],value [80];
366*6a54128fSAndroid Build Coastguard Worker
367*6a54128fSAndroid Build Coastguard Worker if (device_handle==NULL) {
368*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Error - No device opened\n");refresh_command_win ();
369*6a54128fSAndroid Build Coastguard Worker return;
370*6a54128fSAndroid Build Coastguard Worker }
371*6a54128fSAndroid Build Coastguard Worker
372*6a54128fSAndroid Build Coastguard Worker if (current_type==NULL) {
373*6a54128fSAndroid Build Coastguard Worker hex_set (command_line);
374*6a54128fSAndroid Build Coastguard Worker return;
375*6a54128fSAndroid Build Coastguard Worker }
376*6a54128fSAndroid Build Coastguard Worker
377*6a54128fSAndroid Build Coastguard Worker ptr=parse_word (command_line,buffer);
378*6a54128fSAndroid Build Coastguard Worker if (ptr==NULL || *ptr==0) {
379*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Error - Missing arguments\n");refresh_command_win ();
380*6a54128fSAndroid Build Coastguard Worker return;
381*6a54128fSAndroid Build Coastguard Worker }
382*6a54128fSAndroid Build Coastguard Worker parse_word (ptr,buffer);
383*6a54128fSAndroid Build Coastguard Worker ptr=strchr (buffer,'=');
384*6a54128fSAndroid Build Coastguard Worker if (ptr==NULL) {
385*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Error - Bad syntax\n");refresh_command_win ();return;
386*6a54128fSAndroid Build Coastguard Worker }
387*6a54128fSAndroid Build Coastguard Worker strncpy (variable,buffer,ptr-buffer);variable [ptr-buffer]=0;
388*6a54128fSAndroid Build Coastguard Worker strcpy (value,++ptr);
389*6a54128fSAndroid Build Coastguard Worker
390*6a54128fSAndroid Build Coastguard Worker if (current_type==NULL) {
391*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Sorry, not yet supported\n");refresh_command_win ();return;
392*6a54128fSAndroid Build Coastguard Worker }
393*6a54128fSAndroid Build Coastguard Worker
394*6a54128fSAndroid Build Coastguard Worker for (i=0;i<current_type->fields_num && !found;i++) {
395*6a54128fSAndroid Build Coastguard Worker if (strcmp (current_type->field_names [i],variable)==0) {
396*6a54128fSAndroid Build Coastguard Worker found=1;
397*6a54128fSAndroid Build Coastguard Worker ptr=type_data.u.buffer+offset;
398*6a54128fSAndroid Build Coastguard Worker len = current_type->field_lengths [i];
399*6a54128fSAndroid Build Coastguard Worker switch (current_type->field_types [i]) {
400*6a54128fSAndroid Build Coastguard Worker case FIELD_TYPE_INT:
401*6a54128fSAndroid Build Coastguard Worker set_int(len, ptr, variable, value);
402*6a54128fSAndroid Build Coastguard Worker break;
403*6a54128fSAndroid Build Coastguard Worker case FIELD_TYPE_UINT:
404*6a54128fSAndroid Build Coastguard Worker set_uint(len, ptr, variable, value);
405*6a54128fSAndroid Build Coastguard Worker break;
406*6a54128fSAndroid Build Coastguard Worker case FIELD_TYPE_CHAR:
407*6a54128fSAndroid Build Coastguard Worker set_char(len, ptr, variable, value);
408*6a54128fSAndroid Build Coastguard Worker break;
409*6a54128fSAndroid Build Coastguard Worker default:
410*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,
411*6a54128fSAndroid Build Coastguard Worker "set: unhandled type %d\n",
412*6a54128fSAndroid Build Coastguard Worker current_type->field_types [i]);
413*6a54128fSAndroid Build Coastguard Worker break;
414*6a54128fSAndroid Build Coastguard Worker }
415*6a54128fSAndroid Build Coastguard Worker refresh_command_win ();
416*6a54128fSAndroid Build Coastguard Worker }
417*6a54128fSAndroid Build Coastguard Worker offset+=current_type->field_lengths [i];
418*6a54128fSAndroid Build Coastguard Worker }
419*6a54128fSAndroid Build Coastguard Worker if (found)
420*6a54128fSAndroid Build Coastguard Worker dispatch ("show");
421*6a54128fSAndroid Build Coastguard Worker else {
422*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Error - Variable %s not found\n",variable);
423*6a54128fSAndroid Build Coastguard Worker refresh_command_win ();
424*6a54128fSAndroid Build Coastguard Worker }
425*6a54128fSAndroid Build Coastguard Worker }
426*6a54128fSAndroid Build Coastguard Worker
hex_set(char * command_line)427*6a54128fSAndroid Build Coastguard Worker void hex_set (char *command_line)
428*6a54128fSAndroid Build Coastguard Worker
429*6a54128fSAndroid Build Coastguard Worker {
430*6a54128fSAndroid Build Coastguard Worker unsigned char tmp;
431*6a54128fSAndroid Build Coastguard Worker char *ptr,buffer [80],*ch_ptr;
432*6a54128fSAndroid Build Coastguard Worker int mode=HEX;
433*6a54128fSAndroid Build Coastguard Worker
434*6a54128fSAndroid Build Coastguard Worker ptr=parse_word (command_line,buffer);
435*6a54128fSAndroid Build Coastguard Worker if (*ptr==0) {
436*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Error - Argument not specified\n");refresh_command_win ();return;
437*6a54128fSAndroid Build Coastguard Worker }
438*6a54128fSAndroid Build Coastguard Worker
439*6a54128fSAndroid Build Coastguard Worker ptr=parse_word (ptr,buffer);
440*6a54128fSAndroid Build Coastguard Worker
441*6a54128fSAndroid Build Coastguard Worker if (strcasecmp (buffer,"text")==0) {
442*6a54128fSAndroid Build Coastguard Worker mode=TEXT;
443*6a54128fSAndroid Build Coastguard Worker strcpy (buffer,ptr);
444*6a54128fSAndroid Build Coastguard Worker }
445*6a54128fSAndroid Build Coastguard Worker
446*6a54128fSAndroid Build Coastguard Worker else if (strcasecmp (buffer,"hex")==0) {
447*6a54128fSAndroid Build Coastguard Worker mode=HEX;
448*6a54128fSAndroid Build Coastguard Worker ptr=parse_word (ptr,buffer);
449*6a54128fSAndroid Build Coastguard Worker }
450*6a54128fSAndroid Build Coastguard Worker
451*6a54128fSAndroid Build Coastguard Worker if (*buffer==0) {
452*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Error - Data not specified\n");refresh_command_win ();return;
453*6a54128fSAndroid Build Coastguard Worker }
454*6a54128fSAndroid Build Coastguard Worker
455*6a54128fSAndroid Build Coastguard Worker if (mode==HEX) {
456*6a54128fSAndroid Build Coastguard Worker do {
457*6a54128fSAndroid Build Coastguard Worker tmp=(unsigned char) strtol (buffer,NULL,16);
458*6a54128fSAndroid Build Coastguard Worker type_data.u.buffer [type_data.offset_in_block]=tmp;
459*6a54128fSAndroid Build Coastguard Worker type_data.offset_in_block++;
460*6a54128fSAndroid Build Coastguard Worker ptr=parse_word (ptr,buffer);
461*6a54128fSAndroid Build Coastguard Worker if (type_data.offset_in_block==file_system_info.block_size) {
462*6a54128fSAndroid Build Coastguard Worker if (*ptr) {
463*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Error - Ending offset outside block, only partial string changed\n");
464*6a54128fSAndroid Build Coastguard Worker refresh_command_win ();
465*6a54128fSAndroid Build Coastguard Worker }
466*6a54128fSAndroid Build Coastguard Worker type_data.offset_in_block--;
467*6a54128fSAndroid Build Coastguard Worker }
468*6a54128fSAndroid Build Coastguard Worker } while (*buffer) ;
469*6a54128fSAndroid Build Coastguard Worker }
470*6a54128fSAndroid Build Coastguard Worker
471*6a54128fSAndroid Build Coastguard Worker else {
472*6a54128fSAndroid Build Coastguard Worker ch_ptr=buffer;
473*6a54128fSAndroid Build Coastguard Worker while (*ch_ptr) {
474*6a54128fSAndroid Build Coastguard Worker tmp=(unsigned char) *ch_ptr++;
475*6a54128fSAndroid Build Coastguard Worker type_data.u.buffer [type_data.offset_in_block]=tmp;
476*6a54128fSAndroid Build Coastguard Worker type_data.offset_in_block++;
477*6a54128fSAndroid Build Coastguard Worker if (type_data.offset_in_block==file_system_info.block_size) {
478*6a54128fSAndroid Build Coastguard Worker if (*ch_ptr) {
479*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Error - Ending offset outside block, only partial string changed\n");
480*6a54128fSAndroid Build Coastguard Worker refresh_command_win ();
481*6a54128fSAndroid Build Coastguard Worker }
482*6a54128fSAndroid Build Coastguard Worker type_data.offset_in_block--;
483*6a54128fSAndroid Build Coastguard Worker }
484*6a54128fSAndroid Build Coastguard Worker }
485*6a54128fSAndroid Build Coastguard Worker }
486*6a54128fSAndroid Build Coastguard Worker
487*6a54128fSAndroid Build Coastguard Worker strcpy (buffer,"show");dispatch (buffer);
488*6a54128fSAndroid Build Coastguard Worker }
489*6a54128fSAndroid Build Coastguard Worker
490*6a54128fSAndroid Build Coastguard Worker
491*6a54128fSAndroid Build Coastguard Worker
set_type(char * command_line)492*6a54128fSAndroid Build Coastguard Worker void set_type (char *command_line)
493*6a54128fSAndroid Build Coastguard Worker
494*6a54128fSAndroid Build Coastguard Worker {
495*6a54128fSAndroid Build Coastguard Worker struct struct_descriptor *descriptor_ptr;
496*6a54128fSAndroid Build Coastguard Worker char *ptr,buffer [80],tmp_buffer [80];
497*6a54128fSAndroid Build Coastguard Worker short found=0;
498*6a54128fSAndroid Build Coastguard Worker
499*6a54128fSAndroid Build Coastguard Worker if (!load_type_data ())
500*6a54128fSAndroid Build Coastguard Worker return;
501*6a54128fSAndroid Build Coastguard Worker
502*6a54128fSAndroid Build Coastguard Worker ptr=parse_word (command_line,buffer);
503*6a54128fSAndroid Build Coastguard Worker parse_word (ptr,buffer);
504*6a54128fSAndroid Build Coastguard Worker
505*6a54128fSAndroid Build Coastguard Worker if (strcmp (buffer,"none")==0 || strcmp (buffer,"hex")==0) {
506*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Data will be shown as hex dump\n");refresh_command_win ();
507*6a54128fSAndroid Build Coastguard Worker current_type=NULL;
508*6a54128fSAndroid Build Coastguard Worker sprintf (tmp_buffer,"show");dispatch (tmp_buffer);
509*6a54128fSAndroid Build Coastguard Worker return;
510*6a54128fSAndroid Build Coastguard Worker }
511*6a54128fSAndroid Build Coastguard Worker
512*6a54128fSAndroid Build Coastguard Worker descriptor_ptr=first_type;
513*6a54128fSAndroid Build Coastguard Worker while (descriptor_ptr!=NULL && !found) {
514*6a54128fSAndroid Build Coastguard Worker if (strcmp (descriptor_ptr->name,buffer)==0)
515*6a54128fSAndroid Build Coastguard Worker found=1;
516*6a54128fSAndroid Build Coastguard Worker else
517*6a54128fSAndroid Build Coastguard Worker descriptor_ptr=descriptor_ptr->next;
518*6a54128fSAndroid Build Coastguard Worker }
519*6a54128fSAndroid Build Coastguard Worker if (found) {
520*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Structure type set to %s\n",buffer);refresh_command_win ();
521*6a54128fSAndroid Build Coastguard Worker current_type=descriptor_ptr;
522*6a54128fSAndroid Build Coastguard Worker sprintf (tmp_buffer,"show");dispatch (tmp_buffer);
523*6a54128fSAndroid Build Coastguard Worker }
524*6a54128fSAndroid Build Coastguard Worker else {
525*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Error - %s is not a valid type\n",buffer);refresh_command_win ();
526*6a54128fSAndroid Build Coastguard Worker }
527*6a54128fSAndroid Build Coastguard Worker }
528*6a54128fSAndroid Build Coastguard Worker
show_int(short len,void * ptr)529*6a54128fSAndroid Build Coastguard Worker void show_int(short len, void *ptr)
530*6a54128fSAndroid Build Coastguard Worker {
531*6a54128fSAndroid Build Coastguard Worker long temp;
532*6a54128fSAndroid Build Coastguard Worker char *format;
533*6a54128fSAndroid Build Coastguard Worker
534*6a54128fSAndroid Build Coastguard Worker switch (len) {
535*6a54128fSAndroid Build Coastguard Worker case 1:
536*6a54128fSAndroid Build Coastguard Worker temp = *((char *) ptr);
537*6a54128fSAndroid Build Coastguard Worker format = "%3d (0x%02x)\n";
538*6a54128fSAndroid Build Coastguard Worker break;
539*6a54128fSAndroid Build Coastguard Worker case 2:
540*6a54128fSAndroid Build Coastguard Worker temp = *((short *) ptr);
541*6a54128fSAndroid Build Coastguard Worker format = "%d (0x%x)\n";
542*6a54128fSAndroid Build Coastguard Worker break;
543*6a54128fSAndroid Build Coastguard Worker case 4:
544*6a54128fSAndroid Build Coastguard Worker temp = *((long *) ptr);
545*6a54128fSAndroid Build Coastguard Worker format = "%d\n";
546*6a54128fSAndroid Build Coastguard Worker break;
547*6a54128fSAndroid Build Coastguard Worker default:
548*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad, "unimplemented\n");
549*6a54128fSAndroid Build Coastguard Worker return;
550*6a54128fSAndroid Build Coastguard Worker }
551*6a54128fSAndroid Build Coastguard Worker wprintw(show_pad, format, temp, temp);
552*6a54128fSAndroid Build Coastguard Worker }
553*6a54128fSAndroid Build Coastguard Worker
show_uint(short len,void * ptr)554*6a54128fSAndroid Build Coastguard Worker void show_uint(short len, void *ptr)
555*6a54128fSAndroid Build Coastguard Worker {
556*6a54128fSAndroid Build Coastguard Worker unsigned long temp;
557*6a54128fSAndroid Build Coastguard Worker char *format;
558*6a54128fSAndroid Build Coastguard Worker
559*6a54128fSAndroid Build Coastguard Worker switch (len) {
560*6a54128fSAndroid Build Coastguard Worker case 1:
561*6a54128fSAndroid Build Coastguard Worker temp = *((unsigned char *) ptr);
562*6a54128fSAndroid Build Coastguard Worker temp = temp & 0xFF;
563*6a54128fSAndroid Build Coastguard Worker format = "%3u (0x%02x)\n";
564*6a54128fSAndroid Build Coastguard Worker break;
565*6a54128fSAndroid Build Coastguard Worker case 2:
566*6a54128fSAndroid Build Coastguard Worker temp = *((unsigned short *) ptr);
567*6a54128fSAndroid Build Coastguard Worker temp = temp & 0xFFFF;
568*6a54128fSAndroid Build Coastguard Worker format = "%u (0x%x)\n";
569*6a54128fSAndroid Build Coastguard Worker break;
570*6a54128fSAndroid Build Coastguard Worker case 4:
571*6a54128fSAndroid Build Coastguard Worker temp = (unsigned long) *((unsigned long *) ptr);
572*6a54128fSAndroid Build Coastguard Worker format = "%u\n";
573*6a54128fSAndroid Build Coastguard Worker break;
574*6a54128fSAndroid Build Coastguard Worker default:
575*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad, "unimplemented\n");
576*6a54128fSAndroid Build Coastguard Worker return;
577*6a54128fSAndroid Build Coastguard Worker }
578*6a54128fSAndroid Build Coastguard Worker wprintw(show_pad, format, temp, temp);
579*6a54128fSAndroid Build Coastguard Worker }
580*6a54128fSAndroid Build Coastguard Worker
show_char(short len,void * ptr)581*6a54128fSAndroid Build Coastguard Worker void show_char(short len, void *ptr)
582*6a54128fSAndroid Build Coastguard Worker {
583*6a54128fSAndroid Build Coastguard Worker unsigned char *cp = (unsigned char *) ptr;
584*6a54128fSAndroid Build Coastguard Worker unsigned char ch;
585*6a54128fSAndroid Build Coastguard Worker int i,j;
586*6a54128fSAndroid Build Coastguard Worker
587*6a54128fSAndroid Build Coastguard Worker wprintw(show_pad, "\"");
588*6a54128fSAndroid Build Coastguard Worker
589*6a54128fSAndroid Build Coastguard Worker for (i=0; i < len; i++) {
590*6a54128fSAndroid Build Coastguard Worker ch = *cp++;
591*6a54128fSAndroid Build Coastguard Worker if (ch == 0) {
592*6a54128fSAndroid Build Coastguard Worker for (j=i+1; j < len; j++)
593*6a54128fSAndroid Build Coastguard Worker if (cp[j-i])
594*6a54128fSAndroid Build Coastguard Worker break;
595*6a54128fSAndroid Build Coastguard Worker if (j == len)
596*6a54128fSAndroid Build Coastguard Worker break;
597*6a54128fSAndroid Build Coastguard Worker }
598*6a54128fSAndroid Build Coastguard Worker if (ch > 128) {
599*6a54128fSAndroid Build Coastguard Worker wprintw(show_pad, "M-");
600*6a54128fSAndroid Build Coastguard Worker ch -= 128;
601*6a54128fSAndroid Build Coastguard Worker }
602*6a54128fSAndroid Build Coastguard Worker if ((ch < 32) || (ch == 0x7f)) {
603*6a54128fSAndroid Build Coastguard Worker wprintw(show_pad, "^");
604*6a54128fSAndroid Build Coastguard Worker ch ^= 0x40; /* ^@, ^A, ^B; ^? for DEL */
605*6a54128fSAndroid Build Coastguard Worker }
606*6a54128fSAndroid Build Coastguard Worker wprintw(show_pad, "%c", ch);
607*6a54128fSAndroid Build Coastguard Worker }
608*6a54128fSAndroid Build Coastguard Worker
609*6a54128fSAndroid Build Coastguard Worker wprintw(show_pad, "\"\n");
610*6a54128fSAndroid Build Coastguard Worker }
611*6a54128fSAndroid Build Coastguard Worker
612*6a54128fSAndroid Build Coastguard Worker
613*6a54128fSAndroid Build Coastguard Worker
show(char * command_line)614*6a54128fSAndroid Build Coastguard Worker void show (char *command_line)
615*6a54128fSAndroid Build Coastguard Worker
616*6a54128fSAndroid Build Coastguard Worker {
617*6a54128fSAndroid Build Coastguard Worker unsigned int i,l,len,temp_int;
618*6a54128fSAndroid Build Coastguard Worker unsigned long offset=0,temp_long;
619*6a54128fSAndroid Build Coastguard Worker unsigned char temp_char,*ch_ptr;
620*6a54128fSAndroid Build Coastguard Worker void *ptr;
621*6a54128fSAndroid Build Coastguard Worker
622*6a54128fSAndroid Build Coastguard Worker if (device_handle==NULL)
623*6a54128fSAndroid Build Coastguard Worker return;
624*6a54128fSAndroid Build Coastguard Worker
625*6a54128fSAndroid Build Coastguard Worker show_pad_info.line=0;
626*6a54128fSAndroid Build Coastguard Worker
627*6a54128fSAndroid Build Coastguard Worker if (current_type==NULL) {
628*6a54128fSAndroid Build Coastguard Worker wmove (show_pad,0,0);
629*6a54128fSAndroid Build Coastguard Worker ch_ptr=type_data.u.buffer;
630*6a54128fSAndroid Build Coastguard Worker for (l=0;l<file_system_info.block_size/16;l++) {
631*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad,"%08ld : ",offset);
632*6a54128fSAndroid Build Coastguard Worker for (i=0;i<16;i++) {
633*6a54128fSAndroid Build Coastguard Worker if (type_data.offset_in_block==offset+i)
634*6a54128fSAndroid Build Coastguard Worker wattrset (show_pad,A_REVERSE);
635*6a54128fSAndroid Build Coastguard Worker
636*6a54128fSAndroid Build Coastguard Worker if (ch_ptr [i]>=' ' && ch_ptr [i]<='z')
637*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad,"%c",ch_ptr [i]);
638*6a54128fSAndroid Build Coastguard Worker else
639*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad,".");
640*6a54128fSAndroid Build Coastguard Worker if (type_data.offset_in_block==offset+i)
641*6a54128fSAndroid Build Coastguard Worker wattrset (show_pad,A_NORMAL);
642*6a54128fSAndroid Build Coastguard Worker }
643*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad," ");
644*6a54128fSAndroid Build Coastguard Worker for (i=0;i<16;i++) {
645*6a54128fSAndroid Build Coastguard Worker if (type_data.offset_in_block==offset+i)
646*6a54128fSAndroid Build Coastguard Worker wattrset (show_pad,A_REVERSE);
647*6a54128fSAndroid Build Coastguard Worker
648*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad,"%02x",ch_ptr [i]);
649*6a54128fSAndroid Build Coastguard Worker
650*6a54128fSAndroid Build Coastguard Worker if (type_data.offset_in_block==offset+i) {
651*6a54128fSAndroid Build Coastguard Worker wattrset (show_pad,A_NORMAL);
652*6a54128fSAndroid Build Coastguard Worker show_pad_info.line=l-l % show_pad_info.display_lines;
653*6a54128fSAndroid Build Coastguard Worker }
654*6a54128fSAndroid Build Coastguard Worker
655*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad," ");
656*6a54128fSAndroid Build Coastguard Worker }
657*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad,"\n");
658*6a54128fSAndroid Build Coastguard Worker offset+=16;
659*6a54128fSAndroid Build Coastguard Worker ch_ptr+=16;
660*6a54128fSAndroid Build Coastguard Worker }
661*6a54128fSAndroid Build Coastguard Worker show_pad_info.max_line=l-1;show_pad_info.max_col=COLS-1;
662*6a54128fSAndroid Build Coastguard Worker refresh_show_pad ();show_info ();
663*6a54128fSAndroid Build Coastguard Worker }
664*6a54128fSAndroid Build Coastguard Worker else {
665*6a54128fSAndroid Build Coastguard Worker wmove (show_pad,0,0);l=0;
666*6a54128fSAndroid Build Coastguard Worker for (i=0;i<current_type->fields_num;i++) {
667*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad,"%-20s = ",current_type->field_names [i]);
668*6a54128fSAndroid Build Coastguard Worker ptr=type_data.u.buffer+offset;
669*6a54128fSAndroid Build Coastguard Worker len = current_type->field_lengths[i];
670*6a54128fSAndroid Build Coastguard Worker switch (current_type->field_types[i]) {
671*6a54128fSAndroid Build Coastguard Worker case FIELD_TYPE_INT:
672*6a54128fSAndroid Build Coastguard Worker show_int(len, ptr);
673*6a54128fSAndroid Build Coastguard Worker break;
674*6a54128fSAndroid Build Coastguard Worker case FIELD_TYPE_UINT:
675*6a54128fSAndroid Build Coastguard Worker show_uint(len, ptr);
676*6a54128fSAndroid Build Coastguard Worker break;
677*6a54128fSAndroid Build Coastguard Worker case FIELD_TYPE_CHAR:
678*6a54128fSAndroid Build Coastguard Worker show_char(len, ptr);
679*6a54128fSAndroid Build Coastguard Worker break;
680*6a54128fSAndroid Build Coastguard Worker default:
681*6a54128fSAndroid Build Coastguard Worker wprintw (show_pad, "unimplemented\n");
682*6a54128fSAndroid Build Coastguard Worker break;
683*6a54128fSAndroid Build Coastguard Worker }
684*6a54128fSAndroid Build Coastguard Worker offset+=len;
685*6a54128fSAndroid Build Coastguard Worker l++;
686*6a54128fSAndroid Build Coastguard Worker }
687*6a54128fSAndroid Build Coastguard Worker current_type->length=offset;
688*6a54128fSAndroid Build Coastguard Worker show_pad_info.max_line=l-1;
689*6a54128fSAndroid Build Coastguard Worker refresh_show_pad ();show_info ();
690*6a54128fSAndroid Build Coastguard Worker }
691*6a54128fSAndroid Build Coastguard Worker }
692*6a54128fSAndroid Build Coastguard Worker
next(char * command_line)693*6a54128fSAndroid Build Coastguard Worker void next (char *command_line)
694*6a54128fSAndroid Build Coastguard Worker
695*6a54128fSAndroid Build Coastguard Worker {
696*6a54128fSAndroid Build Coastguard Worker long offset=1;
697*6a54128fSAndroid Build Coastguard Worker char *ptr,buffer [80];
698*6a54128fSAndroid Build Coastguard Worker
699*6a54128fSAndroid Build Coastguard Worker ptr=parse_word (command_line,buffer);
700*6a54128fSAndroid Build Coastguard Worker
701*6a54128fSAndroid Build Coastguard Worker if (*ptr!=0) {
702*6a54128fSAndroid Build Coastguard Worker ptr=parse_word (ptr,buffer);
703*6a54128fSAndroid Build Coastguard Worker offset*=atol (buffer);
704*6a54128fSAndroid Build Coastguard Worker }
705*6a54128fSAndroid Build Coastguard Worker
706*6a54128fSAndroid Build Coastguard Worker if (current_type!=NULL) {
707*6a54128fSAndroid Build Coastguard Worker sprintf (buffer,"setoffset type +%ld",offset);
708*6a54128fSAndroid Build Coastguard Worker dispatch (buffer);
709*6a54128fSAndroid Build Coastguard Worker return;
710*6a54128fSAndroid Build Coastguard Worker }
711*6a54128fSAndroid Build Coastguard Worker
712*6a54128fSAndroid Build Coastguard Worker if (type_data.offset_in_block+offset < file_system_info.block_size) {
713*6a54128fSAndroid Build Coastguard Worker type_data.offset_in_block+=offset;
714*6a54128fSAndroid Build Coastguard Worker sprintf (buffer,"show");dispatch (buffer);
715*6a54128fSAndroid Build Coastguard Worker }
716*6a54128fSAndroid Build Coastguard Worker
717*6a54128fSAndroid Build Coastguard Worker else {
718*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Error - Offset out of block\n");refresh_command_win ();
719*6a54128fSAndroid Build Coastguard Worker }
720*6a54128fSAndroid Build Coastguard Worker }
721*6a54128fSAndroid Build Coastguard Worker
prev(char * command_line)722*6a54128fSAndroid Build Coastguard Worker void prev (char *command_line)
723*6a54128fSAndroid Build Coastguard Worker
724*6a54128fSAndroid Build Coastguard Worker {
725*6a54128fSAndroid Build Coastguard Worker long offset=1;
726*6a54128fSAndroid Build Coastguard Worker char *ptr,buffer [80];
727*6a54128fSAndroid Build Coastguard Worker
728*6a54128fSAndroid Build Coastguard Worker ptr=parse_word (command_line,buffer);
729*6a54128fSAndroid Build Coastguard Worker
730*6a54128fSAndroid Build Coastguard Worker if (*ptr!=0) {
731*6a54128fSAndroid Build Coastguard Worker ptr=parse_word (ptr,buffer);
732*6a54128fSAndroid Build Coastguard Worker offset*=atol (buffer);
733*6a54128fSAndroid Build Coastguard Worker }
734*6a54128fSAndroid Build Coastguard Worker
735*6a54128fSAndroid Build Coastguard Worker if (current_type!=NULL) {
736*6a54128fSAndroid Build Coastguard Worker sprintf (buffer,"setoffset type -%ld",offset);
737*6a54128fSAndroid Build Coastguard Worker dispatch (buffer);
738*6a54128fSAndroid Build Coastguard Worker return;
739*6a54128fSAndroid Build Coastguard Worker }
740*6a54128fSAndroid Build Coastguard Worker
741*6a54128fSAndroid Build Coastguard Worker if (type_data.offset_in_block-offset >= 0) {
742*6a54128fSAndroid Build Coastguard Worker type_data.offset_in_block-=offset;
743*6a54128fSAndroid Build Coastguard Worker sprintf (buffer,"show");dispatch (buffer);
744*6a54128fSAndroid Build Coastguard Worker }
745*6a54128fSAndroid Build Coastguard Worker
746*6a54128fSAndroid Build Coastguard Worker else {
747*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Error - Offset out of block\n");refresh_command_win ();
748*6a54128fSAndroid Build Coastguard Worker }
749*6a54128fSAndroid Build Coastguard Worker }
750*6a54128fSAndroid Build Coastguard Worker
pgdn(char * commnad_line)751*6a54128fSAndroid Build Coastguard Worker void pgdn (char *commnad_line)
752*6a54128fSAndroid Build Coastguard Worker
753*6a54128fSAndroid Build Coastguard Worker {
754*6a54128fSAndroid Build Coastguard Worker show_pad_info.line+=show_pad_info.display_lines;
755*6a54128fSAndroid Build Coastguard Worker refresh_show_pad ();refresh_show_win ();
756*6a54128fSAndroid Build Coastguard Worker }
757*6a54128fSAndroid Build Coastguard Worker
pgup(char * command_line)758*6a54128fSAndroid Build Coastguard Worker void pgup (char *command_line)
759*6a54128fSAndroid Build Coastguard Worker
760*6a54128fSAndroid Build Coastguard Worker {
761*6a54128fSAndroid Build Coastguard Worker show_pad_info.line-=show_pad_info.display_lines;
762*6a54128fSAndroid Build Coastguard Worker refresh_show_pad ();refresh_show_win ();
763*6a54128fSAndroid Build Coastguard Worker }
764*6a54128fSAndroid Build Coastguard Worker
redraw(char * command_line)765*6a54128fSAndroid Build Coastguard Worker void redraw (char *command_line)
766*6a54128fSAndroid Build Coastguard Worker
767*6a54128fSAndroid Build Coastguard Worker {
768*6a54128fSAndroid Build Coastguard Worker redraw_all ();
769*6a54128fSAndroid Build Coastguard Worker dispatch ("show");
770*6a54128fSAndroid Build Coastguard Worker }
771*6a54128fSAndroid Build Coastguard Worker
remember(char * command_line)772*6a54128fSAndroid Build Coastguard Worker void remember (char *command_line)
773*6a54128fSAndroid Build Coastguard Worker
774*6a54128fSAndroid Build Coastguard Worker {
775*6a54128fSAndroid Build Coastguard Worker long entry_num;
776*6a54128fSAndroid Build Coastguard Worker char *ptr,buffer [80];
777*6a54128fSAndroid Build Coastguard Worker
778*6a54128fSAndroid Build Coastguard Worker if (device_handle==NULL) {
779*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Error - No device opened\n");refresh_command_win ();
780*6a54128fSAndroid Build Coastguard Worker return;
781*6a54128fSAndroid Build Coastguard Worker }
782*6a54128fSAndroid Build Coastguard Worker
783*6a54128fSAndroid Build Coastguard Worker ptr=parse_word (command_line,buffer);
784*6a54128fSAndroid Build Coastguard Worker
785*6a54128fSAndroid Build Coastguard Worker if (*ptr==0) {
786*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Error - Argument not specified\n");refresh_command_win ();
787*6a54128fSAndroid Build Coastguard Worker return;
788*6a54128fSAndroid Build Coastguard Worker }
789*6a54128fSAndroid Build Coastguard Worker
790*6a54128fSAndroid Build Coastguard Worker ptr=parse_word (ptr,buffer);
791*6a54128fSAndroid Build Coastguard Worker
792*6a54128fSAndroid Build Coastguard Worker entry_num=remember_lifo.entries_count++;
793*6a54128fSAndroid Build Coastguard Worker if (entry_num>REMEMBER_COUNT-1) {
794*6a54128fSAndroid Build Coastguard Worker entry_num=0;
795*6a54128fSAndroid Build Coastguard Worker remember_lifo.entries_count--;
796*6a54128fSAndroid Build Coastguard Worker }
797*6a54128fSAndroid Build Coastguard Worker
798*6a54128fSAndroid Build Coastguard Worker remember_lifo.offset [entry_num]=device_offset;
799*6a54128fSAndroid Build Coastguard Worker remember_lifo.type [entry_num]=current_type;
800*6a54128fSAndroid Build Coastguard Worker strcpy (remember_lifo.name [entry_num],buffer);
801*6a54128fSAndroid Build Coastguard Worker
802*6a54128fSAndroid Build Coastguard Worker if (current_type!=NULL)
803*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Object %s in Offset %ld remembered as %s\n",current_type->name,device_offset,buffer);
804*6a54128fSAndroid Build Coastguard Worker else
805*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Offset %ld remembered as %s\n",device_offset,buffer);
806*6a54128fSAndroid Build Coastguard Worker
807*6a54128fSAndroid Build Coastguard Worker refresh_command_win ();
808*6a54128fSAndroid Build Coastguard Worker }
809*6a54128fSAndroid Build Coastguard Worker
recall(char * command_line)810*6a54128fSAndroid Build Coastguard Worker void recall (char *command_line)
811*6a54128fSAndroid Build Coastguard Worker
812*6a54128fSAndroid Build Coastguard Worker {
813*6a54128fSAndroid Build Coastguard Worker char *ptr,buffer [80];
814*6a54128fSAndroid Build Coastguard Worker long entry_num;
815*6a54128fSAndroid Build Coastguard Worker
816*6a54128fSAndroid Build Coastguard Worker if (device_handle==NULL) {
817*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Error - No device opened\n");refresh_command_win ();
818*6a54128fSAndroid Build Coastguard Worker return;
819*6a54128fSAndroid Build Coastguard Worker }
820*6a54128fSAndroid Build Coastguard Worker
821*6a54128fSAndroid Build Coastguard Worker ptr=parse_word (command_line,buffer);
822*6a54128fSAndroid Build Coastguard Worker
823*6a54128fSAndroid Build Coastguard Worker if (*ptr==0) {
824*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Error - Argument not specified\n");refresh_command_win ();
825*6a54128fSAndroid Build Coastguard Worker return;
826*6a54128fSAndroid Build Coastguard Worker }
827*6a54128fSAndroid Build Coastguard Worker
828*6a54128fSAndroid Build Coastguard Worker ptr=parse_word (ptr,buffer);
829*6a54128fSAndroid Build Coastguard Worker
830*6a54128fSAndroid Build Coastguard Worker
831*6a54128fSAndroid Build Coastguard Worker for (entry_num=remember_lifo.entries_count-1;entry_num>=0;entry_num--) {
832*6a54128fSAndroid Build Coastguard Worker if (strcmp (remember_lifo.name [entry_num],buffer)==0)
833*6a54128fSAndroid Build Coastguard Worker break;
834*6a54128fSAndroid Build Coastguard Worker }
835*6a54128fSAndroid Build Coastguard Worker
836*6a54128fSAndroid Build Coastguard Worker if (entry_num==-1) {
837*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Error - Can not recall %s\n",buffer);refresh_command_win ();
838*6a54128fSAndroid Build Coastguard Worker return;
839*6a54128fSAndroid Build Coastguard Worker }
840*6a54128fSAndroid Build Coastguard Worker
841*6a54128fSAndroid Build Coastguard Worker sprintf (buffer,"setoffset %ld",remember_lifo.offset [entry_num]);dispatch (buffer);
842*6a54128fSAndroid Build Coastguard Worker if (remember_lifo.type [entry_num] != NULL) {
843*6a54128fSAndroid Build Coastguard Worker sprintf (buffer,"settype %s",remember_lifo.type [entry_num]->name);dispatch (buffer);
844*6a54128fSAndroid Build Coastguard Worker }
845*6a54128fSAndroid Build Coastguard Worker
846*6a54128fSAndroid Build Coastguard Worker else {
847*6a54128fSAndroid Build Coastguard Worker sprintf (buffer,"settype none");dispatch (buffer);
848*6a54128fSAndroid Build Coastguard Worker }
849*6a54128fSAndroid Build Coastguard Worker
850*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Object %s in Offset %ld recalled\n",current_type->name,device_offset);
851*6a54128fSAndroid Build Coastguard Worker refresh_command_win ();
852*6a54128fSAndroid Build Coastguard Worker }
853*6a54128fSAndroid Build Coastguard Worker
enable_write(char * command_line)854*6a54128fSAndroid Build Coastguard Worker void enable_write (char *command_line)
855*6a54128fSAndroid Build Coastguard Worker
856*6a54128fSAndroid Build Coastguard Worker {
857*6a54128fSAndroid Build Coastguard Worker FILE *fp;
858*6a54128fSAndroid Build Coastguard Worker
859*6a54128fSAndroid Build Coastguard Worker if (device_handle==NULL) {
860*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Error - No device opened\n");refresh_command_win ();
861*6a54128fSAndroid Build Coastguard Worker return;
862*6a54128fSAndroid Build Coastguard Worker }
863*6a54128fSAndroid Build Coastguard Worker
864*6a54128fSAndroid Build Coastguard Worker if (!AllowChanges) {
865*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Sorry, write access is not allowed\n");
866*6a54128fSAndroid Build Coastguard Worker return;
867*6a54128fSAndroid Build Coastguard Worker }
868*6a54128fSAndroid Build Coastguard Worker
869*6a54128fSAndroid Build Coastguard Worker if (mounted) {
870*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Error - Filesystem is mounted\n");
871*6a54128fSAndroid Build Coastguard Worker return;
872*6a54128fSAndroid Build Coastguard Worker }
873*6a54128fSAndroid Build Coastguard Worker
874*6a54128fSAndroid Build Coastguard Worker if ( (fp=fopen (device_name,"r+b"))==NULL) {
875*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Error - Can not open device %s for reading and writing\n",device_name);refresh_command_win ();
876*6a54128fSAndroid Build Coastguard Worker return;
877*6a54128fSAndroid Build Coastguard Worker }
878*6a54128fSAndroid Build Coastguard Worker fclose (device_handle);
879*6a54128fSAndroid Build Coastguard Worker device_handle=fp;write_access=1;
880*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Write access enabled - Be careful\n");refresh_command_win ();
881*6a54128fSAndroid Build Coastguard Worker }
882*6a54128fSAndroid Build Coastguard Worker
disable_write(char * command_line)883*6a54128fSAndroid Build Coastguard Worker void disable_write (char *command_line)
884*6a54128fSAndroid Build Coastguard Worker
885*6a54128fSAndroid Build Coastguard Worker {
886*6a54128fSAndroid Build Coastguard Worker FILE *fp;
887*6a54128fSAndroid Build Coastguard Worker
888*6a54128fSAndroid Build Coastguard Worker if (device_handle==NULL) {
889*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Error - No device opened\n");refresh_command_win ();
890*6a54128fSAndroid Build Coastguard Worker return;
891*6a54128fSAndroid Build Coastguard Worker }
892*6a54128fSAndroid Build Coastguard Worker
893*6a54128fSAndroid Build Coastguard Worker if ( (fp=fopen (device_name,"rb"))==NULL) {
894*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Error - Can not open device %s\n",device_name);refresh_command_win ();
895*6a54128fSAndroid Build Coastguard Worker return;
896*6a54128fSAndroid Build Coastguard Worker }
897*6a54128fSAndroid Build Coastguard Worker
898*6a54128fSAndroid Build Coastguard Worker fclose (device_handle);
899*6a54128fSAndroid Build Coastguard Worker device_handle=fp;write_access=0;
900*6a54128fSAndroid Build Coastguard Worker wprintw (command_win,"Write access disabled\n");refresh_command_win ();
901*6a54128fSAndroid Build Coastguard Worker }
902*6a54128fSAndroid Build Coastguard Worker
write_data(char * command_line)903*6a54128fSAndroid Build Coastguard Worker void write_data (char *command_line)
904*6a54128fSAndroid Build Coastguard Worker
905*6a54128fSAndroid Build Coastguard Worker {
906*6a54128fSAndroid Build Coastguard Worker write_type_data ();
907*6a54128fSAndroid Build Coastguard Worker }
908