summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Moffett <ian@osmora.org>2025-07-31 15:58:38 -0400
committerIan Moffett <ian@osmora.org>2025-07-31 15:58:38 -0400
commit88dbb581d441ad63edaea9ff7866109feac4d69e (patch)
tree5056745cebb435f24dd6a8c1cbe9c461b66961fd
parentee8be1476f057aabeaf306d1411b44201f43b11b (diff)
kernel: socket: Implement connect()
Signed-off-by: Ian Moffett <ian@osmora.org>
-rw-r--r--sys/include/sys/socket.h1
-rw-r--r--sys/kern/kern_socket.c43
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