libc: First cut at send/sendto/recv/recvfrom
authorAlan Cox <alan@linux.intel.com>
Fri, 23 Jun 2017 17:07:55 +0000 (18:07 +0100)
committerAlan Cox <alan@linux.intel.com>
Fri, 23 Jun 2017 17:07:55 +0000 (18:07 +0100)
Not yet tested

Library/include/sys/socket.h
Library/libs/recv.c [new file with mode: 0644]
Library/libs/recvfrom.c [new file with mode: 0644]
Library/libs/send.c [new file with mode: 0644]
Library/libs/sendto.c [new file with mode: 0644]

index 392bda3..9948256 100644 (file)
@@ -16,4 +16,11 @@ struct sockaddr {
   uint8_t sa_data[14];
 };
 
+ssize_t recv(int __fd, void *__buf, size_t __len, int __flags);
+ssize_t recvfrom(int __fd, void *__buf, size_t __len, int __flags,
+                  struct sockaddr *__addr, socklen_t *__addrlen);
+ssize_t send(int __fd, const void *__buf, size_t __len, int __flags);
+ssize_t sendto(int __fd, const void *__buf, size_t __len, int __flags,
+                  const struct sockaddr *__addr, socklen_t __addrlen);
+
 #endif
diff --git a/Library/libs/recv.c b/Library/libs/recv.c
new file mode 100644 (file)
index 0000000..ade7888
--- /dev/null
@@ -0,0 +1,7 @@
+#include <sys/types.h>
+#include <sys/socket.h>
+
+ssize_t recv(int fd, void *buf, size_t len, int flags)
+{
+    return recvfrom(fd, buf, len, flags, NULL, NULL);
+}
diff --git a/Library/libs/recvfrom.c b/Library/libs/recvfrom.c
new file mode 100644 (file)
index 0000000..e400160
--- /dev/null
@@ -0,0 +1,25 @@
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <string.h>
+#include <syscalls.h>
+
+ssize_t recvfrom(int fd, void *buf, size_t len, int flags, struct sockaddr *addr,
+    socklen_t *addr_len)
+{
+    struct _sockio tmp;
+    int err;
+    tmp.sio_flags = flags;
+    tmp.sio_addr_len = 0;
+    if (addr) {
+        tmp.sio_addr_len = sizeof(tmp.sio_addr);
+        if (tmp.sio_addr_len < *addr_len)
+            tmp.sio_addr_len = *addr_len;
+    }
+    err = _recvfrom(fd, buf, len, &tmp);
+    if (err == 0 && tmp.sio_addr_len) {
+        memcpy(addr, tmp.sio_addr, tmp.sio_addr_len);
+        if (addr_len)
+            *addr_len = tmp.sio_addr_len;
+    }
+    return err;
+}
\ No newline at end of file
diff --git a/Library/libs/send.c b/Library/libs/send.c
new file mode 100644 (file)
index 0000000..1a344ad
--- /dev/null
@@ -0,0 +1,7 @@
+#include <sys/types.h>
+#include <sys/socket.h>
+
+ssize_t send(int fd, void *buf, size_t len, int flags)
+{
+    return sendto(fd, buf, len, flags, NULL, 0);
+}
diff --git a/Library/libs/sendto.c b/Library/libs/sendto.c
new file mode 100644 (file)
index 0000000..702aa75
--- /dev/null
@@ -0,0 +1,20 @@
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <string.h>
+#include <syscalls.h>
+
+ssize_t sendto(int fd, void *buf, size_t len, int flags, struct sockaddr *addr,
+    socklen_t addr_len)
+{
+    struct _sockio tmp;
+    tmp.sio_flags = flags;
+    tmp.sio_addr_len = 0;
+    if (addr) {
+        int len = sizeof(tmp.sio_addr);
+        if(addr_len < len)
+            len = addr_len;
+        tmp.sio_addr_len = len;
+        memcpy(tmp.sio_addr, addr, addr_len);
+    }
+    return _sendto(fd, buf, len, &tmp);
+}
\ No newline at end of file