blob: 1832de5b4bfdb4c64b8b255c36a609672e03ce04 [file] [log] [blame]
Theodore Ts'o7f88b041997-04-26 14:48:50 +00001/* Well, here's my linux version of findsuper.
2 * I'm sure you coulda done it faster. :)
3 * IMHO there isn't as much interesting data to print in the
4 * linux superblock as there is in the SunOS superblock--disk geometry is
5 * not there...and linux seems to update the dates in all the superblocks.
6 * SunOS doesn't ever touch the backup superblocks after the fs is created,
7 * as far as I can tell, so the date is more interesting IMHO and certainly
8 * marks which superblocks are backup ones.
9 *
10 * This still doesn't handle disks >2G.
11 *
12 * I wanted to add msdos support, but I couldn't make heads or tails
13 * of the kernel include files to find anything I could look for in msdos.
14 *
15 * Reading every block of a Sun partition is fairly quick. Doing the
16 * same under linux (slower hardware I suppose) just isn't the same.
17 * It might be more useful to default to reading the first (second?) block
18 * on each cyl; however, if the disk geometry is wrong, this is useless.
19 * But ya could still get the cyl size to print the numbers as cyls instead
20 * of blocks...
21 *
22 * run this as (for example)
23 * findsuper /dev/hda
24 * findsuper /dev/hda 437760 1024 (my disk has cyls of 855*512)
25 *
26 * I suppose the next step is to figgure out a way to determine if
27 * the block found is the first superblock somehow, and if so, build
28 * a partition table from the superblocks found... but this is still
29 * useful as is.
30 *
31 * Steve
32 * ssd@nevets.oau.org
33 * ssd@mae.engr.ucf.edu
34 */
35
36#include <stdio.h>
37#include <stdlib.h>
38#include <time.h>
39
40#include <linux/ext2_fs.h>
41
42
43main(int argc, char *argv[])
44{
45 int i;
46 int skiprate=512; /* one sector */
47 long sk=0; /* limited to 2G filesystems!! */
48 FILE *f;
49 char *s;
50
51 struct ext2_super_block ext2;
52 /* interesting fields: EXT2_SUPER_MAGIC
53 s_blocks_count s_log_block_size s_mtime s_magic s_lastcheck */
54
55 if (argc<2) {
56 fprintf(stderr,"Usage: findsuper device [skiprate [start]]\n");
57 exit(1);
58 }
59 if (argc>2) skiprate=atoi(argv[2]);
60 if (skiprate<512){
61 fprintf(stderr,"Do you really want to skip less than a sector??\n");
62 exit(2);
63 }
64 if (argc>3) sk=atol(argv[3]);
65 if (sk<0) {
66 fprintf(stderr,"Have to start at 0 or greater,not %ld\n",sk);
67 exit(1);
68 }
69 f=fopen(argv[1],"r");
70 if (!f){
71 perror(argv[1]);
72 exit(1);
73 }
74
75 /* Now, go looking for the superblock ! */
76 printf(" thisoff block fs_blk_sz blksz last_mount\n");
77 for (;!feof(f) && (i=fseek(f,sk,SEEK_SET))!= -1; sk+=skiprate){
78 if (i=fread(&ext2,sizeof(ext2),1, f)!=1){
79 perror("read failed");
80 } else if (ext2.s_magic == EXT2_SUPER_MAGIC){
81 s=ctime(&ext2.s_mtime);
82 s[24]=0;
83 printf("%9ld %9ld %9ld %5ld %s\n",sk,sk/1024,ext2.s_blocks_count,ext2.s_log_block_size,s);
84 }
85 }
86 printf("Failed on %d at %ld\n",i,sk);
87 fclose(f);
88}