diff --git a/kernel-src/fs/pipefs.c b/kernel-src/fs/pipefs.c index 0f3fd7a0..4c748f84 100644 --- a/kernel-src/fs/pipefs.c +++ b/kernel-src/fs/pipefs.c @@ -9,6 +9,7 @@ #include #include #include +#include #define BUFFER_SIZE 16 * PAGE_SIZE #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); } +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() { return ENODEV; } @@ -397,6 +416,7 @@ static vops_t vnops = { .getpage = pipefs_enodev, .sync = pipefs_enodev, .advlock = pipefs_advlock, + .ioctl = pipefs_ioctl, .lock = pipefs_lock, .unlock = pipefs_unlock };