]> git.corax.cc Git - corax/commitdiff
Add sobind() function stub and call it from sys_bind()
authorMatthias Kruk <m@m10k.eu>
Sat, 5 Oct 2019 07:22:14 +0000 (16:22 +0900)
committerMatthias Kruk <m@m10k.eu>
Sat, 5 Oct 2019 07:22:14 +0000 (16:22 +0900)
kernel/core/cxnet.c
kernel/core/socket.c
kernel/core/socket.h

index 2d0be44b6b13fd4af517222ec14bcb62c0ad1423..36ab3226a0c2bd248798a6f84d6978ce2a8fae43 100644 (file)
@@ -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)
index bde7f1d98bbdc2582090880b446ee6448880c63e..5906da3e86a90ee56d27c108e1166e51e41986ac 100644 (file)
@@ -288,3 +288,8 @@ int soshutdown(int sockfd, int how)
 {
        return(-ENOSYS);
 }
+
+int sobind(int sockfd, struct sockaddr *addr, socklen_t addrlen)
+{
+       return(-ENOSYS);
+}
index e06a8c402bceb30b9c48cdbf51e7dfa594cb9dc9..728e568f6f754e1d8cc9ecf7dc9120b2713208e6 100644 (file)
@@ -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 */