mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-02 07:28:21 +00:00
pipefs: implement FIONREAD
This commit is contained in:
@@ -9,6 +9,7 @@
|
|||||||
#include <kernel/abi.h>
|
#include <kernel/abi.h>
|
||||||
#include <kernel/poll.h>
|
#include <kernel/poll.h>
|
||||||
#include <kernel/init.h>
|
#include <kernel/init.h>
|
||||||
|
#include <kernel/usercopy.h>
|
||||||
|
|
||||||
#define BUFFER_SIZE 16 * PAGE_SIZE
|
#define BUFFER_SIZE 16 * PAGE_SIZE
|
||||||
#define PIPE_ATOMIC_SIZE 4096
|
#define PIPE_ATOMIC_SIZE 4096
|
||||||
@@ -368,6 +369,24 @@ static int pipefs_advlock(vnode_t *node, int op, advlock_t *advlock) {
|
|||||||
return vfs_advlock(node, op, advlock);
|
return vfs_advlock(node, op, advlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int pipefs_ioctl(vnode_t *node, unsigned long request, void *arg, int *result, cred_t *cred) {
|
||||||
|
pipenode_t *pipenode = (pipenode_t *)node;
|
||||||
|
int error = ENOTTY;
|
||||||
|
|
||||||
|
INTERNAL_LOCK(node);
|
||||||
|
|
||||||
|
switch (request) {
|
||||||
|
case FIONREAD: {
|
||||||
|
int i = RINGBUFFER_DATACOUNT(&pipenode->data);
|
||||||
|
error = USERCOPY_POSSIBLY_TO_USER(arg, &i, sizeof(int));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
INTERNAL_UNLOCK(node);
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
static int pipefs_enodev() {
|
static int pipefs_enodev() {
|
||||||
return ENODEV;
|
return ENODEV;
|
||||||
}
|
}
|
||||||
@@ -397,6 +416,7 @@ static vops_t vnops = {
|
|||||||
.getpage = pipefs_enodev,
|
.getpage = pipefs_enodev,
|
||||||
.sync = pipefs_enodev,
|
.sync = pipefs_enodev,
|
||||||
.advlock = pipefs_advlock,
|
.advlock = pipefs_advlock,
|
||||||
|
.ioctl = pipefs_ioctl,
|
||||||
.lock = pipefs_lock,
|
.lock = pipefs_lock,
|
||||||
.unlock = pipefs_unlock
|
.unlock = pipefs_unlock
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user