/* * Initialize the fileops module for the specified disk. */ void * Fileops_init(char *diskpath) { memset(openFileTable, 0, sizeof(openFileTable)); int fd = diskimg_open(diskpath, 1); if (fd < 0) { fprintf(stderr, "Can't open diskimagePath %s\n", diskpath); return NULL; } unixfs = unixfilesystem_init(fd); if (unixfs == NULL) { diskimg_close(fd); return NULL; } return unixfs; }
int main(int argc, char *argv[]) { int opt; while ((opt = getopt(argc, argv, "iqpr:")) != -1) { switch (opt) { case 'q': quietFlag = 1; break; case 'i': idumpFlag = 1; break; case 'p': pdumpFlag = 1; break; case 'r': removeFlag = optarg; break; default: PrintUsageAndExit(argv[0]); } } if (optind != argc-1) { PrintUsageAndExit(argv[0]); } char *diskpath = argv[optind]; int fd = diskimg_open(diskpath, (removeFlag == NULL)); if (fd < 0) { fprintf(stderr, "Can't open diskimagePath %s\n", diskpath); exit(EXIT_FAILURE); } struct unixfilesystem *fs = unixfilesystem_init(fd); if (!fs) { fprintf(stderr, "Failed to initialize unix filesystem\n"); exit(EXIT_FAILURE); } if (!quietFlag) { int disksize = diskimg_getsize(fd); if (disksize < 0) { fprintf(stderr, "Error getting the size of %s\n", argv[1]); // Cast the result of diskimg_close to void so the compiler doesn't // complain that we're ignoring its return value. (void) diskimg_close(fd); free(fs); exit(EXIT_FAILURE); } printf("Disk %s is %d bytes (%d KB)\n", argv[1], disksize, disksize/1024); printf("Superblock s_isize %d\n",(int)fs->superblock.s_isize); printf("Superblock s_fsize %d\n",(int)fs->superblock.s_fsize); printf("Superblock s_nfree %d\n",(int)fs->superblock.s_nfree); printf("Superblock s_ninode %d\n",(int)fs->superblock.s_ninode); } if (idumpFlag) { DumpInodeChecksum(fs, stdout); } if (pdumpFlag) { DumpPathnameChecksum(fs, stdout); } if (removeFlag) { RemovePathname(fs, removeFlag); } int err = diskimg_close(fd); if (err < 0) { fprintf(stderr, "Error closing %s\n", argv[1]); } free(fs); exit(EXIT_SUCCESS); return 0; }