summaryrefslogtreecommitdiff
path: root/scalls
diff options
context:
space:
mode:
authorAnton Kling <anton@kling.gg>2023-10-27 22:17:24 +0200
committerAnton Kling <anton@kling.gg>2023-10-30 21:49:48 +0100
commitd50d18c9da3a125f0196bec89802dec1c5b0b800 (patch)
treed9a4e74906c5ab51708d148ad3728cc155a9893d /scalls
parent4f9ed7087cb58683d9423ab771ad76b31dac5514 (diff)
Kernel/LibC/Networking: Be able to send UDP messages
Now it can send UDP messages to a specific IP address and libc has enough to create a basic UDP ECHO server, that is kinda cool.
Diffstat (limited to 'scalls')
-rw-r--r--scalls/sendto.c23
-rw-r--r--scalls/sendto.h11
2 files changed, 34 insertions, 0 deletions
diff --git a/scalls/sendto.c b/scalls/sendto.c
new file mode 100644
index 0000000..48c4020
--- /dev/null
+++ b/scalls/sendto.c
@@ -0,0 +1,23 @@
+#include <assert.h>
+#include <network/bytes.h>
+#include <network/udp.h>
+#include <scalls/sendto.h>
+
+size_t syscall_sendto(int socket, const void *message, size_t length,
+ int flags, struct t_two_args *extra_args /*
+ const struct sockaddr *dest_addr,
+ socklen_t dest_len*/) {
+ const struct sockaddr *dest_addr = (const struct sockaddr *)extra_args->a;
+ socklen_t dest_len = (socklen_t)extra_args->b;
+ (void)dest_len;
+ vfs_fd_t *fd = get_vfs_fd(socket);
+ assert(fd);
+ SOCKET *s = (SOCKET *)fd->inode->internal_object;
+ OPEN_INET_SOCKET *inet = s->child;
+ assert(inet);
+ struct sockaddr_in in;
+ in.sin_addr.s_addr = inet->address;
+ in.sin_port = inet->port;
+ send_udp_packet(&in, (const struct sockaddr_in *)dest_addr, message, length);
+ return length; // FIXME: This is probably not true.
+}
diff --git a/scalls/sendto.h b/scalls/sendto.h
new file mode 100644
index 0000000..0f852de
--- /dev/null
+++ b/scalls/sendto.h
@@ -0,0 +1,11 @@
+#include <socket.h>
+#include <stdint.h>
+
+struct t_two_args {
+ uint32_t a;
+ uint32_t b;
+};
+size_t syscall_sendto(int socket, const void *message, size_t length,
+ int flags, struct t_two_args *extra_args /*
+ const struct sockaddr *dest_addr,
+ socklen_t dest_len*/);