From: Matthias Kruk Date: Sat, 5 Oct 2019 07:22:14 +0000 (+0900) Subject: Add sobind() function stub and call it from sys_bind() X-Git-Url: https://git.corax.cc/?a=commitdiff_plain;h=e4b6c3d91a22b9921fbc356296889d661e200b52;p=corax Add sobind() function stub and call it from sys_bind() --- diff --git a/kernel/core/cxnet.c b/kernel/core/cxnet.c index 2d0be44..36ab322 100644 --- a/kernel/core/cxnet.c +++ b/kernel/core/cxnet.c @@ -195,7 +195,7 @@ int sys_shutdown(int procfd, int how) ret_val = process_flookup(cproc, procfd); /* pass on the arguments to soshutdown(), if the lookup was successful */ - if(!ret_val) { + if(ret_val >= 0) { ret_val = soshutdown(ret_val, how); } } @@ -214,10 +214,31 @@ int sys_poll(struct pollfd *fds, nfds_t nfds, int timeout) return(-ENOSYS); } -int sys_bind(int sockfd, const struct sockaddr *addr, +int sys_bind(int procfd, const struct sockaddr *addr, socklen_t addrlen) { - return(-ENOSYS); + process_t *cproc; + int ret_val; + + cproc = process_get_current(); + ret_val = -EFAULT; + + if(cproc) { + ret_val = process_flookup(cproc, procfd); + + if(ret_val > 0) { + struct sockaddr kaddr; + socklen_t kaddrlen; + + /* copy address structure to the kernel space */ + kaddrlen = addrlen < sizeof(kaddr) ? addrlen : sizeof(kaddr); + process_memcpy_ptok(cproc, &kaddr, (void*)addr, kaddrlen); + + ret_val = sobind(ret_val, &kaddr, kaddrlen); + } + } + + return(ret_val); } int sys_cxnet(long arg0, long arg1, long arg2, long arg3, long arg4, long arg5, long arg6) diff --git a/kernel/core/socket.c b/kernel/core/socket.c index bde7f1d..5906da3 100644 --- a/kernel/core/socket.c +++ b/kernel/core/socket.c @@ -288,3 +288,8 @@ int soshutdown(int sockfd, int how) { return(-ENOSYS); } + +int sobind(int sockfd, struct sockaddr *addr, socklen_t addrlen) +{ + return(-ENOSYS); +} diff --git a/kernel/core/socket.h b/kernel/core/socket.h index e06a8c4..728e568 100644 --- a/kernel/core/socket.h +++ b/kernel/core/socket.h @@ -27,5 +27,6 @@ int sofree(int); int sosetopt(int, int, const void*, size_t); int sogetopt(int, int, void*, size_t*); int soshutdown(int, int); +int sobind(int, struct sockaddr*, socklen_t); #endif /* __SOCKET_H */