]> xenbits.xensource.com Git - unikraft/libs/newlib.git/commitdiff
Add LWIP-compatible interface
authorEduard Vintilă <eduard.vintila47@gmail.com>
Wed, 7 Dec 2022 12:07:41 +0000 (14:07 +0200)
committerUnikraft <monkey@unikraft.io>
Mon, 8 May 2023 10:10:14 +0000 (10:10 +0000)
This commit brings back source files which were previously defined in
`lib-lwip`, but deleted as part of the Musl compatibility effort in
order to avoid redefinition. The functions need to be implemented by
the libc, so we reintroduce them in the `lib-newlib` repo to retain
compatibility with lwip.

Signed-off-by: Eduard Vintilă <eduard.vintila47@gmail.com>
Reviewed-by: Maria Sfiraiala <maria.sfiraiala@gmail.com>
Reviewed-by: Teodor Tiron <teotiron@gmail.com>
Approved-by: Razvan Deaconescu <razvand@unikraft.io>
Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #28

20 files changed:
Makefile.uk
h_errno.c [new file with mode: 0644]
include/limits.h
include/sys/poll.h
include/time.h
lwip-compatible/getnameinfo.c [new file with mode: 0644]
lwip-compatible/host.c [new file with mode: 0644]
lwip-compatible/inet.c [new file with mode: 0644]
lwip-compatible/proto.c [new file with mode: 0644]
lwip-compatible/serv.c [new file with mode: 0644]
musl-imported/include/net/if.h [new file with mode: 0644]
musl-imported/include/netinet/in.h [new file with mode: 0644]
musl-imported/include/newlib-internal/shareddefs.h [new file with mode: 0644]
musl-imported/include/sys/socket.h [new file with mode: 0644]
musl-imported/src/network/htonl.c [new file with mode: 0644]
musl-imported/src/network/htons.c [new file with mode: 0644]
musl-imported/src/network/ntohl.c [new file with mode: 0644]
musl-imported/src/network/ntohs.c [new file with mode: 0644]
patches/0014-Fix-type-macro.patch [new file with mode: 0644]
patches/0015-Add-time.h.patch [new file with mode: 0644]

index a023165bc996f760dd64b3ff959998d407251680..55e1fca82bed4a2858ac5b94b19c6faa334b856c 100644 (file)
@@ -146,13 +146,25 @@ LIBNEWLIBGLUE_SRCS-y += $(LIBNEWLIBC_BASE)/dev.c
 LIBNEWLIBGLUE_SRCS-y += $(LIBNEWLIBC_BASE)/link.c
 LIBNEWLIBGLUE_SRCS-y += $(LIBNEWLIBC_BASE)/mntent.c
 LIBNEWLIBGLUE_SRCS-y += $(LIBNEWLIBC_BASE)/syscall.c
+LIBNEWLIBGLUE_SRCS-y += $(LIBNEWLIBC_BASE)/fork.c
+ifeq ($(CONFIG_LIBPOSIX_SOCKET),y)
+LIBNEWLIBGLUE_SRCS-y += $(LIBNEWLIBC_BASE)/h_errno.c
+LIBNEWLIBGLUE_SRCS-y += $(LIBNEWLIBC_BASE)/lwip-compatible/inet.c
+LIBNEWLIBGLUE_SRCS-y += $(LIBNEWLIBC_BASE)/lwip-compatible/proto.c
+LIBNEWLIBGLUE_SRCS-y += $(LIBNEWLIBC_BASE)/lwip-compatible/getnameinfo.c
+LIBNEWLIBGLUE_SRCS-y += $(LIBNEWLIBC_BASE)/lwip-compatible/host.c
+LIBNEWLIBGLUE_SRCS-y += $(LIBNEWLIBC_BASE)/lwip-compatible/serv.c
+LIBNEWLIBGLUE_SRCS-y += $(LIBNEWLIBC_BASE)/musl-imported/src/network/htonl.c
+LIBNEWLIBGLUE_SRCS-y += $(LIBNEWLIBC_BASE)/musl-imported/src/network/htons.c
+LIBNEWLIBGLUE_SRCS-y += $(LIBNEWLIBC_BASE)/musl-imported/src/network/ntohl.c
+LIBNEWLIBGLUE_SRCS-y += $(LIBNEWLIBC_BASE)/musl-imported/src/network/ntohs.c
+endif
 LIBNEWLIBGLUE_SRCS-y += $(LIBNEWLIBC_BASE)/musl-imported/src/misc/syslog.c
 LIBNEWLIBGLUE_SRCS-y += $(LIBNEWLIBC_BASE)/musl-imported/src/termios/tcsetattr.c
 LIBNEWLIBGLUE_SRCS-y += $(LIBNEWLIBC_BASE)/musl-imported/src/termios/tcgetattr.c
 LIBNEWLIBGLUE_SRCS-y += $(LIBNEWLIBC_BASE)/musl-imported/src/math/sincosl.c
 LIBNEWLIBGLUE_SRCS-y += $(LIBNEWLIBC_BASE)/musl-imported/src/exit/assert.c
 LIBNEWLIBGLUE_SRCS-y += $(LIBNEWLIBC_BASE)/__uk_init_tls.c
-LIBNEWLIBGLUE_SRCS-y += $(LIBNEWLIBC_BASE)/fork.c
 
 ifeq ($(CONFIG_LIBNEWLIBC_CRYPT),y)
 LIBNEWLIBGLUE_CFLAGS-y   += -Wno-missing-braces -Wno-sign-compare -Wno-char-subscripts
diff --git a/h_errno.c b/h_errno.c
new file mode 100644 (file)
index 0000000..cc71c47
--- /dev/null
+++ b/h_errno.c
@@ -0,0 +1,10 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+/*
+ * Authors: Razvan Deaconescu <razvand@unikraft.io>
+ *
+ * Copyright (c) 2022, Unikraft GmbH. All rights reserved.
+ */
+
+#include <netdb.h>
+
+int h_errno;
index d654a1d29a48146c8f434ddec17bfdcf30a7394b..ce24aa92f00e3e669bea44b12317813247cac394 100644 (file)
@@ -74,6 +74,9 @@
 
 #define PATH_MAX        1024
 #define NAME_MAX        255
+
+#define IOV_MAX 1024
+
 /* The maximum number of repeated occurrences of a regular expression
  * permitted when using the interval notation `\{M,N\}'.
  */
