From 1a48d652f51bea35bda7c200858c3c417a156a14 Mon Sep 17 00:00:00 2001 From: Matheus Date: Tue, 18 Oct 2022 13:28:06 -0300 Subject: [PATCH] sockets: recv --- src/fs/vfs.c | 3 +++ src/sys/socket.c | 9 ++++++++ src/sys/unsocket.c | 53 +++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 62 insertions(+), 3 deletions(-) diff --git a/src/fs/vfs.c b/src/fs/vfs.c index 93d12fd5..18b133b4 100644 --- a/src/fs/vfs.c +++ b/src/fs/vfs.c @@ -146,6 +146,9 @@ int vfs_read(int* error, vnode_t* node, void* buff, size_t count, size_t offset) int type = GETTYPE(node->st.st_mode); + if(type == TYPE_SOCKET) + return socket_recv(node->objdata, buff, count, 0, error); + if(type == TYPE_FIFO){ return pipe_read(node->objdata, buff, count, error); } diff --git a/src/sys/socket.c b/src/sys/socket.c index 7c630127..c30b783d 100644 --- a/src/sys/socket.c +++ b/src/sys/socket.c @@ -92,3 +92,12 @@ int socket_send(socket_t* socket, void* buff, size_t len, int flags, int* count) return EINVAL; } } + +int socket_recv(socket_t* socket, void* buff, size_t len, int flags, int* count){ + switch(socket->family){ + case AF_UNIX: + return unsocket_recv(socket, buff, len, flags, count); + default: + return EINVAL; + } +} diff --git a/src/sys/unsocket.c b/src/sys/unsocket.c index 6f9b95ec..ae874ab5 100644 --- a/src/sys/unsocket.c +++ b/src/sys/unsocket.c @@ -213,14 +213,12 @@ int unsocket_accept(socket_t** peer, socket_t* sock, void* addr, size_t* addrlen } int unsocket_send(socket_t* socket, void* buff, size_t len, int flags, int* error){ - + if(flags){ // right now no flags are supported *error = EOPNOTSUPP; return 0; } - - int err = 0; int writec = 0; socket_t* peer = socket->peer; @@ -265,3 +263,52 @@ int unsocket_send(socket_t* socket, void* buff, size_t len, int flags, int* erro return writec; } + +int unsocket_recv(socket_t* socket, void* buff, size_t len, int flags, int* error){ + + if(flags){ // right now no flags are supported + *error = EOPNOTSUPP; + return 0; + } + + int readc = 0; + + spinlock_acquire(&socket->lock); + + if(socket->state != SOCKET_STATE_CONNECTED){ + *error = ENOTCONN; + goto _return; + } + + for(;;){ + + arch_interrupt_disable(); + + readc = ringbuffer_read(&socket->buffer, buff, len); + + if(readc > 0){ + event_signal(&socket->dataevent, true); + break; + } + + spinlock_release(&socket->lock); + + if(event_wait(&socket->dataevent, true)){ + spinlock_acquire(&socket->lock); + readc = -1; + *error = EINTR; + break; + } + + spinlock_acquire(&socket->lock); + + } + + *error = 0; + + _return: + + spinlock_release(&socket->lock); + + return readc; +}