#include #include #include #include #include #include #include #include extern const char *__progname; static int fd; static char sbbuf[SBSIZE] __attribute__((__aligned__(__alignof__(struct fs)))); #define sb ((struct fs *)&sbbuf[0]) static char *inobuf; int main(int, char **); int main(int ac, char **av) { int nino; int i; struct dinode *di; int r; if (ac != 2) { fprintf(stderr,"Usage: %s filesystem\n",__progname); exit(1); } fd = open(av[1],O_RDONLY,0); if (fd < 0) { fprintf(stderr,"%s: %s: %s\n",__progname,av[1],strerror(errno)); exit(1); } if (lseek(fd,DEV_BSIZE*(off_t)SBLOCK,L_SET) < 0) { fprintf(stderr,"%s: sb lseek: %s\n",__progname,strerror(errno)); exit(1); } i = read(fd,&sbbuf[0],SBSIZE); if (i < 0) { fprintf(stderr,"%s: sb read: %s\n",__progname,strerror(errno)); exit(1); } else if (i != SBSIZE) { fprintf(stderr,"%s: sb read: wanted %d got %d\n",__progname,SBSIZE,i); exit(1); } if (sb->fs_magic != FS_MAGIC) { printf("%s: bad magic number in superblock\n",av[1]); exit(1); } inobuf = malloc(sb->fs_ipg*sizeof(struct dinode)); if (inobuf == 0) { fprintf(stderr,"%s: can't malloc %d bytes for inodes\n",av[0],(int)(sb->fs_ipg*sizeof(struct dinode))); exit(1); } nino = sb->fs_ncg * sb->fs_ipg; for (i=0;ifs_ipg) == 0) { if (lseek(fd,DEV_BSIZE*(off_t)fsbtodb(sb,ino_to_fsba(sb,i)),L_SET) < 0) { fprintf(stderr,"%s: inode lseek: %s\n",__progname,strerror(errno)); exit(1); } errno = 0; r = read(fd,&inobuf[0],sb->fs_ipg*sizeof(struct dinode)); if (r < 0) { fprintf(stderr,"%s: inode read: %s\n",__progname,strerror(errno)); exit(1); } if (r != sb->fs_ipg*sizeof(struct dinode)) { fprintf(stderr,"%s: inode read: wanted %d, got %d\n",__progname,(int)(sb->fs_ipg*sizeof(struct dinode)),r); exit(1); } di = (struct dinode *) &inobuf[0]; } switch (di->di_mode & IFMT) { case IFLNK: if (di->di_size > sb->fs_maxsymlinklen) { case IFDIR: case IFREG: if ( (di->di_size < NDADDR*sb->fs_bsize) && blkoff(sb,di->di_size) ) { if ( fragnum(sb,di->di_db[lblkno(sb,di->di_size)]) + numfrags(sb,blkoff(sb,di->di_size)) > sb->fs_frag ) { printf("%d\n",i); } } } break; } di ++; } exit(0); }