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);
}
}
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)
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 */