From: Alan Cox Date: Fri, 23 Jun 2017 17:07:55 +0000 (+0100) Subject: libc: First cut at send/sendto/recv/recvfrom X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=70ed6cf2f50f6f97f67464619aecb172a6dda6aa;p=FUZIX.git libc: First cut at send/sendto/recv/recvfrom Not yet tested --- diff --git a/Library/include/sys/socket.h b/Library/include/sys/socket.h index 392bda3f..99482566 100644 --- a/Library/include/sys/socket.h +++ b/Library/include/sys/socket.h @@ -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 index 00000000..ade78883 --- /dev/null +++ b/Library/libs/recv.c @@ -0,0 +1,7 @@ +#include +#include + +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 index 00000000..e4001602 --- /dev/null +++ b/Library/libs/recvfrom.c @@ -0,0 +1,25 @@ +#include +#include +#include +#include + +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 index 00000000..1a344adc --- /dev/null +++ b/Library/libs/send.c @@ -0,0 +1,7 @@ +#include +#include + +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 index 00000000..702aa75b --- /dev/null +++ b/Library/libs/sendto.c @@ -0,0 +1,20 @@ +#include +#include +#include +#include + +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