/* scanufs.c, http://www.bolthole.com/solaris/scanufs.c */ /* Last update, Jan 11, 2007 */ /* Solaris-specific defines, to make sure that system library calls * works on files larger than 2Gig in size */ #define _LARGEFILE_SOURCE 1 #define _FILE_OFFSET_BITS 64 #include #include #include #include #include #include #include #include #include void usage() { puts("Usage: "); puts(" scanufs /dev/name "); } /* Given a SPECIFIC BLOCK, scan it for vtoc */ /* its up to the caller to do the +1 for solaris irritation */ /* return 0 on fail, 1 on found */ int scanblock(int fd, int blocknum) { struct fs *label; char buffer[2048]; uint32_t nativemagic, crossmagic; uint8_t *magicptr; nativemagic=FS_MAGIC; magicptr=(uint8_t*)&nativemagic; crossmagic=(magicptr[0]<<24) |(magicptr[1]<<16) |(magicptr[2]<<8) |(magicptr[3]); if(lseek(fd, (off_t)blocknum * 512, SEEK_SET) == -1){ perror("llseek failed"); exit(errno); } if (read(fd, buffer, 2048) != 2048) { perror("err reading initial 2k"); exit(errno); } label = (struct fs *)buffer; if (label->fs_magic == nativemagic) { fprintf(stderr, "Found ufs marker at block %d(0x%x)\n", blocknum, blocknum); return 1; } if (label->fs_magic == crossmagic) { fprintf(stderr, "Found NON-NATIVE ufs marker at block %d(0x%x)\n", blocknum, blocknum); return 1; } return 0; } int main(int argc, char *argv[]) { int fd; struct stat buf; int blocknum; /* printf("DEBUG: size of structfs is %d\n", sizeof(struct fs));*/ if (argc < 2) { puts("Need name of device!"); usage(); exit(1); } fd = open(argv[1], O_RDONLY); if (fd == -1 || fstat(fd, &buf) == -1) { perror("could not open device"); exit(errno); } for (blocknum = 0; blocknum < buf.st_size/512; blocknum++) { if (scanblock(fd, blocknum) == 1) { fprintf(stderr, "FOUND ufs magic at block %d\n", blocknum); fprintf(stderr, "FS should start at block %d\n", blocknum-16); } } return 0; }