mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-05-23 05:42:29 +00:00
Add libresolv from Musl Libc
Locally modified to get nameservers from Windows Registry when `\etc\resolv.conf` isn't defined.
This commit is contained in:
parent
8874a37abc
commit
1a96de6eda
36 changed files with 2313 additions and 73 deletions
|
@ -14,6 +14,7 @@ libc/isystem/arm_bf16.h \
|
|||
libc/isystem/arm_fp16.h \
|
||||
libc/isystem/arm_neon.h \
|
||||
libc/isystem/arpa/inet.h \
|
||||
libc/isystem/arpa/nameser.h \
|
||||
libc/isystem/array \
|
||||
libc/isystem/assert.h \
|
||||
libc/isystem/atomic \
|
||||
|
@ -98,6 +99,7 @@ libc/isystem/langinfo.h \
|
|||
libc/isystem/libgen.h \
|
||||
libc/isystem/limits \
|
||||
libc/isystem/limits.h \
|
||||
libc/isystem/link.h \
|
||||
libc/isystem/linux/futex.h \
|
||||
libc/isystem/linux/limits.h \
|
||||
libc/isystem/linux/param.h \
|
||||
|
@ -154,6 +156,7 @@ libc/isystem/random \
|
|||
libc/isystem/ratio \
|
||||
libc/isystem/regex \
|
||||
libc/isystem/regex.h \
|
||||
libc/isystem/resolv.h \
|
||||
libc/isystem/sched.h \
|
||||
libc/isystem/scoped_allocator \
|
||||
libc/isystem/search.h \
|
||||
|
|
|
@ -16,9 +16,11 @@
|
|||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/dns/dns.h"
|
||||
#include "libc/dns/ent.h"
|
||||
|
||||
/**
|
||||
* Error number global for gethostbyname*(), gethostbyaddr*(), etc.
|
||||
*/
|
||||
int h_errno;
|
||||
// error number global for gethostbyname*(), gethostbyaddr*(), etc.
|
||||
static _Thread_local int __h_errno;
|
||||
|
||||
errno_t *__h_errno_location(void) {
|
||||
return &__h_errno;
|
||||
}
|
|
@ -15,14 +15,12 @@ char *dlerror(void);
|
|||
void *dlopen(const char *, int);
|
||||
void *dlsym(void *, const char *);
|
||||
int dlclose(void *);
|
||||
int dl_iterate_phdr(int (*)(void *, size_t, void *), void *);
|
||||
|
||||
#ifdef _COSMO_SOURCE
|
||||
char *cosmo_dlerror(void);
|
||||
void *cosmo_dlopen(const char *, int);
|
||||
void *cosmo_dlsym(void *, const char *);
|
||||
int cosmo_dlclose(void *);
|
||||
int cosmo_dl_iterate_phdr(int (*)(void *, size_t, void *), void *);
|
||||
#endif
|
||||
|
||||
COSMOPOLITAN_C_END_
|
||||
|
|
|
@ -39,7 +39,9 @@ struct servent {
|
|||
char *s_proto; /* protocol to use */
|
||||
};
|
||||
|
||||
extern int h_errno;
|
||||
#define h_errno (*__h_errno_location())
|
||||
errno_t *__h_errno_location(void) dontthrow pureconst;
|
||||
|
||||
void herror(const char *);
|
||||
const char *hstrerror(int);
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
#define SYSDEBUG 0
|
||||
#endif
|
||||
|
||||
#define _NTTRACE 0 /* not configurable w/ flag yet */
|
||||
#define _NTTRACE 1 /* not configurable w/ flag yet */
|
||||
#define _POLLTRACE 0 /* not configurable w/ flag yet */
|
||||
#define _DATATRACE 1 /* not configurable w/ flag yet */
|
||||
#define _LOCKTRACE 0 /* not configurable w/ flag yet */
|
||||
|
|
|
@ -46,7 +46,7 @@ textwindows int WSARecv(
|
|||
// be NULL only if the lpOverlapped parameter is not NULL.
|
||||
unassert(!opt_out_lpNumberOfBytesRecvd);
|
||||
}
|
||||
#if defined(SYSDEBUG) && _NTTRACE
|
||||
#if SYSDEBUG && _NTTRACE
|
||||
uint32_t NumberOfBytesRecvd;
|
||||
if (opt_out_lpNumberOfBytesRecvd) {
|
||||
NumberOfBytesRecvd = *opt_out_lpNumberOfBytesRecvd;
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
#include "libc/intrin/kprintf.h"
|
||||
#include "libc/intrin/likely.h"
|
||||
#include "libc/intrin/strace.internal.h"
|
||||
#include "libc/nt/runtime.h"
|
||||
#include "libc/nt/thunk/msabi.h"
|
||||
#include "libc/nt/winsock.h"
|
||||
#include "libc/runtime/runtime.h"
|
||||
|
@ -39,7 +40,7 @@ textwindows int WSARecvFrom(
|
|||
struct NtOverlapped *opt_inout_lpOverlapped,
|
||||
const NtWsaOverlappedCompletionRoutine opt_lpCompletionRoutine) {
|
||||
int rc;
|
||||
#if defined(SYSDEBUG) && _NTTRACE
|
||||
#if SYSDEBUG && _NTTRACE
|
||||
uint32_t NumberOfBytesRecvd;
|
||||
if (opt_out_lpNumberOfBytesRecvd) {
|
||||
NumberOfBytesRecvd = *opt_out_lpNumberOfBytesRecvd;
|
||||
|
@ -55,10 +56,10 @@ textwindows int WSARecvFrom(
|
|||
kprintf(STRACE_PROLOGUE "WSARecvFrom(%lu, [", s);
|
||||
DescribeIovNt(inout_lpBuffers, dwBufferCount,
|
||||
rc != -1 ? NumberOfBytesRecvd : 0);
|
||||
kprintf("], %u, [%'u], %p, %p, %p, %s, %p) → %d% lm\n", dwBufferCount,
|
||||
kprintf("], %u, [%'u], %p, %p, %p, %s, %p) → %d %d\n", dwBufferCount,
|
||||
NumberOfBytesRecvd, opt_out_fromsockaddr, opt_inout_fromsockaddrlen,
|
||||
inout_lpFlags, DescribeNtOverlapped(opt_inout_lpOverlapped),
|
||||
opt_lpCompletionRoutine, rc);
|
||||
opt_lpCompletionRoutine, rc, GetLastError());
|
||||
}
|
||||
#else
|
||||
rc = __imp_WSARecvFrom(s, inout_lpBuffers, dwBufferCount,
|
||||
|
|
4
libc/isystem/arpa/nameser.h
Normal file
4
libc/isystem/arpa/nameser.h
Normal file
|
@ -0,0 +1,4 @@
|
|||
#ifndef _ARPA_NAMESER_H
|
||||
#define _ARPA_NAMESER_H
|
||||
#include "third_party/musl/nameser.h"
|
||||
#endif /* _ARPA_NAMESER_H */
|
|
@ -1,6 +1,7 @@
|
|||
#ifndef COSMOPOLITAN_LIBC_ISYSTEM_NETINET_IN_H_
|
||||
#define COSMOPOLITAN_LIBC_ISYSTEM_NETINET_IN_H_
|
||||
#include "libc/calls/weirdtypes.h"
|
||||
#include "libc/sock/in.h"
|
||||
#include "libc/sock/sock.h"
|
||||
#include "libc/sock/struct/in6_pktinfo.h"
|
||||
#include "libc/sock/struct/in_pktinfo.h"
|
||||
|
@ -17,46 +18,4 @@
|
|||
#include "libc/sysv/consts/mcast.h"
|
||||
#include "libc/sysv/consts/pf.h"
|
||||
#include "libc/sysv/consts/sock.h"
|
||||
|
||||
# define IN6_ARE_ADDR_EQUAL(a,b) \
|
||||
((((const uint32_t *) (a))[0] == ((const uint32_t *) (b))[0]) \
|
||||
&& (((const uint32_t *) (a))[1] == ((const uint32_t *) (b))[1]) \
|
||||
&& (((const uint32_t *) (a))[2] == ((const uint32_t *) (b))[2]) \
|
||||
&& (((const uint32_t *) (a))[3] == ((const uint32_t *) (b))[3]))
|
||||
|
||||
# define IN6_IS_ADDR_UNSPECIFIED(a) \
|
||||
(((const uint32_t *) (a))[0] == 0 \
|
||||
&& ((const uint32_t *) (a))[1] == 0 \
|
||||
&& ((const uint32_t *) (a))[2] == 0 \
|
||||
&& ((const uint32_t *) (a))[3] == 0)
|
||||
|
||||
# define IN6_IS_ADDR_LOOPBACK(a) \
|
||||
(((const uint32_t *) (a))[0] == 0 \
|
||||
&& ((const uint32_t *) (a))[1] == 0 \
|
||||
&& ((const uint32_t *) (a))[2] == 0 \
|
||||
&& ((const uint32_t *) (a))[3] == htonl (1))
|
||||
|
||||
# define IN6_IS_ADDR_LINKLOCAL(a) \
|
||||
((((const uint32_t *) (a))[0] & htonl (0xffc00000)) \
|
||||
== htonl (0xfe800000))
|
||||
|
||||
# define IN6_IS_ADDR_SITELOCAL(a) \
|
||||
((((const uint32_t *) (a))[0] & htonl (0xffc00000)) \
|
||||
== htonl (0xfec00000))
|
||||
|
||||
# define IN6_IS_ADDR_V4MAPPED(a) \
|
||||
((((const uint32_t *) (a))[0] == 0) \
|
||||
&& (((const uint32_t *) (a))[1] == 0) \
|
||||
&& (((const uint32_t *) (a))[2] == htonl (0xffff)))
|
||||
|
||||
# define IN6_IS_ADDR_V4COMPAT(a) \
|
||||
((((const uint32_t *) (a))[0] == 0) \
|
||||
&& (((const uint32_t *) (a))[1] == 0) \
|
||||
&& (((const uint32_t *) (a))[2] == 0) \
|
||||
&& (ntohl (((const uint32_t *) (a))[3]) > 1))
|
||||
|
||||
#define IN6_IS_ADDR_MULTICAST(a) (((const uint8_t *) (a))[0] == 0xff)
|
||||
|
||||
|
||||
|
||||
#endif /* COSMOPOLITAN_LIBC_ISYSTEM_NETINET_IN_H_ */
|
||||
|
|
5
libc/isystem/resolv.h
Normal file
5
libc/isystem/resolv.h
Normal file
|
@ -0,0 +1,5 @@
|
|||
#ifndef _RESOLV_H
|
||||
#define _RESOLV_H
|
||||
#include "third_party/musl/nameser.h"
|
||||
#include "third_party/musl/resolv.h"
|
||||
#endif /* _RESOLV_H */
|
71
libc/sock/in.h
Normal file
71
libc/sock/in.h
Normal file
|
@ -0,0 +1,71 @@
|
|||
#ifndef COSMOPOLITAN_LIBC_SOCK_IN_H_
|
||||
#define COSMOPOLITAN_LIBC_SOCK_IN_H_
|
||||
#include "libc/sock/sock.h"
|
||||
|
||||
#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 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))
|
||||
|
||||
#endif /* COSMOPOLITAN_LIBC_SOCK_IN_H_ */
|
|
@ -23,6 +23,7 @@
|
|||
#include "libc/nt/struct/iovec.h"
|
||||
#include "libc/nt/winsock.h"
|
||||
#include "libc/sock/internal.h"
|
||||
#include "libc/sock/struct/sockaddr.h"
|
||||
#include "libc/sock/syscall_fd.internal.h"
|
||||
#include "libc/sysv/consts/msg.h"
|
||||
#include "libc/sysv/consts/o.h"
|
||||
|
|
|
@ -23,6 +23,10 @@
|
|||
#include "libc/calls/struct/iovec.h"
|
||||
#include "libc/calls/struct/iovec.internal.h"
|
||||
#include "libc/dce.h"
|
||||
#include "libc/errno.h"
|
||||
#include "libc/intrin/kprintf.h"
|
||||
#include "libc/intrin/strace.internal.h"
|
||||
#include "libc/runtime/runtime.h"
|
||||
#include "libc/sock/sock.h"
|
||||
#include "libc/sock/struct/msghdr.h"
|
||||
#include "libc/sock/struct/msghdr.internal.h"
|
||||
|
@ -99,12 +103,12 @@ ssize_t recvmsg(int fd, struct msghdr *msg, int flags) {
|
|||
}
|
||||
END_CANCELATION_POINT;
|
||||
|
||||
#if defined(SYSDEBUG) && _DATATRACE
|
||||
#if SYSDEBUG && _DATATRACE
|
||||
if (__strace > 0 && strace_enabled(0) > 0) {
|
||||
if (!msg || (rc == -1 && errno == EFAULT)) {
|
||||
DATATRACE("recvmsg(%d, %p, %#x) → %'ld% m", fd, msg, flags, rc);
|
||||
} else {
|
||||
kprintf(STRACE_PROLOGUE "recvmsg(%d, [{");
|
||||
kprintf(STRACE_PROLOGUE "recvmsg(%d, [{", fd);
|
||||
if (msg->msg_namelen)
|
||||
kprintf(".name=%#.*hhs, ", msg->msg_namelen, msg->msg_name);
|
||||
if (msg->msg_controllen)
|
||||
|
|
|
@ -87,10 +87,10 @@ ssize_t sendmsg(int fd, const struct msghdr *msg, int flags) {
|
|||
}
|
||||
END_CANCELATION_POINT;
|
||||
|
||||
#if defined(SYSDEBUG) && _DATATRACE
|
||||
#if SYSDEBUG && _DATATRACE
|
||||
// TODO(jart): Write a DescribeMsg() function.
|
||||
if (strace_enabled(0) > 0) {
|
||||
kprintf(STRACE_PROLOGUE "sendmsg(");
|
||||
kprintf(STRACE_PROLOGUE "sendmsg(%d, ", fd);
|
||||
if ((!IsAsan() && kisdangerous(msg)) ||
|
||||
(IsAsan() && !__asan_is_valid(msg, sizeof(*msg)))) {
|
||||
kprintf("%p", msg);
|
||||
|
|
|
@ -16,16 +16,18 @@ struct ifreq {
|
|||
struct sockaddr ifru_netmask; /* SIOCGIFNETMASK */
|
||||
struct sockaddr ifru_broadaddr; /* SIOCGIFBRDADDR */
|
||||
short ifru_flags; /* SIOCGIFFLAGS */
|
||||
int ifru_ivalue; /* todo(jart) */
|
||||
char ifru_pad[24]; /* ifru_map is the largest, just pad */
|
||||
} ifr_ifru;
|
||||
};
|
||||
|
||||
#define ifr_name ifr_ifrn.ifrn_name /* interface name */
|
||||
#define ifr_addr ifr_ifru.ifru_addr /* address */
|
||||
#define ifr_netmask ifr_ifru.ifru_netmask /* netmask */
|
||||
#define ifr_name ifr_ifrn.ifrn_name /* interface name */
|
||||
#define ifr_addr ifr_ifru.ifru_addr /* address */
|
||||
#define ifr_netmask ifr_ifru.ifru_netmask /* netmask */
|
||||
#define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */
|
||||
#define ifr_dstaddr ifr_ifru.ifru_dstaddr /* destination address */
|
||||
#define ifr_flags ifr_ifru.ifru_flags /* flags */
|
||||
#define ifr_dstaddr ifr_ifru.ifru_dstaddr /* destination address */
|
||||
#define ifr_flags ifr_ifru.ifru_flags /* flags */
|
||||
#define ifr_ifindex ifr_ifru.ifru_ivalue
|
||||
|
||||
COSMOPOLITAN_C_END_
|
||||
#endif /* COSMOPOLITAN_LIBC_SOCK_STRUCT_IFREQ_H_ */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue