diff options
author | Ian Moffett <ian@osmora.org> | 2025-07-31 15:59:58 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2025-07-31 16:02:21 -0400 |
commit | 862607845cd43ca11e19f2364f2f967836712098 (patch) | |
tree | 6631cfbecacf55c560b34cae9618fd1cbb689a09 /sys/kern/kern_socket.c | |
parent | 88dbb581d441ad63edaea9ff7866109feac4d69e (diff) |
kernel: Add SYS_connect syscall
Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'sys/kern/kern_socket.c')
-rw-r--r-- | sys/kern/kern_socket.c | 41 |
1 files changed, 40 insertions, 1 deletions
diff --git a/sys/kern/kern_socket.c b/sys/kern/kern_socket.c index 29fc7c1..1717f5a 100644 --- a/sys/kern/kern_socket.c +++ b/sys/kern/kern_socket.c @@ -763,11 +763,50 @@ sys_sendmsg(struct syscall_args *scargs) msg.msg_name = NULL; msg.msg_namelen = 0; msg.msg_iov = &msg_iov; - retval = sendmsg(socket, &msg, flags); + + for (;;) { + retval = sendmsg(socket, &msg, flags); + if (retval == 0) { + break; + } + sched_yield(); + } uio_copyin_clean(&msg_iov, msg.msg_iovlen); return retval; } +/* + * connnect(3) syscall + * + * arg0: sockfd + * arg1: address + * arg2: len + */ +scret_t +sys_connect(struct syscall_args *scargs) +{ + char buf[256]; + struct sockaddr *u_addr = (void *)scargs->arg1; + struct sockaddr *sockaddr; + int error; + int sockfd = scargs->arg0; + socklen_t len = scargs->arg2; + + if (len >= sizeof(buf)) { + pr_error("sys_connect: address too big\n"); + return -E2BIG; + } + + error = copyin(u_addr, buf, len); + if (error < 0) { + pr_error("sys_connect: bad 'address'\n"); + return error; + } + + sockaddr = (struct sockaddr *)buf; + return connect(sockfd, sockaddr, len); +} + static struct vops socket_vops = { .read = NULL, .write = NULL, |