index 446ab3f8df2081671bb945a0284e8a65ff0e937b..3de45da620f09cd3ab7790dd86f14976aee617fd 100644 (file)
@@ -1,92 +1,96 @@
 /* SPDX-License-Identifier: BSD-3-Clause */
 /*
- * This code is mostly taken from FreeBSD sys/sys/poll.h
- * Changes: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
+ * Authors: Hugo Lefeuvre <hugo.lefeuvre@manchester.ac.uk>
+ *          Marc Rittinghaus <marc.rittinghaus@kit.edu>
  *
- ****************************************************************************
- * Copyright (c) 1997 Peter Wemm <peter@freebsd.org>
- * All rights reserved.
+ * Copyright (c) 2020, NEC Laboratories Europe GmbH, NEC Corporation,
+ *                     All rights reserved.
+ * Copyright (c) 2021, Karlsruhe Institute of Technology (KIT)
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
+ *
  * 1. Redistributions of source code must retain the above copyright
  *    notice, this list of conditions and the following disclaimer.
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
+ * 3. Neither the name of the copyright holder nor the names of its
+ *    contributors may be used to endorse or promote products derived from
+ *    this software without specific prior written permission.
  *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef _POSIX_SYS_POLL_H_
-#define _POSIX_SYS_POLL_H_
+#ifndef _POSIX_SYS_POLL_H
+#define _POSIX_SYS_POLL_H
 
-#include <uk/config.h>
-/* LWIP's socket interface provides poll primitives */
-#if CONFIG_LWIP_SOCKET
-#include <lwip/sockets.h>
-#else
-/*
- * This file is intended to be compatible with the traditional poll.h.
- */
-
-typedef unsigned int nfds_t;
-
-/*
- * This structure is passed as an array to poll(2).
- */
-struct pollfd {
-       int   fd;      /* which file descriptor to poll */
-       short events;  /* events we are interested in */
-       short revents; /* events found on return */
-};
+#ifdef __cplusplus
+extern "C" {
+#endif
 
 /*
- * Requestable events.  If poll(2) finds any of these set, they are
+ * Requestable events. If poll() finds any of these set, they are
  * copied to revents on return.
  * XXX Note that FreeBSD doesn't make much distinction between POLLPRI
  * and POLLRDBAND since none of the file types have distinct priority
  * bands - and only some have an urgent "mode".
- * XXX Note POLLIN isn't really supported in true SVSV terms.  Under SYSV
- * POLLIN includes all of normal, band and urgent data.  Most poll handlers
+ * XXX Note POLLIN isn't really supported in true SYSV terms. Under SYSV
+ * POLLIN includes all of normal, band and urgent data. Most poll handlers
  * on FreeBSD only treat it as "normal" data.
  */
-#define POLLIN      0x001   /* any readable data available */
-#define POLLPRI     0x002   /* OOB/Urgent readable data */
-#define POLLOUT     0x004   /* file descriptor is writeable */
-#define POLLRDNORM  0x040   /* non-OOB/URG data available */
-#define POLLWRNORM  POLLOUT  /* no write type differentiation */
-#define POLLRDBAND  0x080   /* OOB/Urgent readable data */
-#define POLLWRBAND  0x100   /* OOB/Urgent data can be written */
+#define POLLIN         0x0001  /* File descriptor is ready for read */
+#define POLLPRI                0x0002  /* Exceptional condition */
+#define POLLOUT                0x0004  /* File descriptor is ready for write */
+#define POLLRDNORM     0x0040  /* Equivalent to POLLIN */
+#define POLLRDBAND     0x0080  /* UNUSED */
+#define POLLWRNORM     0x0100  /* Equivalent to POLLOUT */
+#define POLLWRBAND     0x0200  /* UNUSED */
+#define POLLMSG                0x0400  /* UNUSED */
+#define POLLRDHUP      0x2000  /* Stream socket peer closed connection */
 
 /*
  * These events are set if they occur regardless of whether they were
  * requested.
  */
-#define POLLERR     0x008   /* some poll error occurred */
-#define POLLHUP     0x010   /* file descriptor was "hung up" */
-#define POLLNVAL    0x020   /* requested events "invalid" */
+#define POLLERR                0x0008  /* Error or read end closed for write end fd */
+#define POLLHUP                0x0010  /* Peer closed its end of channel */
+#define POLLNVAL       0x0020  /* Invalid request: fd not open */
 
-#endif /* !CONFIG_LWIP_SOCKET */
+typedef unsigned int nfds_t;
+
+/*
+ * This structure is passed as an array to poll().
+ */
+struct pollfd {
+       int   fd;       /* Which file descriptor to poll */
+       short events;   /* Events we are interested in */
+       short revents;  /* Events found on return */
+};
 
 int poll(struct pollfd _pfd[], nfds_t _nfds, int _timeout);
 
 #ifdef _GNU_SOURCE
+#define __NEED_time_t
+#define __NEED_struct_timespec
+#define __NEED_sigset_t
+#include <newlib-internal/shareddefs.h>
 int ppoll(struct pollfd *fds, nfds_t nfds,
-        const struct timespec *tmo_p, const sigset_t *sigmask);
+         const struct timespec *tmo_p, const sigset_t *sigmask);
 #endif
 
