AquilaOS documentation
How it works, and its code
Loading...
Searching...
No Matches
readdir.c
Go to the documentation of this file.
1
4
5#include <core/system.h>
6#include <fs/vfs.h>
7
19ssize_t vfs_readdir(struct vnode *dir, off_t off, struct dirent *dirent)
20{
21 vfs_log(LOG_DEBUG, "vfs_readdir(dir=%p, off=%d, dirent=%p)\n", dir, off, dirent);
22
23 /* invalid request */
24 if (!dir || !dir->fs)
25 return -EINVAL;
26
27 if (!S_ISDIR(dir->mode))
28 return -ENOTDIR;
29
30 /* the filesystem doesn't support it */
31 if (!dir->fs->vops.readdir)
32 return -ENOSYS;
33
34 return dir->fs->vops.readdir(dir, off, dirent);
35}
36
46int vfs_finddir(struct vnode *dir, const char *name, struct dirent *dirent)
47{
48 vfs_log(LOG_DEBUG, "vfs_finddir(dir=%p, name=%s, dirent=%p)\n", dir, name, dirent);
49
50 if (!dir || !dir->fs)
51 return -EINVAL;
52
53 if (!S_ISDIR(dir->mode))
54 return -ENOTDIR;
55
56 if (!dir->fs->vops.finddir)
57 return -ENOSYS;
58
59 return dir->fs->vops.finddir(dir, name, dirent);
60}
61
69int vfs_dir_empty(struct vnode *dir)
70{
71 struct dirent dirent;
72 off_t off = 0;
73 ssize_t ret;
74
75 while ((ret = vfs_readdir(dir, off, &dirent)) > 0) {
76 if (strcmp(dirent.d_name, ".") && strcmp(dirent.d_name, ".."))
77 return 0;
78
79 off += ret;
80 }
81
82 return ret == 0;
83}
#define LOG_DEBUG
Definition printk.h:19
int vfs_finddir(struct vnode *dir, const char *name, struct dirent *dirent)
Finds the entry of a directory that has a name.
Definition readdir.c:46
int vfs_dir_empty(struct vnode *dir)
Says whether a directory is empty, so that it can be removed.
Definition readdir.c:69
ssize_t vfs_readdir(struct vnode *dir, off_t off, struct dirent *dirent)
Reads a directory's entry at an offset.
Definition readdir.c:19
struct vops vops
Definition vfs.h:104
A file in memory (a vnode): what its inode says, and the kernel's own state.
Definition vfs.h:113
struct fs * fs
Definition vfs.h:127
mode_t mode
Definition vfs.h:118
int(*) finddir(struct vnode *dir, const char *name, struct dirent *dirent)
Definition vfs.h:79
ssize_t(*) readdir(struct vnode *dir, off_t offset, struct dirent *dirent)
Definition vfs.h:78
long int ssize_t
Definition types.h:12
long int off_t
Definition types.h:10