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