diff options
author | Ian Moffett <ian@osmora.org> | 2025-07-31 15:58:38 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2025-07-31 15:58:38 -0400 |
commit | 88dbb581d441ad63edaea9ff7866109feac4d69e (patch) | |
tree | 5056745cebb435f24dd6a8c1cbe9c461b66961fd | |
parent | ee8be1476f057aabeaf306d1411b44201f43b11b (diff) |
kernel: socket: Implement connect()
Signed-off-by: Ian Moffett <ian@osmora.org>
-rw-r--r-- | sys/include/sys/socket.h | 1 | ||||
-rw-r--r-- | sys/kern/kern_socket.c | 43 |
2 files changed, 44 insertions, 0 deletions
diff --git a/sys/include/sys/socket.h b/sys/include/sys/socket.h index a69057b..a921fa8 100644 --- a/sys/include/sys/socket.h +++ b/sys/include/sys/socket.h @@ -173,6 +173,7 @@ scret_t sys_sendmsg(struct syscall_args *scargs); int socket(int domain, int type, int protocol); int bind(int sockfd, const struct sockaddr *addr, socklen_t len); +int connect(int sockfd, const struct sockaddr *addr, socklen_t len); ssize_t send(int sockfd, const void *buf, size_t size, int flags); ssize_t recv(int sockfd, void *buf, size_t len, int flags); diff --git a/sys/kern/kern_socket.c b/sys/kern/kern_socket.c index 58817c5..29fc7c1 100644 --- a/sys/kern/kern_socket.c +++ b/sys/kern/kern_socket.c @@ -394,6 +394,49 @@ bind(int sockfd, const struct sockaddr *addr, socklen_t len) } /* + * Connect to a socket + * + * @sockfd: File descriptor to connect + * @addr: Address to connect to + * @len: Length of address + */ +int +connect(int sockfd, const struct sockaddr *addr, socklen_t len) +{ + struct ksocket *ksock; + int error = -1; + + if ((error = get_ksock(sockfd, &ksock)) < 0) { + return error; + } + + switch (addr->sa_family) { + case AF_UNIX: + { + struct sockaddr_un *un; + + un = (struct sockaddr_un *)addr; + if (un->sun_path[0] == '\0') { + pr_error("connect: bad socket path\n"); + return -1; + } + + /* Wait for the connection to be established */ + do { + error = connect_domain(sockfd, ksock, un); + if (error != 0) { + sched_yield(); + } + } while (error != 0); + + return 0; + } + } + + return -1; +} + +/* * Send socket control message - POSIX.1-2008 * * @socket: Socket to transmit on |