From d5225a693bbb6c916d84c0f3e88a9156707d461f Mon Sep 17 00:00:00 2001 From: Ivan Komarov Date: Mon, 5 Feb 2024 23:22:56 +0100 Subject: [PATCH] libc headers: make `` work, add `struct ipv6_mreq` (#1100) 1. `libc/isystem/complex.h` (included when you do `#include `) defines `_COMPLEX_H`, and then proceeds to include `libc/complex.h`, which contains the actual complex-related declarations. However, they are *also* guarded by `_COMPLEX_H` and hence effectively ignored. Fix this by changing `_COMPLEX_H` to `COSMOPOLITAN_LIBC_COMPLEX_H_`, which is consistent with what the other headers (such as `math.h`) do. 2. Cosmopolitan could only support IPv4 multicast requests for sockets, since a declaration for `struct ipv6_mreq` was missing. Add support for IPv6, too, by adding the missing declaration. --- libc/complex.h | 6 +++--- libc/isystem/netdb.h | 1 + libc/isystem/netinet/in.h | 1 + libc/sock/struct/ipv6_mreq.h | 12 ++++++++++++ 4 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 libc/sock/struct/ipv6_mreq.h diff --git a/libc/complex.h b/libc/complex.h index 119ceb329..0f761fcaa 100644 --- a/libc/complex.h +++ b/libc/complex.h @@ -1,5 +1,5 @@ -#ifndef _COMPLEX_H -#define _COMPLEX_H +#ifndef COSMOPOLITAN_LIBC_COMPLEX_H_ +#define COSMOPOLITAN_LIBC_COMPLEX_H_ COSMOPOLITAN_C_START_ #if __STDC_VERSION__ + 0 >= 201112 && !defined(__STDC_NO_COMPLEX__) @@ -116,4 +116,4 @@ complex long double cpowl(complex long double, complex long double) libcesque; #endif /* C11 */ COSMOPOLITAN_C_END_ -#endif /* _COMPLEX_H */ +#endif /* COSMOPOLITAN_LIBC_COMPLEX_H_ */ diff --git a/libc/isystem/netdb.h b/libc/isystem/netdb.h index e7cbd66b3..7c180b348 100644 --- a/libc/isystem/netdb.h +++ b/libc/isystem/netdb.h @@ -5,6 +5,7 @@ #include "libc/sock/struct/in6_pktinfo.h" #include "libc/sock/struct/in_pktinfo.h" #include "libc/sock/struct/ip_mreq.h" +#include "libc/sock/struct/ipv6_mreq.h" #include "libc/sock/struct/sockaddr.h" #include "libc/sock/struct/sockaddr6.h" #include "libc/sysv/consts/in.h" diff --git a/libc/isystem/netinet/in.h b/libc/isystem/netinet/in.h index 67eaac01b..541a86baa 100644 --- a/libc/isystem/netinet/in.h +++ b/libc/isystem/netinet/in.h @@ -6,6 +6,7 @@ #include "libc/sock/struct/in6_pktinfo.h" #include "libc/sock/struct/in_pktinfo.h" #include "libc/sock/struct/ip_mreq.h" +#include "libc/sock/struct/ipv6_mreq.h" #include "libc/sock/struct/sockaddr.h" #include "libc/sock/struct/sockaddr6.h" #include "libc/sysv/consts/in.h" diff --git a/libc/sock/struct/ipv6_mreq.h b/libc/sock/struct/ipv6_mreq.h new file mode 100644 index 000000000..4479c1b26 --- /dev/null +++ b/libc/sock/struct/ipv6_mreq.h @@ -0,0 +1,12 @@ +#ifndef COSMOPOLITAN_LIBC_SOCK_STRUCT_IPV6_MREQ_H_ +#define COSMOPOLITAN_LIBC_SOCK_STRUCT_IPV6_MREQ_H_ +#include "libc/sock/struct/sockaddr6.h" +COSMOPOLITAN_C_START_ + +struct ipv6_mreq { + struct in6_addr ipv6mr_multiaddr; /* IPv6 multicast address of group */ + unsigned ipv6mr_interface; /* local interface */ +}; + +COSMOPOLITAN_C_END_ +#endif /* COSMOPOLITAN_LIBC_SOCK_STRUCT_IPV6_MREQ_H_ */