X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?p=pintos-anon;a=blobdiff_plain;f=src%2Ffilesys%2Fdirectory.c;h=0d265d5da78b7be2ca705a5a9b7eeacfbcd5dfd2;hp=45bbdaed320b3ff801e72588c8518fa670db0bb2;hb=a4613d70fb56b93216299f6253698ab0e4bbd46d;hpb=a26618d6f33f13301eb93ee26d6953c76019d879 diff --git a/src/filesys/directory.c b/src/filesys/directory.c index 45bbdae..0d265d5 100644 --- a/src/filesys/directory.c +++ b/src/filesys/directory.c @@ -10,6 +10,7 @@ struct dir { struct inode *inode; /* Backing store. */ + off_t pos; /* Current position. */ }; /* A single directory 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 @@ -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; }