1/*
2
3/usr/src/ext2ed/super_com.c
4
5A part of the extended file system 2 disk editor.
6
7----------------------
8Handles the superblock
9----------------------
10
11First written on: April 9 1995
12
13Copyright (C) 1995 Gadi Oxman
14
15*/
16
17#include <stdio.h>
18#include <stdlib.h>
19#include <string.h>
20#include <time.h>
21
22#include "ext2ed.h"
23
24void type_ext2_super_block___show (char *command_line)
25
26{
27	struct ext2_super_block *super;
28	super=&type_data.u.t_ext2_super_block;
29
30	show (command_line);
31
32	if (super->s_blocks_count != 0) {
33		wmove (show_pad,2,40);wprintw (show_pad,"%2.2f%%",100*(float) super->s_r_blocks_count/ (float) super->s_blocks_count);
34		wmove (show_pad,3,40);wprintw (show_pad,"%2.2f%%",100*(float) super->s_free_blocks_count/ (float) super->s_blocks_count);
35	}
36
37	if (super->s_inodes_count != 0) {
38		wmove (show_pad,4,40);wprintw (show_pad,"%2.2f%%",100*(float) super->s_free_inodes_count/ (float) super->s_inodes_count);
39	}
40
41	wmove (show_pad,6,40);
42	switch (super->s_log_block_size) {
43		case 0:	wprintw (show_pad,"1024 bytes");break;
44		case 1: wprintw (show_pad,"2048 bytes");break;
45		case 2: wprintw (show_pad,"4096 bytes");break;
46	}
47	wmove (show_pad,11,40);wprintw (show_pad,"%s",ctime ((time_t *) &type_data.u.t_ext2_super_block.s_mtime));
48	wmove (show_pad,12,40);wprintw (show_pad,"%s",ctime ((time_t *) &type_data.u.t_ext2_super_block.s_wtime));
49	wmove (show_pad,19,40);wprintw (show_pad,"%s",ctime ((time_t *) &type_data.u.t_ext2_super_block.s_lastcheck));
50	wmove (show_pad,15,40);
51
52	switch (type_data.u.t_ext2_super_block.s_magic) {
53		case EXT2_SUPER_MAGIC:
54			wprintw (show_pad,"ext2 >= 0.2B");
55			break;
56		case EXT2_PRE_02B_MAGIC:
57			wprintw (show_pad,"ext2 < 0.2B (not supported)");
58			break;
59		default:
60			wprintw (show_pad,"Unknown");
61			break;
62	}
63
64	wmove (show_pad,16,40);
65	if (type_data.u.t_ext2_super_block.s_state & 0x1)
66		wprintw (show_pad,"clean ");
67	else
68		wprintw (show_pad,"not clean ");
69
70	if (type_data.u.t_ext2_super_block.s_state & 0x2)
71		wprintw (show_pad,"with errors ");
72	else
73		wprintw (show_pad,"with no errors");
74
75	wmove (show_pad,17,40);
76
77	switch (type_data.u.t_ext2_super_block.s_errors) {
78		case EXT2_ERRORS_CONTINUE:
79			wprintw (show_pad,"Continue");
80			break;
81		case EXT2_ERRORS_RO:
82			wprintw (show_pad,"Remount read only");
83			break;
84		case EXT2_ERRORS_PANIC:
85			wprintw (show_pad,"Issue kernel panic");
86			break;
87		default:
88			wprintw (show_pad,"Unknown");
89			break;
90	}
91
92	wmove (show_pad,21,40);
93
94	switch (type_data.u.t_ext2_super_block.s_creator_os) {
95
96		case EXT2_OS_LINUX:
97			wprintw (show_pad,"Linux :-)");
98			break;
99
100		case EXT2_OS_HURD:
101			wprintw (show_pad,"Hurd");
102			break;
103
104		case EXT2_OS_MASIX:
105			wprintw (show_pad,"Masix");
106			break;
107
108		default:
109			wprintw (show_pad,"Unknown");
110			break;
111	}
112
113	refresh_show_pad ();
114
115	wmove (show_win,1,0);wprintw (show_win,"\n");wmove (show_win,2,0);
116	wprintw (show_win,"Superblock copy %ld ",super_info.copy_num);
117	if (super_info.copy_num==0)
118		wprintw (show_win,"(main copy)");
119	wprintw (show_win,"\n");
120	refresh_show_win ();
121}
122
123void type_ext2_super_block___gocopy (char *command_line)
124
125{
126	unsigned long copy_num,offset;
127	char *ptr,buffer [80];
128
129	ptr=parse_word (command_line,buffer);
130	if (*ptr==0) {
131		wprintw (command_win,"Error - No argument specified\n");refresh_command_win ();return;
132	}
133	ptr=parse_word (ptr,buffer);
134
135	copy_num=atol (buffer);
136
137	offset=file_system_info.super_block_offset+copy_num*file_system_info.no_blocks_in_group*file_system_info.block_size;
138
139	if (offset > file_system_info.file_system_size) {
140		wprintw (command_win,"Error - Copy number out of bounds\n");refresh_command_win ();return;
141	}
142
143	super_info.copy_num=copy_num;
144	device_offset=offset;
145
146	sprintf (buffer,"setoffset %ld",device_offset);dispatch (buffer);
147	strcpy (buffer,"show");dispatch (buffer);
148}
149
150void type_ext2_super_block___setactivecopy (char *command_line)
151
152{
153	struct ext2_super_block sb;
154
155	sb=type_data.u.t_ext2_super_block;
156	dispatch ("gocopy 0");
157	type_data.u.t_ext2_super_block=sb;
158	dispatch ("show");
159}
160