Beispiel #1
0
/*
 * 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;
}
Beispiel #2
0
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;
}