/* * 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; }
/* * 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(""); } }
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); }
/* * 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]); }
/* * 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 */ }
/* * 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); } }