-#endif /* _POSIX_SYS_POLL_H_ */
+#ifdef __cplusplus
+}
+#endif
+#endif /* _POSIX_SYS_POLL_H */
index 3869e3b5555284f3ef18e64cda93270054097738..3f94f1aa137920e2a9976bc65bd026f72b3ca426 100644 (file)
@@ -18,6 +18,7 @@ extern "C" {
 #define __NEED_pid_t
 #define __NEED_locale_t
 
+#include <newlib-internal/shareddefs.h>
 #include <sys/types.h>
 #include <xlocale.h>
 
diff --git a/lwip-compatible/getnameinfo.c b/lwip-compatible/getnameinfo.c
new file mode 100644 (file)
index 0000000..52c6b59
--- /dev/null
@@ -0,0 +1,148 @@
+/* SPDX-License-Identifier: BSD-3-Clause AND MIT */
+/*
+ * Copyright (C) 2014, Cloudius Systems, Ltd.
+ * Copyright (c) 2019, University Politehnica of Bucharest.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the author nor the names of any co-contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+/* For the parts taken from musl (marked as such below), the MIT licence
+ * applies instead:
+ * ----------------------------------------------------------------------
+ * Copyright (c) 2005-2014 Rich Felker, et al.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ * ----------------------------------------------------------------------
+ */
+#include <stdio.h>
+#include <sys/socket.h>
+#include <netdb.h>
+#include <arpa/inet.h>
+
+int getnameinfo(const struct sockaddr *restrict sa, socklen_t sl,
+       char *restrict node, socklen_t nodelen,
+       char *restrict serv, socklen_t servlen,
+       int flags)
+{
+       char buf[256];
+       /*unsigned char reply[512]; TODO used in DNS reply */
+       int af = sa->sa_family;
+       char line[512];
+       FILE *f;
+       unsigned char *a;
+
+       switch (af) {
+       case AF_INET:
+               a = (void *) &((struct sockaddr_in *) sa)->sin_addr;
+               if (sl != sizeof(struct sockaddr_in))
+                       return EAI_FAMILY;
+               break;
+#if CONFIG_LWIP_IPV6
+       case AF_INET6:
+               a = (void *) &((struct sockaddr_in6 *) sa)->sin6_addr;
+               if (sl != sizeof(struct sockaddr_in6))
+                       return EAI_FAMILY;
+               break;
+#endif
+       default:
+               return EAI_FAMILY;
+       }
+
+       /* Try to find ip within /etc/hosts */
+       if ((node && nodelen) && (af == AF_INET)) {
+               const char *ipstr;
+               size_t l;
+
+               ipstr = inet_ntoa(((struct sockaddr_in *)sa)->sin_addr);
+               l = strlen(ipstr);
+               f = fopen("/etc/hosts", "r");
+               if (f)
+                       while (fgets(line, sizeof(line), f)) {
+                               char *domain;
+
+                               if (strncmp(line, ipstr, l) != 0)
+                                       continue;
+
+                               domain = strtok(line, " ");
+                               if (!domain)
+                                       continue;
+                               domain = strtok(NULL, " ");
+                               if (!domain)
+                                       continue;
+
+                               if (strlen(domain) >= nodelen)
+                                       return EAI_OVERFLOW;
+                               strcpy(node, domain);
+                               fclose(f);
+                               return 0;
+                       }
+               if (f)
+                       fclose(f);
+       }
+
+       if (node && nodelen) {
+               if ((flags & NI_NUMERICHOST)
+#if 0
+                       /* TODO we currently don't support name requests */
+                       || __dns_query(reply, a, af, 1) <= 0
+                       || __dns_get_rr(buf, 0, 256, 1, reply, RR_PTR, 1) <= 0) {
+#else
+                       || 1) {
+#endif
+                       if (flags & NI_NAMEREQD)
+                               return EAI_NONAME;
+                       inet_ntop(af, a, buf, sizeof(buf));
+               }
+               if (strlen(buf) >= nodelen)
+                       return EAI_OVERFLOW;
+               strcpy(node, buf);
+       }
+
+       if (serv && servlen) {
+               if (snprintf(buf, sizeof(buf), "%d",
+                       ntohs(((struct sockaddr_in *) sa)->sin_port)) >= (int) servlen)
+                       return EAI_OVERFLOW;
+               strcpy(serv, buf);
+       }
+
+       return 0;
+}
diff --git a/lwip-compatible/host.c b/lwip-compatible/host.c
new file mode 100644 (file)
index 0000000..709a03d
--- /dev/null
@@ -0,0 +1,59 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+/*
+ * Copyright (c) 2019, University Politehnica of Bucharest.
+ *                     All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holder nor the names of its
+ *    contributors may be used to endorse or promote products derived from
+ *    this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <unistd.h>
+#include <sys/socket.h>
+#include <netdb.h>
+
+
+#if LWIP_DNS && LWIP_SOCKET
+
+#if !(LWIP_COMPAT_SOCKETS)
+struct hostent *gethostbyname(const char *name)
+{
+       return lwip_gethostbyname(name);
+}
+
+int gethostbyname_r(const char *name,
+               struct hostent *ret, char *buf, size_t buflen,
+               struct hostent **result, int *h_errnop)
+{
+       return lwip_gethostbyname_r(name, ret, buf, buflen, result, h_errnop);
+}
+#endif
+
+struct hostent *gethostbyaddr(const void *addr __unused,
+       socklen_t len __unused, int type __unused)
+{
+       return NULL;
+}
+#endif
+
diff --git a/lwip-compatible/inet.c b/lwip-compatible/inet.c
new file mode 100644 (file)
index 0000000..ebdde95
--- /dev/null
@@ -0,0 +1,144 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+/*
+ * Authors: Bogdan Lascu <lascu.bogdan96@gmail.com>
+ *
+ * Copyright (c) 2019, University Politehnica of Bucharest. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holder nor the names of its
+ *    contributors may be used to endorse or promote products derived from
+ *    this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/socket.h>
+#include <netdb.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+char *inet_ntoa(struct in_addr in)
+{
+       static char buf[16];
+       unsigned char *a = (void *)&in;
+
+       snprintf(buf, sizeof(buf), "%d.%d.%d.%d", a[0], a[1], a[2], a[3]);
+
+       return buf;
+}
+
+int inet_aton(const char *s0, struct in_addr *dest)
+{
+       const char *s = s0;
+       unsigned char *d = (void *)dest;
+       unsigned long a[4] = { 0 };
+       char *z;
+       int i;
+
+       for (i = 0; i < 4; i++) {
+               a[i] = strtoul(s, &z, 0);
+               if (z == s || (*z && *z != '.') || !isdigit(*s))
+                       return 0;
+               if (!*z)
+                       break;
+               s = z + 1;
+       }
+       if (i == 4)
+               return 0;
+       switch (i) {
+       case 0:
+               a[1] = a[0] & 0xffffff;
+               a[0] >>= 24;
+       case 1:
+               a[2] = a[1] & 0xffff;
+               a[1] >>= 16;
+       case 2:
+               a[3] = a[2] & 0xff;
+               a[2] >>= 8;
+       }
+       for (i = 0; i < 4; i++) {
+               if (a[i] > 255)
+                       return 0;
+               d[i] = a[i];
+       }
+       return 1;
+}
+
+const char *inet_ntop(int af, const void *src, char *dst, socklen_t size)
+{
+       return lwip_inet_ntop(af, src, dst, size);
+}
+
+int inet_pton(int af, const char *src, void *dst)
+{
+       return lwip_inet_pton(af, src, dst);
+}
+
+#if LWIP_DNS && LWIP_SOCKET && !(LWIP_COMPAT_SOCKETS)
+int getaddrinfo(const char *node, const char *service,
+               const struct addrinfo *hints,
+               struct addrinfo **res)
+{
+       int rc;
+
+       rc = lwip_getaddrinfo(node, service, hints, res);
+       if (!rc) {
+               /* Set the precise size of sockaddr */
+               struct addrinfo *ai = *res;
+
+               ai->ai_addrlen = ai->ai_family == AF_INET
+                               ? sizeof(struct sockaddr_in)
+                               : sizeof(struct sockaddr_in6);
+       }
+
+       return rc;
+}
+
+void freeaddrinfo(struct addrinfo *res)
+{
+       return lwip_freeaddrinfo(res);
+}
+#endif /* LWIP_DNS && LWIP_SOCKET && !(LWIP_COMPAT_SOCKETS) */
+
+/* Note: lwip implementation of getaddrinfo does not return all the errors
+ * codes mentioned in its man page.
+ */
+const char *gai_strerror(int errcode)
+{
+       switch (errcode) {
+#if LWIP_DNS_API_DEFINE_ERRORS
+       case EAI_NONAME:
+               return "The node or service is not known; or both node and service are NULL.";
+       case EAI_SERVICE:
+               return "The requested service is not available for the requested socket type.";
+       case EAI_FAIL:
+               return "The name server returned a permanent failure indication.";
+       case EAI_MEMORY:
+               return "Out of memory.";
+       case EAI_FAMILY:
+               return "The requested address family is not supported.";
+       case EAI_OVERFLOW:
+               return "The buffer pointed to by host or serv was too small.";
+#endif /* LWIP_DNS_API_DEFINE_ERRORS */
+       default:
+               return "Error on getaddrinfo.";
+       }
+}
diff --git a/lwip-compatible/proto.c b/lwip-compatible/proto.c
new file mode 100644 (file)
index 0000000..0127355
--- /dev/null
@@ -0,0 +1,113 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright (c) 2005-2014 Rich Felker, et al.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#include <sys/socket.h>
+#include <netdb.h>
+#include <string.h>
+
+/* do we really need all these?? */
+
+static size_t idx;
+static const unsigned char protos[] = {
+       "\000ip\0"
+       "\001icmp\0"
+       "\002igmp\0"
+       "\003ggp\0"
+       "\004ipencap\0"
+       "\005st\0"
+       "\006tcp\0"
+       "\010egp\0"
+       "\014pup\0"
+       "\021udp\0"
+       "\024hmp\0"
+       "\026xns-idp\0"
+       "\033rdp\0"
+       "\035iso-tp4\0"
+       "\044xtp\0"
+       "\045ddp\0"
+       "\046idpr-cmtp\0"
+       "\051ipv6\0"
+       "\053ipv6-route\0"
+       "\054ipv6-frag\0"
+       "\055idrp\0"
+       "\056rsvp\0"
+       "\057gre\0"
+       "\062esp\0"
+       "\063ah\0"
+       "\071skip\0"
+       "\072ipv6-icmp\0"
+       "\073ipv6-nonxt\0"
+       "\074ipv6-opts\0"
+       "\111rspf\0"
+       "\121vmtp\0"
+       "\131ospf\0"
+       "\136ipip\0"
+       "\142encap\0"
+       "\147pim\0"
+       "\377raw"
+};
+
+void endprotoent(void)
+{
+       idx = 0;
+}
+
+void setprotoent(int stayopen)
+{
+       idx = 0;
+}
+
+struct protoent *getprotoent(void)
+{
+       static struct protoent p;
+       static const char *aliases;
+
+       if (idx >= sizeof(protos))
+               return NULL;
+       p.p_proto = protos[idx];
+       p.p_name = (char *)&protos[idx+1];
+       p.p_aliases = (char **)&aliases;
+       idx += strlen(p.p_name) + 2;
+       return &p;
+}
+
+struct protoent *getprotobyname(const char *name)
+{
+       struct protoent *p;
+
+       endprotoent();
+       do p = getprotoent();
+       while (p && strcmp(name, p->p_name));
+       return p;
+}
+
+struct protoent *getprotobynumber(int num)
+{
+       struct protoent *p;
+
+       endprotoent();
+       do p = getprotoent();
+       while (p && p->p_proto != num);
+       return p;
+}
+
diff --git a/lwip-compatible/serv.c b/lwip-compatible/serv.c
new file mode 100644 (file)
index 0000000..2626ecc
--- /dev/null
@@ -0,0 +1,58 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+/*
+ * Copyright (c) 2019, University Politehnica of Bucharest.
+ *                     All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holder nor the names of its
+ *    contributors may be used to endorse or promote products derived from
+ *    this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#include <inttypes.h>
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+
+struct servent *getservbyname(const char *name __unused,
+       const char *proto __unused)
+{
+       return NULL;
+}
+
+struct servent *getservbyport(int port __unused,
+       const char *proto __unused)
+{
+       return NULL;
+}
+
+int getservbyport_r(int port __unused, const char *prots __unused,
+                   struct servent *se __unused, char *buf __unused,
+                   size_t buflen __unused, struct servent **res __unused)
+{
+       errno = ENOSYS;
+       return EAI_SYSTEM;
+}
diff --git a/musl-imported/include/net/if.h b/musl-imported/include/net/if.h
new file mode 100644 (file)
index 0000000..ee0e1eb
--- /dev/null
@@ -0,0 +1,130 @@
+#ifndef _NET_IF_H
+#define _NET_IF_H
+
+#include <uk/config.h>
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef IF_NAMESIZE
+#define IF_NAMESIZE 16
+#endif
+
+unsigned int if_nametoindex (const char *);
+char *if_indextoname (unsigned int, char *);
+
+#include <sys/socket.h>
+
+#define IFF_UP 0x1
+#define IFF_BROADCAST 0x2
+#define IFF_DEBUG 0x4
+#define IFF_LOOPBACK 0x8
+#define IFF_POINTOPOINT 0x10
+#define IFF_NOTRAILERS 0x20
+#define IFF_RUNNING 0x40
+#define IFF_NOARP 0x80
+#define IFF_PROMISC 0x100
+#define IFF_ALLMULTI 0x200
+#define IFF_MASTER 0x400
+#define IFF_SLAVE 0x800
+#define IFF_MULTICAST 0x1000
+#define IFF_PORTSEL 0x2000
+#define IFF_AUTOMEDIA 0x4000
+#define IFF_DYNAMIC 0x8000
+#define IFF_LOWER_UP 0x10000
+#define IFF_DORMANT 0x20000
+#define IFF_ECHO 0x40000
+#define IFF_VOLATILE (IFF_LOOPBACK|IFF_POINTOPOINT|IFF_BROADCAST| \
+        IFF_ECHO|IFF_MASTER|IFF_SLAVE|IFF_RUNNING|IFF_LOWER_UP|IFF_DORMANT)
+
+struct ifaddr {
+       struct sockaddr ifa_addr;
+       union {
+               struct sockaddr ifu_broadaddr;
+               struct sockaddr ifu_dstaddr;
+       } ifa_ifu;
+       struct iface *ifa_ifp;
+       struct ifaddr *ifa_next;
+};
+
+#define ifa_broadaddr  ifa_ifu.ifu_broadaddr
+#define ifa_dstaddr    ifa_ifu.ifu_dstaddr
+
+struct ifmap {
+       unsigned long int mem_start;
+       unsigned long int mem_end;
+       unsigned short int base_addr;
+       unsigned char irq;
+       unsigned char dma;
+       unsigned char port;
+};
+
+#define IFHWADDRLEN    6
+#define IFNAMSIZ       IF_NAMESIZE
+
+struct ifreq {
+       union {
+               char ifrn_name[IFNAMSIZ];
+       } ifr_ifrn;
+       union {
+               struct sockaddr ifru_addr;
+               struct sockaddr ifru_dstaddr;
+               struct sockaddr ifru_broadaddr;
+               struct sockaddr ifru_netmask;
+               struct sockaddr ifru_hwaddr;
+               short int ifru_flags;
+               int ifru_ivalue;
+               int ifru_mtu;
+               struct ifmap ifru_map;
+               char ifru_slave[IFNAMSIZ];
+               char ifru_newname[IFNAMSIZ];
+               char *ifru_data;
+       } ifr_ifru;
+};
+
+#define ifr_name       ifr_ifrn.ifrn_name
+#define ifr_hwaddr     ifr_ifru.ifru_hwaddr
+#define ifr_addr       ifr_ifru.ifru_addr
+#define ifr_dstaddr    ifr_ifru.ifru_dstaddr
+#define ifr_broadaddr  ifr_ifru.ifru_broadaddr
+#define ifr_netmask    ifr_ifru.ifru_netmask
+#define ifr_flags      ifr_ifru.ifru_flags
+#define ifr_metric     ifr_ifru.ifru_ivalue
+#define ifr_mtu                ifr_ifru.ifru_mtu
+#define ifr_map                ifr_ifru.ifru_map
+#define ifr_slave      ifr_ifru.ifru_slave
+#define ifr_data       ifr_ifru.ifru_data
+#define ifr_ifindex    ifr_ifru.ifru_ivalue
+#define ifr_bandwidth  ifr_ifru.ifru_ivalue
+#define ifr_qlen       ifr_ifru.ifru_ivalue
+#define ifr_newname    ifr_ifru.ifru_newname
+#define _IOT_ifreq     _IOT(_IOTS(char),IFNAMSIZ,_IOTS(char),16,0,0)
+#define _IOT_ifreq_short _IOT(_IOTS(char),IFNAMSIZ,_IOTS(short),1,0,0)
+#define _IOT_ifreq_int _IOT(_IOTS(char),IFNAMSIZ,_IOTS(int),1,0,0)
+
+struct ifconf {
+       int ifc_len;            
+       union {
+               char *ifcu_buf;
+               struct ifreq *ifcu_req;
+       } ifc_ifcu;
+};
+
+#define ifc_buf                ifc_ifcu.ifcu_buf
+#define ifc_req                ifc_ifcu.ifcu_req
+#define _IOT_ifconf _IOT(_IOTS(struct ifconf),1,0,0,0,0)
+
+#define __UAPI_DEF_IF_IFCONF                                    0
+#define __UAPI_DEF_IF_IFMAP                                     0
+#define __UAPI_DEF_IF_IFNAMSIZ                                  0
+#define __UAPI_DEF_IF_IFREQ                                     0
+#define __UAPI_DEF_IF_NET_DEVICE_FLAGS                          0
+#define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO    0
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/musl-imported/include/netinet/in.h b/musl-imported/include/netinet/in.h
new file mode 100644 (file)
index 0000000..f075cc5
--- /dev/null
@@ -0,0 +1,414 @@
+#ifndef        _NETINET_IN_H
+#define        _NETINET_IN_H
+
+#include <uk/config.h>
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <newlib-internal/shareddefs.h>
+#include <stdint.h>
+#include <sys/socket.h>
+
+typedef uint16_t in_port_t;
+typedef uint32_t in_addr_t;
+struct in_addr { in_addr_t s_addr; };
+
+struct sockaddr_in {
+       sa_family_t sin_family;
+       in_port_t sin_port;
+       struct in_addr sin_addr;
+       uint8_t sin_zero[8];
+};
+
+struct in6_addr {
+       union {
+               uint8_t __s6_addr[16];
+               uint16_t __s6_addr16[8];
+               uint32_t __s6_addr32[4];
+       } __in6_union;
+};
+#define s6_addr __in6_union.__s6_addr
+#define s6_addr16 __in6_union.__s6_addr16
+#define s6_addr32 __in6_union.__s6_addr32
+
+struct sockaddr_in6 {
+       sa_family_t     sin6_family;
+       in_port_t       sin6_port;
+       uint32_t        sin6_flowinfo;
+       struct in6_addr sin6_addr;
+       uint32_t        sin6_scope_id;
+};
+
+struct ipv6_mreq {
+       struct in6_addr ipv6mr_multiaddr;
+       unsigned        ipv6mr_interface;
+};
+
+#define INADDR_ANY        ((in_addr_t) 0x00000000)
+#define INADDR_BROADCAST  ((in_addr_t) 0xffffffff)
+#define INADDR_NONE       ((in_addr_t) 0xffffffff)
+#define INADDR_LOOPBACK   ((in_addr_t) 0x7f000001)
+
+#define INADDR_UNSPEC_GROUP     ((in_addr_t) 0xe0000000)
+#define INADDR_ALLHOSTS_GROUP   ((in_addr_t) 0xe0000001)
+#define INADDR_ALLRTRS_GROUP    ((in_addr_t) 0xe0000002)
+#define INADDR_MAX_LOCAL_GROUP  ((in_addr_t) 0xe00000ff)
+
+#define IN6ADDR_ANY_INIT      { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } }
+#define IN6ADDR_LOOPBACK_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } }
+
+extern const struct in6_addr in6addr_any, in6addr_loopback;
+
+#undef INET_ADDRSTRLEN
+#undef INET6_ADDRSTRLEN
+#define INET_ADDRSTRLEN  16
+#define INET6_ADDRSTRLEN 46
+
+uint32_t htonl(uint32_t);
+uint16_t htons(uint16_t);
+uint32_t ntohl(uint32_t);
+uint16_t ntohs(uint16_t);
+
+#define IPPORT_RESERVED 1024
+
+#define IPPROTO_IP       0
+#define IPPROTO_HOPOPTS  0
+#define IPPROTO_ICMP     1
+#define IPPROTO_IGMP     2
+#define IPPROTO_IPIP     4
+#define IPPROTO_TCP      6
+#define IPPROTO_EGP      8
+#define IPPROTO_PUP      12
+#define IPPROTO_UDP      17
+#define IPPROTO_IDP      22
+#define IPPROTO_TP       29
+#define IPPROTO_DCCP     33
+#define IPPROTO_IPV6     41
+#define IPPROTO_ROUTING  43
+#define IPPROTO_FRAGMENT 44
+#define IPPROTO_RSVP     46
+#define IPPROTO_GRE      47
+#define IPPROTO_ESP      50
+#define IPPROTO_AH       51
+#define IPPROTO_ICMPV6   58
+#define IPPROTO_NONE     59
+#define IPPROTO_DSTOPTS  60
+#define IPPROTO_MTP      92
+#define IPPROTO_BEETPH   94
+#define IPPROTO_ENCAP    98
+#define IPPROTO_PIM      103
+#define IPPROTO_COMP     108
+#define IPPROTO_SCTP     132
+#define IPPROTO_MH       135
+#define IPPROTO_UDPLITE  136
+#define IPPROTO_MPLS     137
+#define IPPROTO_RAW      255
+#define IPPROTO_MAX      256
+
+#define IN6_IS_ADDR_UNSPECIFIED(a) \
+        (((uint32_t *) (a))[0] == 0 && ((uint32_t *) (a))[1] == 0 && \
+         ((uint32_t *) (a))[2] == 0 && ((uint32_t *) (a))[3] == 0)
+
+#define IN6_IS_ADDR_LOOPBACK(a) \
+        (((uint32_t *) (a))[0] == 0 && ((uint32_t *) (a))[1] == 0 && \
+         ((uint32_t *) (a))[2] == 0 && \
+         ((uint8_t *) (a))[12] == 0 && ((uint8_t *) (a))[13] == 0 && \
+         ((uint8_t *) (a))[14] == 0 && ((uint8_t *) (a))[15] == 1 )
+
+#define IN6_IS_ADDR_MULTICAST(a) (((uint8_t *) (a))[0] == 0xff)
+
+#define IN6_IS_ADDR_LINKLOCAL(a) \
+        ((((uint8_t *) (a))[0]) == 0xfe && (((uint8_t *) (a))[1] & 0xc0) == 0x80)
+
+#define IN6_IS_ADDR_SITELOCAL(a) \
+        ((((uint8_t *) (a))[0]) == 0xfe && (((uint8_t *) (a))[1] & 0xc0) == 0xc0)
+
+#define IN6_IS_ADDR_V4MAPPED(a) \
+        (((uint32_t *) (a))[0] == 0 && ((uint32_t *) (a))[1] == 0 && \
+         ((uint8_t *) (a))[8] == 0 && ((uint8_t *) (a))[9] == 0 && \
+         ((uint8_t *) (a))[10] == 0xff && ((uint8_t *) (a))[11] == 0xff)
+
+#define IN6_IS_ADDR_V4COMPAT(a) \
+        (((uint32_t *) (a))[0] == 0 && ((uint32_t *) (a))[1] == 0 && \
+         ((uint32_t *) (a))[2] == 0 && ((uint8_t *) (a))[15] > 1)
+
+#define IN6_IS_ADDR_MC_NODELOCAL(a) \
+        (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t *) (a))[1] & 0xf) == 0x1))
+
+#define IN6_IS_ADDR_MC_LINKLOCAL(a) \
+        (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t *) (a))[1] & 0xf) == 0x2))
+
+#define IN6_IS_ADDR_MC_SITELOCAL(a) \
+        (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t *) (a))[1] & 0xf) == 0x5))
+
+#define IN6_IS_ADDR_MC_ORGLOCAL(a) \
+        (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t *) (a))[1] & 0xf) == 0x8))
+
+#define IN6_IS_ADDR_MC_GLOBAL(a) \
+        (IN6_IS_ADDR_MULTICAST(a) && ((((uint8_t *) (a))[1] & 0xf) == 0xe))
+
+#define __ARE_4_EQUAL(a,b) \
+       (!( (0[a]-0[b]) | (1[a]-1[b]) | (2[a]-2[b]) | (3[a]-3[b]) ))
+#define IN6_ARE_ADDR_EQUAL(a,b) \
+       __ARE_4_EQUAL((const uint32_t *)(a), (const uint32_t *)(b))
+
+#define        IN_CLASSA(a)            ((((in_addr_t)(a)) & 0x80000000) == 0)
+#define        IN_CLASSA_NET           0xff000000
+#define        IN_CLASSA_NSHIFT        24
+#define        IN_CLASSA_HOST          (0xffffffff & ~IN_CLASSA_NET)
+#define        IN_CLASSA_MAX           128
+#define        IN_CLASSB(a)            ((((in_addr_t)(a)) & 0xc0000000) == 0x80000000)
+#define        IN_CLASSB_NET           0xffff0000
+#define        IN_CLASSB_NSHIFT        16
+#define        IN_CLASSB_HOST          (0xffffffff & ~IN_CLASSB_NET)
+#define        IN_CLASSB_MAX           65536
+#define        IN_CLASSC(a)            ((((in_addr_t)(a)) & 0xe0000000) == 0xc0000000)
+#define        IN_CLASSC_NET           0xffffff00
+#define        IN_CLASSC_NSHIFT        8
+#define        IN_CLASSC_HOST          (0xffffffff & ~IN_CLASSC_NET)
+#define        IN_CLASSD(a)            ((((in_addr_t)(a)) & 0xf0000000) == 0xe0000000)
+#define        IN_MULTICAST(a)         IN_CLASSD(a)
+#define        IN_EXPERIMENTAL(a)      ((((in_addr_t)(a)) & 0xe0000000) == 0xe0000000)
+#define        IN_BADCLASS(a)          ((((in_addr_t)(a)) & 0xf0000000) == 0xf0000000)
+
+#define IN_LOOPBACKNET 127
+
+
+#define IP_TOS             1
+#define IP_TTL             2
+#define IP_HDRINCL         3
+#define IP_OPTIONS         4
+#define IP_ROUTER_ALERT    5
+#define IP_RECVOPTS        6
+#define IP_RETOPTS         7
+#define IP_PKTINFO         8
+#define IP_PKTOPTIONS      9
+#define IP_PMTUDISC        10
+#define IP_MTU_DISCOVER    10
+#define IP_RECVERR         11
+#define IP_RECVTTL         12
+#define IP_RECVTOS         13
+#define IP_MTU             14
+#define IP_FREEBIND        15
+#define IP_IPSEC_POLICY    16
+#define IP_XFRM_POLICY     17
+#define IP_PASSSEC         18
+#define IP_TRANSPARENT     19
+#define IP_ORIGDSTADDR     20
+#define IP_RECVORIGDSTADDR IP_ORIGDSTADDR
+#define IP_MINTTL          21
+#define IP_NODEFRAG        22
+#define IP_CHECKSUM        23
+#define IP_BIND_ADDRESS_NO_PORT 24
+#define IP_RECVFRAGSIZE    25
+#define IP_MULTICAST_IF    32
+#define IP_MULTICAST_TTL   33
+#define IP_MULTICAST_LOOP  34
+#define IP_ADD_MEMBERSHIP  35
+#define IP_DROP_MEMBERSHIP 36
+#define IP_UNBLOCK_SOURCE  37
+#define IP_BLOCK_SOURCE    38
+#define IP_ADD_SOURCE_MEMBERSHIP  39
+#define IP_DROP_SOURCE_MEMBERSHIP 40
+#define IP_MSFILTER        41
+#define IP_MULTICAST_ALL   49
+#define IP_UNICAST_IF      50
+
+#define IP_RECVRETOPTS IP_RETOPTS
+
+#define IP_PMTUDISC_DONT   0
+#define IP_PMTUDISC_WANT   1
+#define IP_PMTUDISC_DO     2
+#define IP_PMTUDISC_PROBE  3
+#define IP_PMTUDISC_INTERFACE 4
+#define IP_PMTUDISC_OMIT   5
+
+#define IP_DEFAULT_MULTICAST_TTL        1
+#define IP_DEFAULT_MULTICAST_LOOP       1
+#define IP_MAX_MEMBERSHIPS              20
+
+struct ip_opts {
+       struct in_addr ip_dst;
+       char ip_opts[40];
+};
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+
+#define MCAST_JOIN_GROUP   42
+#define MCAST_BLOCK_SOURCE 43
+#define MCAST_UNBLOCK_SOURCE      44
+#define MCAST_LEAVE_GROUP  45
+#define MCAST_JOIN_SOURCE_GROUP   46
+#define MCAST_LEAVE_SOURCE_GROUP  47
+#define MCAST_MSFILTER     48
+
+#define MCAST_EXCLUDE 0
+#define MCAST_INCLUDE 1
+
+struct ip_mreq {
+       struct in_addr imr_multiaddr;
+       struct in_addr imr_interface;
+};
+
+struct ip_mreqn {
+       struct in_addr imr_multiaddr;
+       struct in_addr imr_address;
+       int imr_ifindex;
+};
+
+struct ip_mreq_source {
+       struct in_addr imr_multiaddr;
+       struct in_addr imr_interface;
+       struct in_addr imr_sourceaddr;
+};
+
+struct ip_msfilter {
+       struct in_addr imsf_multiaddr;
+       struct in_addr imsf_interface;
+       uint32_t imsf_fmode;
+       uint32_t imsf_numsrc;
+       struct in_addr imsf_slist[1];
+};
+#define IP_MSFILTER_SIZE(numsrc) \
+       (sizeof(struct ip_msfilter) - sizeof(struct in_addr) \
+       + (numsrc) * sizeof(struct in_addr))
+
+struct group_req {
+       uint32_t gr_interface;
+       struct sockaddr_storage gr_group;
+};
+
+struct group_source_req {
+       uint32_t gsr_interface;
+       struct sockaddr_storage gsr_group;
+       struct sockaddr_storage gsr_source;
+};
+
+struct group_filter {
+       uint32_t gf_interface;
+       struct sockaddr_storage gf_group;
+       uint32_t gf_fmode;
+       uint32_t gf_numsrc;
+       struct sockaddr_storage gf_slist[1];
+};
+#define GROUP_FILTER_SIZE(numsrc) \
+       (sizeof(struct group_filter) - sizeof(struct sockaddr_storage) \
+       + (numsrc) * sizeof(struct sockaddr_storage))
+
+struct in_pktinfo {
+       int ipi_ifindex;
+       struct in_addr ipi_spec_dst;
+       struct in_addr ipi_addr;
+};
+
+struct in6_pktinfo {
+       struct in6_addr ipi6_addr;
+       unsigned ipi6_ifindex;
+};
+
+struct ip6_mtuinfo {
+       struct sockaddr_in6 ip6m_addr;
+       uint32_t ip6m_mtu;
+};
+#endif
+
+#define IPV6_ADDRFORM           1
+#define IPV6_2292PKTINFO        2
+#define IPV6_2292HOPOPTS        3
+#define IPV6_2292DSTOPTS        4
+#define IPV6_2292RTHDR          5
+#define IPV6_2292PKTOPTIONS     6
+#define IPV6_CHECKSUM           7
+#define IPV6_2292HOPLIMIT       8
+#define IPV6_NEXTHOP            9
+#define IPV6_AUTHHDR            10
+#define IPV6_UNICAST_HOPS       16
+#define IPV6_MULTICAST_IF       17
+#define IPV6_MULTICAST_HOPS     18
+#define IPV6_MULTICAST_LOOP     19
+#define IPV6_JOIN_GROUP         20
+#define IPV6_LEAVE_GROUP        21
+#define IPV6_ROUTER_ALERT       22
+#define IPV6_MTU_DISCOVER       23
+#define IPV6_MTU                24
+#define IPV6_RECVERR            25
+#define IPV6_V6ONLY             26
+#define IPV6_JOIN_ANYCAST       27
+#define IPV6_LEAVE_ANYCAST      28
+#define IPV6_IPSEC_POLICY       34
+#define IPV6_XFRM_POLICY        35
+#define IPV6_HDRINCL            36
+
+#define IPV6_RECVPKTINFO        49
+#define IPV6_PKTINFO            50
+#define IPV6_RECVHOPLIMIT       51
+#define IPV6_HOPLIMIT           52
+#define IPV6_RECVHOPOPTS        53
+#define IPV6_HOPOPTS            54
+#define IPV6_RTHDRDSTOPTS       55
+#define IPV6_RECVRTHDR          56
+#define IPV6_RTHDR              57
+#define IPV6_RECVDSTOPTS        58
+#define IPV6_DSTOPTS            59
+#define IPV6_RECVPATHMTU        60
+#define IPV6_PATHMTU            61
+#define IPV6_DONTFRAG           62
+#define IPV6_RECVTCLASS         66
+#define IPV6_TCLASS             67
+#define IPV6_AUTOFLOWLABEL      70
+#define IPV6_ADDR_PREFERENCES   72
+#define IPV6_MINHOPCOUNT        73
+#define IPV6_ORIGDSTADDR        74
+#define IPV6_RECVORIGDSTADDR    IPV6_ORIGDSTADDR
+#define IPV6_TRANSPARENT        75
+#define IPV6_UNICAST_IF         76
+#define IPV6_RECVFRAGSIZE       77
+
+#define IPV6_ADD_MEMBERSHIP     IPV6_JOIN_GROUP
+#define IPV6_DROP_MEMBERSHIP    IPV6_LEAVE_GROUP
+#define IPV6_RXHOPOPTS          IPV6_HOPOPTS
+#define IPV6_RXDSTOPTS          IPV6_DSTOPTS
+
+#define IPV6_PMTUDISC_DONT      0
+#define IPV6_PMTUDISC_WANT      1
+#define IPV6_PMTUDISC_DO        2
+#define IPV6_PMTUDISC_PROBE     3
+#define IPV6_PMTUDISC_INTERFACE 4
+#define IPV6_PMTUDISC_OMIT      5
+
+#define IPV6_PREFER_SRC_TMP            0x0001
+#define IPV6_PREFER_SRC_PUBLIC         0x0002
+#define IPV6_PREFER_SRC_PUBTMP_DEFAULT 0x0100
+#define IPV6_PREFER_SRC_COA            0x0004
+#define IPV6_PREFER_SRC_HOME           0x0400
+#define IPV6_PREFER_SRC_CGA            0x0008
+#define IPV6_PREFER_SRC_NONCGA         0x0800
+
+#define IPV6_RTHDR_LOOSE        0
+#define IPV6_RTHDR_STRICT       1
+
+#define IPV6_RTHDR_TYPE_0       0
+
+#define __UAPI_DEF_IN_ADDR      0
+#define __UAPI_DEF_IN_IPPROTO   0
+#define __UAPI_DEF_IN_PKTINFO   0
+#define __UAPI_DEF_IP_MREQ      0
+#define __UAPI_DEF_SOCKADDR_IN  0
+#define __UAPI_DEF_IN_CLASS     0
+#define __UAPI_DEF_IN6_ADDR     0
+#define __UAPI_DEF_IN6_ADDR_ALT 0
+#define __UAPI_DEF_SOCKADDR_IN6 0
+#define __UAPI_DEF_IPV6_MREQ    0
+#define __UAPI_DEF_IPPROTO_V6   0
+#define __UAPI_DEF_IPV6_OPTIONS 0
+#define __UAPI_DEF_IN6_PKTINFO  0
+#define __UAPI_DEF_IP6_MTUINFO  0
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/musl-imported/include/newlib-internal/shareddefs.h b/musl-imported/include/newlib-internal/shareddefs.h
new file mode 100644 (file)
index 0000000..b3ba1ad
--- /dev/null
@@ -0,0 +1,104 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+/*
+ * Authors: Florian Schmidt <florian.schmidt@neclab.eu>
+ *
+ * Copyright (c) 2018, NEC Labs Europe, NEC Corporation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holder nor the names of its
+ *    contributors may be used to endorse or promote products derived from
+ *    this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/* This header does by design not have include guards, so that it can be
+ * included from multiple files. The __NEED_x macros instead make sure that
+ * only those definitions are included that are required by that specific
+ * file, and only if they haven't been defined on a previous pass through
+ * this file.
+ */
+
+#include <uk/config.h>
+#include <uk/arch/types.h>
+
+#if defined(__NEED_socklen_t) && !defined(__DEFINED_socklen_t)
+#ifdef __machine_socklen_t_defined
+typedef __socklen_t socklen_t;
+#else
+typedef unsigned int __socklen_t;
+typedef __socklen_t socklen_t;
+#endif
+#define __DEFINED_socklen_t
+#define __machine_socklen_t_defined
+#endif
+
+#if (defined __NEED_time_t && !defined __DEFINED_time_t)
+typedef long time_t;
+#define __DEFINED_time_t
+#endif
+
+#if (defined __NEED_suseconds_t && !defined __DEFINED_suseconds_t)
+typedef long suseconds_t;
+#define __DEFINED_suseconds_t
+#endif
+
+#if (defined __NEED_struct_timeval && !defined __DEFINED_struct_timeval)
+struct timeval {
+       time_t      tv_sec;
+       suseconds_t tv_usec;
+};
+#define __DEFINED_struct_timeval
+#endif
+
+#if (defined __NEED_struct_timespec && !defined __DEFINED_struct_timespec)
+struct timespec {
+       time_t tv_sec;
+       long   tv_nsec;
+};
+#define __DEFINED_struct_timespec
+#endif
+
+#if defined(__NEED_timer_t) && !defined(__DEFINED_timer_t)
+typedef void *timer_t;
+#define __DEFINED_timer_t
+#endif
+
+#if (defined __NEED_clockid_t && !defined __DEFINED_clockid_t)
+typedef int clockid_t;
+#define __DEFINED_clockid_t
+#endif
+
+#if defined(__NEED_clock_t) && !defined(__DEFINED_clock_t)
+typedef long clock_t;
+#define __DEFINED_clock_t
+#endif
+
+#if defined(__NEED_sa_family_t) && !defined(__DEFINED_sa_family_t)
+#ifdef __machine_sa_family_t_defined
+typedef __sa_family_t sa_family_t;
+#else
+typedef unsigned short __sa_family_t;
+typedef __sa_family_t sa_family_t;
+#endif
+#define __DEFINED_sa_family_t
+#define __machine_sa_family_t_defined
+#endif
diff --git a/musl-imported/include/sys/socket.h b/musl-imported/include/sys/socket.h
new file mode 100644 (file)
index 0000000..5cf8c15
--- /dev/null
@@ -0,0 +1,364 @@
+#ifndef        _SYS_SOCKET_H
+#define        _SYS_SOCKET_H
+
+#include <uk/config.h>
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define __NEED_socklen_t
+#define __NEED_sa_family_t
+#define __NEED_size_t
+#define __NEED_ssize_t
+#define __NEED_uid_t
+#define __NEED_pid_t
+#define __NEED_gid_t
+#define __NEED_struct_iovec
+
+#include <newlib-internal/shareddefs.h>
+
+/* from bits/socket.h */
+struct msghdr {
+        void *msg_name;
+        socklen_t msg_namelen;
+        struct iovec *msg_iov;
+        int msg_iovlen, __pad1;
+        void *msg_control;
+        socklen_t msg_controllen, __pad2;
+        int msg_flags;
+};
+
+/* from bits/socket.h */
+struct cmsghdr {
+        socklen_t cmsg_len;
+        int __pad1;
+        int cmsg_level;
+        int cmsg_type;
+};
+
+#ifdef _GNU_SOURCE
+struct ucred {
+        pid_t pid;
+        uid_t uid;
+        gid_t gid;
+};
+
+struct mmsghdr {
+        struct msghdr msg_hdr;
+        unsigned int  msg_len;
+};
+
+struct timespec;
+
+int sendmmsg (int, struct mmsghdr *, unsigned int, unsigned int);
+int recvmmsg (int, struct mmsghdr *, unsigned int, unsigned int, struct timespec *);
+#endif
+
+struct linger {
+        int l_onoff;
+        int l_linger;
+};
+
+#define SHUT_RD 0
+#define SHUT_WR 1
+#define SHUT_RDWR 2
+
+#ifndef SOCK_STREAM
+#define SOCK_STREAM    1
+#define SOCK_DGRAM     2
+#endif
+
+#define SOCK_RAW       3
+#define SOCK_RDM       4
+#define SOCK_SEQPACKET 5
+#define SOCK_DCCP      6
+#define SOCK_PACKET    10
+
+#ifndef SOCK_CLOEXEC
+#define SOCK_CLOEXEC   02000000
+#define SOCK_NONBLOCK  04000
+#endif
+
+#define PF_UNSPEC       0
+#define PF_LOCAL        1
+#define PF_UNIX         PF_LOCAL
+#define PF_FILE         PF_LOCAL
+#define PF_INET         2
+#define PF_AX25         3
+#define PF_IPX          4
+#define PF_APPLETALK    5
+#define PF_NETROM       6
+#define PF_BRIDGE       7
+#define PF_ATMPVC       8
+#define PF_X25          9
+#define PF_INET6        10
+#define PF_ROSE         11
+#define PF_DECnet       12
+#define PF_NETBEUI      13
+#define PF_SECURITY     14
+#define PF_KEY          15
+#define PF_NETLINK      16
+#define PF_ROUTE        PF_NETLINK
+#define PF_PACKET       17
+#define PF_ASH          18
+#define PF_ECONET       19
+#define PF_ATMSVC       20
+#define PF_RDS          21
+#define PF_SNA          22
+#define PF_IRDA         23
+#define PF_PPPOX        24
+#define PF_WANPIPE      25
+#define PF_LLC          26
+#define PF_IB           27
+#define PF_MPLS         28
+#define PF_CAN          29
+#define PF_TIPC         30
+#define PF_BLUETOOTH    31
+#define PF_IUCV         32
+#define PF_RXRPC        33
+#define PF_ISDN         34
+#define PF_PHONET       35
+#define PF_IEEE802154   36
+#define PF_CAIF         37
+#define PF_ALG          38
+#define PF_NFC          39
+#define PF_VSOCK        40
+#define PF_KCM          41
+#define PF_QIPCRTR      42
+#define PF_MAX          43
+
+#define AF_UNSPEC       PF_UNSPEC
+#define AF_LOCAL        PF_LOCAL
+#define AF_UNIX         AF_LOCAL
+#define AF_FILE         AF_LOCAL
+#define AF_INET         PF_INET
+#define AF_AX25         PF_AX25
+#define AF_IPX          PF_IPX
+#define AF_APPLETALK    PF_APPLETALK
+#define AF_NETROM       PF_NETROM
+#define AF_BRIDGE       PF_BRIDGE
+#define AF_ATMPVC       PF_ATMPVC
+#define AF_X25          PF_X25
+#define AF_INET6        PF_INET6
+#define AF_ROSE         PF_ROSE
+#define AF_DECnet       PF_DECnet
+#define AF_NETBEUI      PF_NETBEUI
+#define AF_SECURITY     PF_SECURITY
+#define AF_KEY          PF_KEY
+#define AF_NETLINK      PF_NETLINK
+#define AF_ROUTE        PF_ROUTE
+#define AF_PACKET       PF_PACKET
+#define AF_ASH          PF_ASH
+#define AF_ECONET       PF_ECONET
+#define AF_ATMSVC       PF_ATMSVC
+#define AF_RDS          PF_RDS
+#define AF_SNA          PF_SNA
+#define AF_IRDA         PF_IRDA
+#define AF_PPPOX        PF_PPPOX
+#define AF_WANPIPE      PF_WANPIPE
+#define AF_LLC          PF_LLC
+#define AF_IB           PF_IB
+#define AF_MPLS         PF_MPLS
+#define AF_CAN          PF_CAN
+#define AF_TIPC         PF_TIPC
+#define AF_BLUETOOTH    PF_BLUETOOTH
+#define AF_IUCV         PF_IUCV
+#define AF_RXRPC        PF_RXRPC
+#define AF_ISDN         PF_ISDN
+#define AF_PHONET       PF_PHONET
+#define AF_IEEE802154   PF_IEEE802154
+#define AF_CAIF         PF_CAIF
+#define AF_ALG          PF_ALG
+#define AF_NFC          PF_NFC
+#define AF_VSOCK        PF_VSOCK
+#define AF_KCM          PF_KCM
+#define AF_QIPCRTR      PF_QIPCRTR
+#define AF_MAX          PF_MAX
+
+#ifndef SO_DEBUG
+#define SO_DEBUG        1
+#define SO_REUSEADDR    2
+#define SO_TYPE         3
+#define SO_ERROR        4
+#define SO_DONTROUTE    5
+#define SO_BROADCAST    6
+#define SO_SNDBUF       7
+#define SO_RCVBUF       8
+#define SO_KEEPALIVE    9
+#define SO_OOBINLINE    10
+#define SO_NO_CHECK     11
+#define SO_PRIORITY     12
+#define SO_LINGER       13
+#define SO_BSDCOMPAT    14
+#define SO_REUSEPORT    15
+#define SO_PASSCRED     16
+#define SO_PEERCRED     17
+#define SO_RCVLOWAT     18
+#define SO_SNDLOWAT     19
+#define SO_RCVTIMEO     20
+#define SO_SNDTIMEO     21
+#define SO_ACCEPTCONN   30
+#define SO_SNDBUFFORCE  32
+#define SO_RCVBUFFORCE  33
+#define SO_PROTOCOL     38
+#define SO_DOMAIN       39
+#endif
+
+#define SO_SECURITY_AUTHENTICATION              22
+#define SO_SECURITY_ENCRYPTION_TRANSPORT        23
+#define SO_SECURITY_ENCRYPTION_NETWORK          24
+
+#define SO_BINDTODEVICE 25
+
+#define SO_ATTACH_FILTER        26
+#define SO_DETACH_FILTER        27
+#define SO_GET_FILTER           SO_ATTACH_FILTER
+
+#define SO_PEERNAME             28
+#define SO_TIMESTAMP            29
+#define SCM_TIMESTAMP           SO_TIMESTAMP
+
+#define SO_PEERSEC              31
+#define SO_PASSSEC              34
+#define SO_TIMESTAMPNS          35
+#define SCM_TIMESTAMPNS         SO_TIMESTAMPNS
+#define SO_MARK                 36
+#define SO_TIMESTAMPING         37
+#define SCM_TIMESTAMPING        SO_TIMESTAMPING
+#define SO_RXQ_OVFL             40
+#define SO_WIFI_STATUS          41
+#define SCM_WIFI_STATUS         SO_WIFI_STATUS
+#define SO_PEEK_OFF             42
+#define SO_NOFCS                43
+#define SO_LOCK_FILTER          44
+#define SO_SELECT_ERR_QUEUE     45
+#define SO_BUSY_POLL            46
+#define SO_MAX_PACING_RATE      47
+#define SO_BPF_EXTENSIONS       48
+#define SO_INCOMING_CPU         49
+#define SO_ATTACH_BPF           50
+#define SO_DETACH_BPF           SO_DETACH_FILTER
+#define SO_ATTACH_REUSEPORT_CBPF 51
+#define SO_ATTACH_REUSEPORT_EBPF 52
+#define SO_CNX_ADVICE           53
+#define SCM_TIMESTAMPING_OPT_STATS 54
+#define SO_MEMINFO              55
+#define SO_INCOMING_NAPI_ID     56
+#define SO_COOKIE               57
+#define SCM_TIMESTAMPING_PKTINFO 58
+#define SO_PEERGROUPS           59
+
+#ifndef SOL_SOCKET
+#define SOL_SOCKET      1
+#endif
+
+#define SOL_IP          0
+#define SOL_IPV6        41
+#define SOL_ICMPV6      58
+
+#define SOL_RAW         255
+#define SOL_DECNET      261
+#define SOL_X25         262
+#define SOL_PACKET      263
+#define SOL_ATM         264
+#define SOL_AAL         265
+#define SOL_IRDA        266
+#define SOL_NETBEUI     267
+#define SOL_LLC         268
+#define SOL_DCCP        269
+#define SOL_NETLINK     270
+#define SOL_TIPC        271
+#define SOL_RXRPC       272
+#define SOL_PPPOL2TP    273
+#define SOL_BLUETOOTH   274
+#define SOL_PNPIPE      275
+#define SOL_RDS         276
+#define SOL_IUCV        277
+#define SOL_CAIF        278
+#define SOL_ALG         279
+#define SOL_NFC         280
+#define SOL_KCM         281
+
+#define SOMAXCONN       128
+
+#define MSG_OOB       0x0001
+#define MSG_PEEK      0x0002
+#define MSG_DONTROUTE 0x0004
+#define MSG_CTRUNC    0x0008
+#define MSG_PROXY     0x0010
+#define MSG_TRUNC     0x0020
+#define MSG_DONTWAIT  0x0040
+#define MSG_EOR       0x0080
+#define MSG_WAITALL   0x0100
+#define MSG_FIN       0x0200
+#define MSG_SYN       0x0400
+#define MSG_CONFIRM   0x0800
+#define MSG_RST       0x1000
+#define MSG_ERRQUEUE  0x2000
+#define MSG_NOSIGNAL  0x4000
+#define MSG_MORE      0x8000
+#define MSG_WAITFORONE 0x10000
+#define MSG_BATCH     0x40000
+#define MSG_FASTOPEN  0x20000000
+#define MSG_CMSG_CLOEXEC 0x40000000
+
+#define __CMSG_LEN(cmsg) (((cmsg)->cmsg_len + sizeof(long) - 1) & ~(long)(sizeof(long) - 1))
+#define __CMSG_NEXT(cmsg) ((unsigned char *)(cmsg) + __CMSG_LEN(cmsg))
+#define __MHDR_END(mhdr) ((unsigned char *)(mhdr)->msg_control + (mhdr)->msg_controllen)
+
+#define CMSG_DATA(cmsg) ((unsigned char *) (((struct cmsghdr *)(cmsg)) + 1))
+#define CMSG_NXTHDR(mhdr, cmsg) ((cmsg)->cmsg_len < sizeof (struct cmsghdr) || \
+       __CMSG_LEN(cmsg) + sizeof(struct cmsghdr) >= __MHDR_END(mhdr) - (unsigned char *)(cmsg) \
+       ? 0 : (struct cmsghdr *)__CMSG_NEXT(cmsg))
+#define CMSG_FIRSTHDR(mhdr) ((size_t) (mhdr)->msg_controllen >= sizeof (struct cmsghdr) ? (struct cmsghdr *) (mhdr)->msg_control : (struct cmsghdr *) 0)
+
+#define CMSG_ALIGN(len) (((len) + sizeof (size_t) - 1) & (size_t) ~(sizeof (size_t) - 1))
+#define CMSG_SPACE(len) (CMSG_ALIGN (len) + CMSG_ALIGN (sizeof (struct cmsghdr)))
+#define CMSG_LEN(len)   (CMSG_ALIGN (sizeof (struct cmsghdr)) + (len))
+
+#define SCM_RIGHTS      0x01
+#define SCM_CREDENTIALS 0x02
+
+struct sockaddr {
+       sa_family_t sa_family;
+       char sa_data[14];
+};
+
+struct sockaddr_storage {
+       sa_family_t ss_family;
+       char __ss_padding[128-sizeof(long)-sizeof(sa_family_t)];
+       unsigned long __ss_align;
+};
+
+int socket (int, int, int);
+int socketpair (int, int, int, int [2]);
+
+int shutdown (int, int);
+
+int bind (int, const struct sockaddr *, socklen_t);
+int connect (int, const struct sockaddr *, socklen_t);
+int listen (int, int);
+int accept (int, struct sockaddr *__restrict, socklen_t *__restrict);
+int accept4(int, struct sockaddr *__restrict, socklen_t *__restrict, int);
+
+int getsockname (int, struct sockaddr *__restrict, socklen_t *__restrict);
+int getpeername (int, struct sockaddr *__restrict, socklen_t *__restrict);
+
+ssize_t send (int, const void *, size_t, int);
+ssize_t recv (int, void *, size_t, int);
+ssize_t sendto (int, const void *, size_t, int, const struct sockaddr *, socklen_t);
+ssize_t recvfrom (int, void *__restrict, size_t, int, struct sockaddr *__restrict, socklen_t *__restrict);
+ssize_t sendmsg (int, const struct msghdr *, int);
+ssize_t recvmsg (int, struct msghdr *, int);
+
+int getsockopt (int, int, int, void *__restrict, socklen_t *__restrict);
+int setsockopt (int, int, int, const void *, socklen_t);
+
+int sockatmark (int);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* _SYS_SOCKET_H */
diff --git a/musl-imported/src/network/htonl.c b/musl-imported/src/network/htonl.c
new file mode 100644 (file)
index 0000000..6622d16
--- /dev/null
@@ -0,0 +1,8 @@
+#include <netinet/in.h>
+#include <byteswap.h>
+
+uint32_t htonl(uint32_t n)
+{
+       union { int i; char c; } u = { 1 };
+       return u.c ? bswap_32(n) : n;
+}
diff --git a/musl-imported/src/network/htons.c b/musl-imported/src/network/htons.c
new file mode 100644 (file)
index 0000000..03a3a1d
--- /dev/null
@@ -0,0 +1,8 @@
+#include <netinet/in.h>
+#include <byteswap.h>
+
+uint16_t htons(uint16_t n)
+{
+       union { int i; char c; } u = { 1 };
+       return u.c ? bswap_16(n) : n;
+}
diff --git a/musl-imported/src/network/ntohl.c b/musl-imported/src/network/ntohl.c
new file mode 100644 (file)
index 0000000..d6fce45
--- /dev/null
@@ -0,0 +1,8 @@
+#include <netinet/in.h>
+#include <byteswap.h>
+
+uint32_t ntohl(uint32_t n)
+{
+       union { int i; char c; } u = { 1 };
+       return u.c ? bswap_32(n) : n;
+}
diff --git a/musl-imported/src/network/ntohs.c b/musl-imported/src/network/ntohs.c
new file mode 100644 (file)
index 0000000..745cef4
--- /dev/null
@@ -0,0 +1,8 @@
+#include <netinet/in.h>
+#include <byteswap.h>
+
+uint16_t ntohs(uint16_t n)
+{
+       union { int i; char c; } u = { 1 };
+       return u.c ? bswap_16(n) : n;
+}
diff --git a/patches/0014-Fix-type-macro.patch b/patches/0014-Fix-type-macro.patch
new file mode 100644 (file)
index 0000000..6508f9e
--- /dev/null
@@ -0,0 +1,33 @@
+From 0d8754f5b70f413b8bd6eb0c9856b2174c6b9eca Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Eduard=20Vintil=C4=83?= <eduard.vintila47@gmail.com>
+Date: Wed, 7 Dec 2022 13:44:51 +0200
+Subject: [PATCH] Fix type macro
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Eduard Vintilă <eduard.vintila47@gmail.com>
+---
+ newlib/libc/include/sys/_types.h | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/newlib/libc/include/sys/_types.h b/newlib/libc/include/sys/_types.h
+index 72e1dc1..a0bf7ae 100644
+--- a/newlib/libc/include/sys/_types.h
++++ b/newlib/libc/include/sys/_types.h
+@@ -201,10 +201,12 @@ typedef  _TIMER_T_       __timer_t;
+ #ifndef __machine_sa_family_t_defined
+ typedef       __uint8_t       __sa_family_t;
++#define __machine_sa_family_t_defined
+ #endif
+ #ifndef __machine_socklen_t_defined
+ typedef       __uint32_t      __socklen_t;
++#define __machine_socklen_t_defined
+ #endif
+ typedef       unsigned short  __nlink_t;
+-- 
+2.38.1
+
diff --git a/patches/0015-Add-time.h.patch b/patches/0015-Add-time.h.patch
new file mode 100644 (file)
index 0000000..cfc7dd7
--- /dev/null
@@ -0,0 +1,28 @@
+From 508a48fb39041af878847f3a921c5a6b9d39d3c1 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Eduard=20Vintil=C4=83?= <eduard.vintila47@gmail.com>
+Date: Wed, 7 Dec 2022 13:58:04 +0200
+Subject: [PATCH] Add time.h
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Eduard Vintilă <eduard.vintila47@gmail.com>
+---
+ newlib/libc/include/sys/_pthreadtypes.h | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/newlib/libc/include/sys/_pthreadtypes.h b/newlib/libc/include/sys/_pthreadtypes.h
+index 75e9e1c..cd7bf60 100644
+--- a/newlib/libc/include/sys/_pthreadtypes.h
++++ b/newlib/libc/include/sys/_pthreadtypes.h
+@@ -21,6 +21,7 @@
+ #if defined(_POSIX_THREADS) || __POSIX_VISIBLE >= 199506
+ #include <sys/sched.h>
++#include <time.h>
+ /*
+  *  2.5 Primitive System Data Types,  P1003.1c/D10, p. 19.
+-- 
+2.38.1
+