PKUOS - Pintos
Pintos source browser for PKU Operating System course
|
#include "filesys/directory.h"
#include <stdio.h>
#include <string.h>
#include <list.h>
#include "filesys/filesys.h"
#include "filesys/inode.h"
#include "threads/malloc.h"
Go to the source code of this file.
Data Structures | |
struct | dir |
A directory. More... | |
struct | dir_entry |
A single directory entry. More... | |
Functions | |
bool | dir_create (block_sector_t sector, size_t entry_cnt) |
Creates a directory with space for ENTRY_CNT entries in the given SECTOR. More... | |
struct dir * | dir_open (struct inode *inode) |
Opens and returns the directory for the given INODE, of which it takes ownership. More... | |
struct dir * | dir_open_root (void) |
Opens the root directory and returns a directory for it. More... | |
struct dir * | dir_reopen (struct dir *dir) |
Opens and returns a new directory for the same inode as DIR. More... | |
void | dir_close (struct dir *dir) |
Destroys DIR and frees associated resources. More... | |
struct inode * | dir_get_inode (struct dir *dir) |
Returns the inode encapsulated by DIR. More... | |
static bool | lookup (const struct dir *dir, const char *name, struct dir_entry *ep, off_t *ofsp) |
Searches DIR for a file with the given NAME. More... | |
bool | dir_lookup (const struct dir *dir, const char *name, struct inode **inode) |
Searches DIR for a file with the given NAME and returns true if one exists, false otherwise. More... | |
bool | dir_add (struct dir *dir, const char *name, block_sector_t inode_sector) |
Adds a file named NAME to DIR, which must not already contain a file by that name. More... | |
bool | dir_remove (struct dir *dir, const char *name) |
Removes any entry for NAME in DIR. More... | |
bool | dir_readdir (struct dir *dir, char name[NAME_MAX+1]) |
Reads the next directory entry in DIR and stores the name in NAME. More... | |
bool dir_add | ( | struct dir * | dir, |
const char * | name, | ||
block_sector_t | inode_sector | ||
) |
Adds a file named NAME to DIR, which must not already contain a file by that name.
The file's inode is in sector INODE_SECTOR. Returns true if successful, false on failure. Fails if NAME is invalid (i.e. too long) or a disk or memory error occurs.
Definition at line 142 of file directory.c.
References ASSERT, dir_entry::in_use, dir::inode, inode_read_at(), dir_entry::inode_sector, inode_write_at(), lookup(), name, dir_entry::name, NAME_MAX, NULL, strlcpy(), and strlen().
Referenced by filesys_create().
void dir_close | ( | struct dir * | dir | ) |
Destroys DIR and frees associated resources.
Definition at line 70 of file directory.c.
References free(), dir::inode, inode_close(), and NULL.
Referenced by filesys_create(), filesys_open(), filesys_remove(), and fsutil_ls().
bool dir_create | ( | block_sector_t | sector, |
size_t | entry_cnt | ||
) |
Creates a directory with space for ENTRY_CNT entries in the given SECTOR.
Opening and closing directories.
Returns true if successful, false on failure.
Definition at line 27 of file directory.c.
References inode_create().
Referenced by do_format().
Returns the inode encapsulated by DIR.
Definition at line 81 of file directory.c.
References dir::inode.
Searches DIR for a file with the given NAME and returns true if one exists, false otherwise.
Reading and writing.
On success, sets *INODE to an inode for the file, otherwise to a null pointer. The caller must close *INODE.
Definition at line 119 of file directory.c.
References ASSERT, inode_open(), dir_entry::inode_sector, lookup(), name, and NULL.
Referenced by filesys_open().
Opens and returns the directory for the given INODE, of which it takes ownership.
Returns a null pointer on failure.
Definition at line 35 of file directory.c.
References calloc(), free(), dir::inode, inode_close(), NULL, and dir::pos.
Referenced by dir_open_root(), and dir_reopen().
struct dir * dir_open_root | ( | void | ) |
Opens the root directory and returns a directory for it.
Return true if successful, false on failure.
Definition at line 55 of file directory.c.
References dir_open(), inode_open(), and ROOT_DIR_SECTOR.
Referenced by filesys_create(), filesys_open(), filesys_remove(), and fsutil_ls().
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.
Definition at line 222 of file directory.c.
References dir_entry::in_use, dir::inode, inode_read_at(), name, dir_entry::name, NAME_MAX, dir::pos, and strlcpy().
Referenced by fsutil_ls().
Removes any entry for NAME in DIR.
Returns true if successful, false on failure, which occurs only if there is no file with the given NAME.
Definition at line 185 of file directory.c.
References ASSERT, dir_entry::in_use, dir::inode, inode_close(), inode_open(), inode_remove(), dir_entry::inode_sector, inode_write_at(), lookup(), name, and NULL.
Referenced by filesys_remove().
Opens and returns a new directory for the same inode as DIR.
Returns a null pointer on failure.
Definition at line 63 of file directory.c.
References dir_open(), dir::inode, and inode_reopen().
|
static |
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 directory entry if OFSP is non-null. otherwise, returns false and ignores EP and OFSP.
Definition at line 92 of file directory.c.
References ASSERT, dir_entry::in_use, dir::inode, inode_read_at(), name, dir_entry::name, NULL, and strcmp().
Referenced by dir_add(), dir_lookup(), and dir_remove().