syscalls: getdents syscall

This commit is contained in:
Matheus
2023-06-26 21:32:39 -03:00
parent 3b2b8201f6
commit 9bdbdb9378
6 changed files with 170 additions and 9 deletions
+30
View File
@@ -44,4 +44,34 @@ typedef struct {
long __unused[3];
} stat_t;
#define DT_UNKNOWN 0
#define DT_FIFO 1
#define DT_CHR 2
#define DT_DIR 4
#define DT_BLK 6
#define DT_REG 8
#define DT_LNK 10
#define DT_SOCK 12
#define DT_WHT 14
typedef struct {
ino_t d_ino;
off_t d_off;
unsigned short d_reclen;
unsigned char d_type;
char d_name[1024];
} dent_t;
#define TYPE_FIFO 1
#define TYPE_CHARDEV 2
#define TYPE_DIR 4
#define TYPE_BLOCKDEV 6
#define TYPE_REGULAR 8
#define TYPE_LINK 10
#define TYPE_SOCKET 12
#define GETMODE(m) (0xFFF & (m))
#define GETTYPE(m) (((m) >> 12) & 0xF)
#define MAKETYPE(m) (((m) & 0xF) << 12)
#endif
+23 -3
View File
@@ -89,6 +89,7 @@ typedef struct vops_t {
int (*inactive)(vnode_t *node);
int (*mmap)(vnode_t *node, void *addr, uintmax_t offset, int flags, cred_t *cred);
int (*munmap)(vnode_t *node, void *addr, uintmax_t offset, int flags, cred_t *cred);
int (*getdents)(vnode_t *node, dent_t *buffer, size_t count, uintmax_t offset, size_t *readcount);
} vops_t;
#define VFS_MOUNT(vfs, mp, b, d) (vfs)->ops->mount(vfs, mp, b, d)
@@ -99,7 +100,6 @@ typedef struct vops_t {
#define VOP_LOCK(v) spinlock_acquire(&(v)->lock)
#define VOP_UNLOCK(v) spinlock_release(&(v)->lock)
// these are expected to be called with the vnode(s) locked
#define VOP_OPEN(v, f, c) (*v)->ops->open(v, f, c)
#define VOP_CLOSE(v, f, c) (v)->ops->close(v, f, c)
#define VOP_READ(v, b, s, o, f, r, c) (v)->ops->read(v, b, s, o, f, r, c)
@@ -115,8 +115,7 @@ typedef struct vops_t {
#define VOP_READLINK(v, l, c) (v)->ops->readlink(v, l, c)
#define VOP_MMAP(v, a, o, f, c) (v)->ops->mmap(v, a, o, f, c)
#define VOP_MUNMAP(v, a, o, f, c) (v)->ops->munmap(v, a, o, f, c)
// lock not needed unless atomicity is desired
#define VOP_GETDENTS(v, b, c, o, rc) (v)->ops->getdents(v, b, c, o, rc)
#define VOP_POLL(v, p) (v)->ops->poll(v, p);
#define VOP_HOLD(v) __atomic_add_fetch(&(v)->refcount, 1, __ATOMIC_SEQ_CST)
#define VOP_RELEASE(v) {\
@@ -145,4 +144,25 @@ int vfs_unlink(vnode_t *ref, char *path);
#define VFS_LOOKUP_INTERNAL 0x80000000
int vfs_lookup(vnode_t **result, vnode_t *start, char *path, char *lastcomp, int flags);
static inline mode_t vfs_getposixtype(int type) {
switch (type) {
case V_TYPE_REGULAR:
return TYPE_REGULAR;
case V_TYPE_DIR:
return TYPE_DIR;
case V_TYPE_CHDEV:
return TYPE_CHARDEV;
case V_TYPE_BLKDEV:
return TYPE_BLOCKDEV;
case V_TYPE_FIFO:
return TYPE_FIFO;
case V_TYPE_LINK:
return TYPE_LINK;
case V_TYPE_SOCKET:
return TYPE_SOCKET;
default:
return 0;
}
}
#endif