X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?p=pintos-anon;a=blobdiff_plain;f=src%2Ffilesys%2Fdirectory.c;h=030c1c9b0dbaf9b3a41a4decaadd7c76793b1d63;hp=45bbdaed320b3ff801e72588c8518fa670db0bb2;hb=a03618133f7df0954802a470a4bee7674f7aed45;hpb=872c41a62e291a3a277188c02e32674841f670c2 diff --git a/src/filesys/directory.c b/src/filesys/directory.c index 45bbdae..030c1c9 100644 --- a/src/filesys/directory.c +++ b/src/filesys/directory.c @@ -10,12 +10,13 @@ struct dir { struct inode *inode; /* Backing store. */ + off_t pos; /* Current position. */ }; /* A single directory entry. */ struct dir_entry { - disk_sector_t inode_sector; /* Sector number of header. */ + block_sector_t inode_sector; /* Sector number of header. */ char name[NAME_MAX + 1]; /* Null terminated file name. */ bool in_use; /* In use or free? */ }; @@ -23,7 +24,7 @@ struct dir_entry /* Creates a directory with space for ENTRY_CNT entries in the given SECTOR. Returns true if successful, false on failure. */ bool -dir_create (disk_sector_t sector, size_t entry_cnt) +dir_create (block_sector_t sector, size_t entry_cnt) { return inode_create (sector, entry_cnt * sizeof (struct dir_entry)); } @@ -37,6 +38,7 @@ dir_open (struct inode *inode) if (inode != NULL && dir != NULL) { dir->inode = inode; + dir->pos = 0; return dir; } else @@ -74,6 +76,13 @@ dir_close (struct dir *dir) } } +/* Returns the inode encapsulated by DIR. */ +struct inode * +dir_get_inode (struct dir *dir) +{ + return dir->inode; +} + /* Searches DIR for a file with the given NAME. If successful, returns true, sets *EP to the directory entry if EP is non-null, and sets *OFSP to the byte offset of the @@ -130,12 +139,12 @@ dir_lookup (const struct dir *dir, const char *name, Fails if NAME is invalid (i.e. too long) or a disk or memory error occurs. */ bool -dir_add (struct dir *dir, const char *name, disk_sector_t inode_sector) +dir_add (struct dir *dir, const char *name, block_sector_t inode_sector) { struct dir_entry e; off_t ofs; bool success = false; - + ASSERT (dir != NULL); ASSERT (name != NULL); @@ -206,15 +215,22 @@ dir_remove (struct dir *dir, const char *name) return success; } -/* Prints the names of the files in DIR to the system console. */ -void -dir_list (const struct dir *dir) +/* Reads the next directory entry in DIR and stores the name in + NAME. Returns true if successful, false if the directory + contains no more entries. */ +bool +dir_readdir (struct dir *dir, char name[NAME_MAX + 1]) { struct dir_entry e; - size_t ofs; - - for (ofs = 0; inode_read_at (dir->inode, &e, sizeof e, ofs) == sizeof e; - ofs += sizeof e) - if (e.in_use) - printf ("%s\n", e.name); + + while (inode_read_at (dir->inode, &e, sizeof e, dir->pos) == sizeof e) + { + dir->pos += sizeof e; + if (e.in_use) + { + strlcpy (name, e.name, NAME_MAX + 1); + return true; + } + } + return false; }