]> git.corax.cc Git - corax/commitdiff
Implement several of the syscalls of the socket interface
authorMatthias Kruk <m@m10k.eu>
Fri, 31 Jan 2020 11:29:32 +0000 (20:29 +0900)
committerMatthias Kruk <m@m10k.eu>
Fri, 31 Jan 2020 11:29:32 +0000 (20:29 +0900)
kernel/core/cxnet.c

index 36ab3226a0c2bd248798a6f84d6978ce2a8fae43..e352c191d574cc1f4dffacd026001f68e88b09e8 100644 (file)
@@ -10,6 +10,7 @@
 #include <debug.h>
 #include "socket.h"
 #include <process.h>
+#include <sys/mbuf.h>
 
 int sys_socket(int domain, int type, int protocol)
 {
@@ -62,32 +63,132 @@ int sys_close(int procfd)
        return(ret_val);
 }
 
-int sys_sendto(int sockfd, const void *buf, size_t len, int flags,
+int sys_sendto(int procfd, const void *buf, size_t len, int flags,
                           const struct sockaddr *dest_addr, socklen_t addrlen)
 {
-       return(-ENOSYS);
+       process_t *cproc;
+       int sockfd;
+       int ret_val;
+
+       cproc = process_get_current();
+       ret_val = -EFAULT;
+
+       if(cproc) {
+               sockfd = process_flookup(cproc, procfd);
+
+               if(sockfd < 0) {
+                       ret_val = sockfd;
+               } else {
+#if 0
+                       struct mbuf *m;
+
+                       m = mbuf_alloc();
+
+                       if(m) {
+                               /* FIXME: implement sosend() function and call it from here */
+                               ret_val = -ENOSYS;
+                       } else {
+                               ret_val = -ENOMEM;
+                       }
+#endif
+               }
+       }
+
+       return(ret_val);
 }
 
-int sys_recvfrom(int sockfd, void *buf, size_t len, int flags,
+int sys_recvfrom(int procfd, void *buf, size_t len, int flags,
                                 struct sockaddr *src_addr, socklen_t *addrlen)
 {
-       return(-ENOSYS);
+       process_t *cproc;
+       int sockfd;
+       int ret_val;
+
+       cproc = process_get_current();
+       ret_val = -EFAULT;
+
+       if(cproc) {
+               sockfd = process_flookup(cproc, procfd);
+
+               if(sockfd < 0) {
+                       ret_val = sockfd;
+               } else {
+                       /* FIXME: Implement sorecv() function and call it from here */
+                       ret_val = -ENOSYS;
+               }
+       }
+
+       return(ret_val);
 }
 
-int sys_connect(int sockfd, const struct sockaddr *addr,
+int sys_connect(int procfd, const struct sockaddr *addr,
                                socklen_t addrlen)
 {
-       return(-ENOSYS);
+       process_t *cproc;
+       int sockfd;
+       int ret_val;
+
+       cproc = process_get_current();
+       ret_val = -EFAULT;
+
+       if(cproc) {
+               sockfd = process_flookup(cproc, procfd);
+
+               if(sockfd < 0) {
+                       ret_val = sockfd;
+               } else {
+                       /* FIXME: Implement soconnect() */
+                       ret_val = -ENOSYS;
+               }
+       }
+
+       return(ret_val);
 }
 
-int sys_listen(int sockfd, int backlog)
+int sys_listen(int procfd, int backlog)
 {
-       return(-ENOSYS);
+       process_t *cproc;
+       int sockfd;
+       int ret_val;
+
+       cproc = process_get_current();
+       ret_val = -EFAULT;
+
+       if(cproc) {
+               sockfd = process_flookup(cproc, procfd);
+
+               if(sockfd < 0) {
+                       ret_val = sockfd;
+               } else {
+                       /* FIXME: Implement solisten() */
+                       ret_val = -ENOSYS;
+               }
+       }
+
+       return(ret_val);
 }
 
-int sys_accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
+int sys_accept(int procfd, struct sockaddr *addr, socklen_t *addrlen)
 {
-       return(-ENOSYS);
+       process_t *cproc;
+       int sockfd;
+       int ret_val;
+
+       cproc = process_get_current();
+       ret_val = -EFAULT;
+
+       if(cproc) {
+               sockfd = process_flookup(cproc, procfd);
+
+               if(sockfd < 0) {
+                       ret_val = sockfd;
+               } else {
+                       /* FIXME: Implement soaccept() */
+                       ret_val = -ENOSYS;
+               }
+       }
+
+       return(ret_val);
 }
 
 int sys_setsockopt(int procfd, int level, int optname,