示例#1
0
/*
 * Get the inumber for the given file. Also makes sure that the cursor
 * is within the file.
 */
int
Fileops_getinumber(int fd, int *size)
{
  int inumber;
  struct inode in;
  int err;

  inumber = pathname_lookup(unixfs, openFileTable[fd].pathname);
  if (inumber < 0) {
    return inumber; // Can't find file
  }

  err = inode_iget(unixfs, inumber,&in);
  if (err < 0) {
    return err;
  }
  if (!(in.i_mode & IALLOC)) {
    return -1;
  }

  *size = inode_getsize(&in);

  //if (openFileTable[fd].cursor >= size) return -1; // Finished with file

  return inumber;
}
示例#2
0
/*
 * Open the specified absolute pathname for reading. Returns -1 on error;
 */
int
Fileops_open(char *pathname,int *inum, int *size)
{
  int fd;
  int inumber;
  struct inode in;

  numopens++;
  inumber = pathname_lookup(unixfs,pathname);
  if (inumber < 0) {
    return -1; // File not found
  }
  for (fd = 0; fd < MAX_FILES; fd++) {
    if (openFileTable[fd].pathname == NULL) break;
  }
  if (fd >= MAX_FILES) {
    return -1;  // No open file slots
  }
  openFileTable[fd].pathname = strdup(pathname); // Save our own copy
  openFileTable[fd].cursor = 0;

  // Set the inumber
  *inum = inumber;
  return fd;
}
/*
 * Print all the entries in the specified directory. 
 */
void PrintDirectory(struct unixfilesystem *fs, char *pathname)
{
  int inumber = pathname_lookup(fs, pathname);
  if (inumber < 0) {
    fprintf(stderr, "Can't find %s\n", pathname);
    return;
  }
  
  struct direntv6 direntries[1000];
  int numentries = GetDirEntries(fs, inumber, direntries, 1000);
  if (numentries < 0) {
    fprintf(stderr, "Can't read entries from %s\n", pathname);
    return;
  }
  
  struct inode in;
  int i, rowLength = 0; 
  for (i = 0; i < numentries; i++) { 
      inode_iget(fs, direntries[i].d_inumber, &in);
      printf("%s",direntries[i].d_name);
      if ((in.i_mode & IFMT) == IFDIR)
          printf("/");
      printf("\t");
      rowLength += strlen(direntries[i].d_name) + 1;
      if ((i+1) % 6 == 0)
          puts("");
  }
}
示例#4
0
int
chksumfile_bypathname(struct unixfilesystem *fs, const char *pathname, void *chksum)
{
  int inumber = pathname_lookup(fs, pathname);
  if (inumber < 0) {
    return inumber;
  }

  return chksumfile_byinumber(fs, inumber, chksum);
}
示例#5
0
/*
 * Fetch the next character from the file. Return -1 if at end of file.
 */
int
Fileops_getchar(int fd,int inumber, int size)
{
  int inumber;
  struct inode in;
  unsigned char buf[DISKIMG_SECTOR_SIZE];
  int bytesMoved;
  int err, size;
  int blockNo, blockOffset;

  numgetchars++;

  if (openFileTable[fd].pathname == NULL)
    return -1;  // fd not opened.

  inumber = pathname_lookup(unixfs, openFileTable[fd].pathname);
  if (inumber < 0) {
    return inumber; // Can't find file
  }

  err = inode_iget(unixfs, inumber,&in);
  if (err < 0) {
    return err;
  }
  if (!(in.i_mode & IALLOC)) {
    return -1;
  }

  size = inode_getsize(&in);

  if (openFileTable[fd].cursor >= size) return -1; // Finished with file

  blockNo = openFileTable[fd].cursor / DISKIMG_SECTOR_SIZE;
  blockOffset =  openFileTable[fd].cursor % DISKIMG_SECTOR_SIZE;

  bytesMoved = file_getblock(unixfs, inumber,blockNo,buf);
  if (bytesMoved < 0) {
    return -1;
  }
  assert(bytesMoved > blockOffset);


  openFileTable[fd].cursor += 1;

  return (int)(buf[blockOffset]);
}
示例#6
0
/*
 * Return true if specified pathname is a regular file.
 */
int
Fileops_isfile(char *pathname)
{
  numisfiles++;

  int inumber = pathname_lookup(unixfs, pathname);
  if (inumber < 0) {
    return 0;
  }

  struct inode in;
  int err = inode_iget(unixfs, inumber, &in);
  if (err < 0) return 0;

  if (!(in.i_mode & IALLOC) || ((in.i_mode & IFMT) != 0)) {
    /* Not allocated or not a file */
    return 0;
  }
  return 1; /* Must be a file */
}
示例#7
0
/*
 * Print all the entries in the specified directory. 
 */
void
PrintDirectory(struct unixfilesystem *fs,  char *pathname)
{
  int inumber = pathname_lookup(fs, pathname);
  if (inumber < 0) {
    fprintf(stderr, "Can't find %s\n", pathname);
    return;
  }

  struct direntv6 direntries[10000];
  int numentries = GetDirEntries(fs, inumber, direntries, 10000);
  if (numentries < 0) {
    fprintf(stderr, "Can't read entries from %s\n", pathname);
    return;
  }
  
  for (int i = 0; i < numentries; i++) { 
    printf("Direntry %s Name %s Inumber %d\n", pathname, direntries[i].d_name, direntries[i].d_inumber);
  }
}