proxy.c revision 5f53595a0c2e10e26dfc3e39c2d3f25b90d996f7
f78b12e570284aa8291f4ca1add24937fd107403vboxsync/* -*- indent-tabs-mode: nil; -*- */
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#if defined(SOCK_NONBLOCK) && defined(RT_OS_NETBSD) /* XXX: PR kern/47569 */
f78b12e570284aa8291f4ca1add24937fd107403vboxsync# define __arraycount(a) (sizeof(a)/sizeof(a[0]))
f78b12e570284aa8291f4ca1add24937fd107403vboxsync/* XXX: for mapping loopbacks to addresses in our network (ip4) */
f78b12e570284aa8291f4ca1add24937fd107403vboxsync * Called on the lwip thread (aka tcpip thread) from tcpip_init() via
f78b12e570284aa8291f4ca1add24937fd107403vboxsync * its "tcpip_init_done" callback. Raw API is ok to use here
f78b12e570284aa8291f4ca1add24937fd107403vboxsync * (e.g. rtadvd), but netconn API is not.
f78b12e570284aa8291f4ca1add24937fd107403vboxsyncproxy_init(struct netif *proxy_netif, struct proxy_options *opts)
f78b12e570284aa8291f4ca1add24937fd107403vboxsync status = RTStrFormatTypeRegister("sockerr", proxy_sockerr_rtstrfmt, NULL);
f78b12e570284aa8291f4ca1add24937fd107403vboxsync * XXX: We use stateless DHCPv6 only to report IPv6 address(es) of
f78b12e570284aa8291f4ca1add24937fd107403vboxsync * nameserver(s). Since we don't yet support IPv6 addresses in
f78b12e570284aa8291f4ca1add24937fd107403vboxsync * HostDnsService, there's no point in running DHCPv6.
f78b12e570284aa8291f4ca1add24937fd107403vboxsync errx(EXIT_FAILURE, "failed to initialize poll manager");
f78b12e570284aa8291f4ca1add24937fd107403vboxsync /* NOTREACHED */
if (!pollmgr_tid) {
#if !defined(RT_OS_WINDOWS)
void *pvUser)
void *pvUser)
* FormatMessage() for an error from <WinError.h> that has the
int status;
if (status == 0) {
NULL);
return cb;
struct tcpip_callback_msg *m;
static SOCKET
SOCKET s;
int stype_and_flags;
int status;
#if defined(SOCK_NONBLOCK)
#if defined(SOCK_NOSIGPIPE)
if (s == INVALID_SOCKET) {
return INVALID_SOCKET;
int sflags;
if (sflags < 0) {
closesocket(s);
return INVALID_SOCKET;
if (status < 0) {
closesocket(s);
return INVALID_SOCKET;
if (status < 0) {
closesocket(s);
return INVALID_SOCKET;
#if defined(RT_OS_WINDOWS)
closesocket(s);
return INVALID_SOCKET;
void *pdst_addr;
int status;
SOCKET s;
#if HAVE_SA_LEN
#if HAVE_SA_LEN
if (s == INVALID_SOCKET) {
return INVALID_SOCKET;
closesocket(s);
return INVALID_SOCKET;
closesocket(s);
return INVALID_SOCKET;
SOCKET s;
int on;
int status;
if (s == INVALID_SOCKET) {
return INVALID_SOCKET;
sizeof(struct sockaddr_in)
: sizeof(struct sockaddr_in6));
if (status < 0) {
closesocket(s);
return INVALID_SOCKET;
if (status < 0) {
closesocket(s);
return INVALID_SOCKET;
closesocket(s);
struct pbuf *q;
#ifndef RT_OS_WINDOWS
int rc;
int error = 0;
goto out;
#ifndef RT_OS_WINDOWS
if (nsent < 0) {
out:
return error;
static const char *lwiperr[] = {
int e = -error;
return lwiperr[e];
return buf;