home *** CD-ROM | disk | FTP | other *** search
- From: src@scuzzy.in-berlin.de (Heiko Blume)
- Newsgroups: alt.sources
- Subject: little superblock editor for ISC
- Message-ID: <1990Nov19.164707.24512@scuzzy.in-berlin.de>
- Date: 19 Nov 90 16:47:07 GMT
-
- 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@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@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
-