little superblock editor for ISC
Heiko Blume
src at scuzzy.in-berlin.de
Tue Nov 20 03:47:07 AEST 1990
well, i got some requests to post this. its was a hack i had to do
to recover some largish filesystem :-) that might save your life...
and don't tell me if it's ugly or something, it just did the job for me.
btw: does anyone know what the s_dinfo is ????
on my drives its always '1 400 0 0'. what
does that tell me? nothing!
/* The FSF GPL applies - hacked by Heiko Blume - src at scuzzy.in-berlin.de */
/* BEWARE! you can really fuck up your superblock with this!! */
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/fs/s5param.h>
#include <sys/fs/s5filsys.h>
#include <unistd.h>
struct filsys bla;
void display_info(special)
char *special;
{
int fd;
if((fd=open(special,O_RDONLY))==-1) {
perror("wrsup");
exit(-1);
}
if(lseek(fd,512,0)==-1) {
perror("lseek");
exit(-2);
}
if(read(fd,&bla,sizeof(struct filsys))!=sizeof(struct filsys)) {
perror("read");
exit(-3);
}
printf("Superblock of %s\n---------------------------------\n",special);
printf("Size of i-list in blocks (s_isize) %u\n", bla.s_isize);
printf("Size of volume in blocks (s_fsize) %u\n", bla.s_fsize);
printf("# of addr. in free list (s_nfree) %u\n", bla.s_nfree);
printf("# of inodes in (s_ninode) %u\n", bla.s_ninode);
printf("Free list lock (s_flock) %u\n", bla.s_flock);
printf("Inode list lock (s_ilock) %u\n", bla.s_ilock);
printf("Superblock modified flag (s_fmod) %u\n", bla.s_fmod);
printf("Mounted read-only flag (s_ronly) %u\n", bla.s_ronly);
printf("Last superblock update (s_time) %s", ctime(&bla.s_time));
printf("Device information (s_dinfo) %u %u %u %u\n",
bla.s_dinfo[0], bla.s_dinfo[1], bla.s_dinfo[2], bla.s_dinfo[3]);
printf("Total free blocks (s_tfree) %u\n", bla.s_tfree);
printf("Total free inodes (s_tinode) %u\n", bla.s_tinode);
printf("File system name (s_fname) %s\n", bla.s_fname);
printf("File system pack name (s_ifpack) %s\n", bla.s_fpack);
printf("File system state (s_state) %x\n", bla.s_state);
printf("Magic number (s_magic) %x\n", bla.s_magic);
printf("File system type (s_type) %u\n", bla.s_type);
close(fd);
}
void change_info(special)
char *special;
{
int fd;
unsigned long val;
char option[20];
char tmp[20];
if((fd=open(special,O_RDWR))==-1) {
perror("wrsup");
exit(-1);
}
if(lseek(fd,512,0)==-1) {
perror("lseek");
exit(-2);
}
if(read(fd,&bla,sizeof(struct filsys))!=sizeof(struct filsys)) {
perror("read");
exit(-3);
}
printf("Well! which info do you want to change ?\n");
printf("1 - isize 2 - fsize 3 - nfree 4 - ninode\n");
printf("5 - flock 6 - ilock 7 - fmod 8 - ronly\n");
printf("9 - time 10 - dinfo 11 - tfree 12 - tinode\n");
printf("13 - fname 14 - fpack 15 - state 16 - magic\n");
printf("17 - type\n");
printf("99 - exit\n");
gets(option);
if(strcmp(option,"99")==0) return;
if(strcmp(option,"1")==0) {
printf("Current value of isize is %u\n", bla.s_isize);
printf("Enter new value ->");
fflush(stdout);
scanf("%u",&val);
bla.s_isize = (ushort) val;
printf("New value is %u\n",bla.s_isize);
}
if(strcmp(option,"2")==0) {
printf("Current value of fsize is %u\n", bla.s_fsize);
printf("Enter new value ->");
fflush(stdout);
scanf("%u",&val);
bla.s_fsize=(daddr_t) val;
printf("New value is %u\n",bla.s_fsize);
}
if(strcmp(option,"3")==0) {
printf("Current value of nfree is %u\n", bla.s_nfree);
printf("Enter new value ->");
fflush(stdout);
scanf("%u",&val);
bla.s_nfree=(short) val;
printf("New value is %u\n",bla.s_nfree);
}
if(strcmp(option,"4")==0) {
printf("Current value of ninode is %u\n", bla.s_ninode);
printf("Enter new value ->");
fflush(stdout);
scanf("%u",&val);
bla.s_ninode=(short)val;
printf("New value is %u\n",bla.s_ninode);
}
if(strcmp(option,"5")==0) {
printf("Current value of flock is %u\n", bla.s_flock);
printf("Enter new value ->");
fflush(stdout);
scanf("%u",&val);
bla.s_flock=(char)val;
printf("New value is %u\n",bla.s_flock);
}
if(strcmp(option,"6")==0) {
printf("Current value of ilock is %u\n", bla.s_ilock);
printf("Enter new value ->");
fflush(stdout);
scanf("%u",&val);
bla.s_ilock=(char)val;
printf("New value is %u\n",bla.s_ilock);
}
if(strcmp(option,"7")==0) {
printf("Current value of fmod is %u\n", bla.s_fmod);
printf("Enter new value ->");
fflush(stdout);
scanf("%u",&val);
bla.s_fmod=(char)val;
printf("New value is %u\n",bla.s_fmod);
}
if(strcmp(option,"8")==0) {
printf("Current value of ronly is %u\n", bla.s_ronly);
printf("Enter new value ->");
fflush(stdout);
scanf("%u",&val);
bla.s_ronly=(char)val;
printf("New value is %u\n",bla.s_ronly);
}
if(strcmp(option,"9")==0) {
char Time[40];
printf("Current value of time is %u\n", bla.s_time);
printf("Enter new value ->");
fflush(stdout);
scanf("%s",&Time);
}
if(strcmp(option,"10")==0) {
int i;
printf("Current values of dinfo is %u %u %u %u\n",
bla.s_dinfo[0], bla.s_dinfo[1], bla.s_dinfo[2], bla.s_dinfo[3]);
for(i=0;i<4;i++) {
printf("Enter new value for dinfo[%d]->",i);
fflush(stdout);
scanf("%u",&val);
bla.s_dinfo[i]=(short)val;
}
printf("New values of dinfo is %u %u %u %u\n",
bla.s_dinfo[0], bla.s_dinfo[1], bla.s_dinfo[2], bla.s_dinfo[3]);
}
if(strcmp(option,"11")==0) {
printf("Current value of tfree is %u\n", bla.s_tfree);
printf("Enter new value ->");
fflush(stdout);
scanf("%u",&val);
bla.s_tfree=(daddr_t)val;
printf("New value is %u\n",bla.s_tfree);
}
if(strcmp(option,"12")==0) {
printf("Current value of tinode is %u\n", bla.s_tinode);
printf("Enter new value ->");
fflush(stdout);
scanf("%u",&val);
bla.s_tinode=(ushort)val;
printf("New value is %u\n",bla.s_tinode);
}
if(strcmp(option,"13")==0) {
printf("Current value of fname is %s\n", bla.s_fname);
printf("Enter new value (6 chars max!) ->");
fflush(stdout);
scanf("%s",&tmp);
strncpy(bla.s_fname,tmp,6);
printf("New value is %s\n",bla.s_fname);
}
if(strcmp(option,"14")==0) {
printf("Current value of fpack is %s\n", bla.s_fpack);
printf("Enter new value (6 chars max!) ->");
fflush(stdout);
scanf("%s",&tmp);
strncpy(bla.s_fpack,tmp,6);
printf("New value is %s\n",bla.s_fpack);
}
if(strcmp(option,"15")==0) {
printf("Current value of state is %x\n", bla.s_state);
printf("Enter new value ->");
fflush(stdout);
scanf("%lx",&bla.s_state);
printf("New value is %x\n",bla.s_state);
}
if(strcmp(option,"16")==0) {
printf("Current value of magic is %x\n", bla.s_magic);
printf("Enter new value ->");
fflush(stdout);
scanf("%lx",&bla.s_magic);
printf("New value is %x\n",bla.s_magic);
}
if(strcmp(option,"17")==0) {
printf("Current value of type is %u\n", bla.s_type);
printf("Enter new value ->");
fflush(stdout);
scanf("%lu",&bla.s_type);
printf("New value is %u\n",bla.s_type);
}
printf("OK, do you really want to write the modified superblock ???\n");
printf("Enter 'YES' if you want to do it! ->");
fflush(stdout);
scanf("%s",&tmp);
if(strcmp(tmp,"YES")==0) {
if(lseek(fd,512,0)==-1) {
perror("wrsup");
exit(-4);
}
if(write(fd,&bla,sizeof(struct filsys))
!=sizeof(struct filsys)) {
perror("wrsup (PANIC!)");
exit(-5);
}
printf("Done.\n");
}
else printf("Superblock not written...\n");
close(fd);
}
void menu() {
printf("\nd - display superblock info\n");
printf("c - change superblock info\n");
printf("e - exit\n");
}
main(argc,argv)
int argc;
char **argv;
{
char option[20];
if(argc != 2) {
printf("usage: wrsup <special of fs>\n");
exit(1);
}
menu();
for(;;) {
gets(option);
switch(option[0]) {
case 'd': display_info(argv[1]); break;
case 'c': change_info(argv[1]); break;
case 'e': exit(); break;
default: menu();
}
}
}
--
Heiko Blume <-+-> src at scuzzy.in-berlin.de <-+-> (+49 30) 691 88 93
public source archive [HST V.42bis]:
scuzzy Any ACU,f 38400 6919520 gin:--gin: nuucp sword: nuucp
uucp scuzzy!/src/README /your/home
More information about the Alt.sources
mailing list