diff --git a/src/fs/vfs.c b/src/fs/vfs.c index e00e1494..d2059532 100644 --- a/src/fs/vfs.c +++ b/src/fs/vfs.c @@ -107,6 +107,7 @@ int vfs_poll(vnode_t* node, pollfd* fd){ case TYPE_BLOCKDEV: return devman_poll(node->st.st_rdev, fd); case TYPE_FIFO: + return pipe_poll(node->objdata, fd); default: _panic("Unsupported poll", NULL); } diff --git a/src/include/kernel/pipe.h b/src/include/kernel/pipe.h index 83ba8f69..dc2f70c9 100644 --- a/src/include/kernel/pipe.h +++ b/src/include/kernel/pipe.h @@ -5,6 +5,7 @@ #include #include #include +#include typedef struct{ int lock; @@ -17,5 +18,6 @@ pipe_t* pipe_create(size_t buffsize); void pipe_drestroy(pipe_t* pipe); int pipe_read(pipe_t* pipe, void* buff, size_t count, int* error); int pipe_write(pipe_t* pipe, void* buff, size_t count, int* error); +int pipe_poll(pipe_t* pipe, pollfd* fd); #endif diff --git a/src/sys/pipe.c b/src/sys/pipe.c index 54ef2169..9961507b 100644 --- a/src/sys/pipe.c +++ b/src/sys/pipe.c @@ -96,3 +96,31 @@ int pipe_write(pipe_t* pipe, void* buff, size_t count, int* error){ return writec; } + +int pipe_poll(pipe_t* pipe, pollfd* fd){ + + spinlock_acquire(&pipe->lock); + + if(fd->events & POLLIN){ // fd is reading + if(pipe->writers == 0) + fd->revents |= POLLHUP; + + if(pipe->buff.write != pipe->buff.read) + fd->revents |= POLLIN; + + } + else { // fd is writing + if(pipe->readers == 0) + fd->revents |= POLLERR; + else if(pipe->buff.write != pipe->buff.read + pipe->buff.size) + fd->revents |= POLLOUT; + + + } + + + spinlock_release(&pipe->lock); + + return 0; + +}