X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fnet_socket.c;h=c03b17fbb1110f4593dce435891a2b1e9eac4053;hb=a8c5d9fc9f1274608bf9b3a2430f3f72f00ecbcc;hp=df1bbf13aca7cde7ae122549d48f7e7d5262abff;hpb=b67296418c51784d39a24c3041e2cb199bee06f2;p=meshlink diff --git a/src/net_socket.c b/src/net_socket.c index df1bbf13..c03b17fb 100644 --- a/src/net_socket.c +++ b/src/net_socket.c @@ -68,9 +68,9 @@ static void configure_tcp(connection_t *c) { setsockopt(c->socket, SOL_TCP, TCP_NODELAY, (void *)&nodelay, sizeof(nodelay)); #endif -#if defined(SOL_IP) && defined(IP_TOS) && defined(IPTOS_LOWDELAY) +#if defined(IP_TOS) && defined(IPTOS_LOWDELAY) int lowdelay = IPTOS_LOWDELAY; - setsockopt(c->socket, SOL_IP, IP_TOS, (void *)&lowdelay, sizeof(lowdelay)); + setsockopt(c->socket, IPPROTO_IP, IP_TOS, (void *)&lowdelay, sizeof(lowdelay)); #endif } @@ -130,12 +130,14 @@ int setup_listen_socket(const sockaddr_t *sa) { option = 1; setsockopt(nfd, SOL_SOCKET, SO_REUSEADDR, (void *)&option, sizeof(option)); -#if defined(SOL_IPV6) && defined(IPV6_V6ONLY) +#if defined(IPV6_V6ONLY) if(sa->sa.sa_family == AF_INET6) { - setsockopt(nfd, SOL_IPV6, IPV6_V6ONLY, (void *)&option, sizeof(option)); + setsockopt(nfd, IPPROTO_IPV6, IPV6_V6ONLY, (void *)&option, sizeof(option)); } +#else +#warning IPV6_V6ONLY not defined #endif if(bind(nfd, &sa->sa, SALEN(sa->sa))) { @@ -198,7 +200,7 @@ int setup_vpn_in_socket(meshlink_handle_t *mesh, const sockaddr_t *sa) { setsockopt(nfd, SOL_SOCKET, SO_REUSEADDR, (void *)&option, sizeof(option)); setsockopt(nfd, SOL_SOCKET, SO_BROADCAST, (void *)&option, sizeof(option)); -#if defined(IPPROTO_IPV6) && defined(IPV6_V6ONLY) +#if defined(IPV6_V6ONLY) if(sa->sa.sa_family == AF_INET6) { setsockopt(nfd, IPPROTO_IPV6, IPV6_V6ONLY, (void *)&option, sizeof(option)); @@ -210,14 +212,14 @@ int setup_vpn_in_socket(meshlink_handle_t *mesh, const sockaddr_t *sa) { #define IP_DONTFRAGMENT IP_DONTFRAG #endif -#if defined(SOL_IP) && defined(IP_MTU_DISCOVER) && defined(IP_PMTUDISC_DO) +#if defined(IP_MTU_DISCOVER) && defined(IP_PMTUDISC_DO) if(mesh->self->options & OPTION_PMTU_DISCOVERY) { option = IP_PMTUDISC_DO; - setsockopt(nfd, SOL_IP, IP_MTU_DISCOVER, (void *)&option, sizeof(option)); + setsockopt(nfd, IPPROTO_IP, IP_MTU_DISCOVER, (void *)&option, sizeof(option)); } -#elif defined(IPPROTO_IP) && defined(IP_DONTFRAGMENT) +#elif defined(IP_DONTFRAGMENT) if(mesh->self->options & OPTION_PMTU_DISCOVERY) { option = 1; @@ -228,14 +230,14 @@ int setup_vpn_in_socket(meshlink_handle_t *mesh, const sockaddr_t *sa) { #warning No way to disable IPv4 fragmentation #endif -#if defined(SOL_IPV6) && defined(IPV6_MTU_DISCOVER) && defined(IPV6_PMTUDISC_DO) +#if defined(IPV6_MTU_DISCOVER) && defined(IPV6_PMTUDISC_DO) if(mesh->self->options & OPTION_PMTU_DISCOVERY) { option = IPV6_PMTUDISC_DO; - setsockopt(nfd, SOL_IPV6, IPV6_MTU_DISCOVER, (void *)&option, sizeof(option)); + setsockopt(nfd, IPPROTO_IPV6, IPV6_MTU_DISCOVER, (void *)&option, sizeof(option)); } -#elif defined(IPPROTO_IPV6) && defined(IPV6_DONTFRAG) +#elif defined(IPV6_DONTFRAG) if(mesh->self->options & OPTION_PMTU_DISCOVERY) { option = 1; @@ -286,55 +288,6 @@ void finish_connecting(meshlink_handle_t *mesh, connection_t *c) { send_id(mesh, c); } -static void do_outgoing_pipe(meshlink_handle_t *mesh, connection_t *c, char *command) { -#ifndef HAVE_MINGW - int fd[2]; - - if(socketpair(AF_UNIX, SOCK_STREAM, 0, fd)) { - logger(mesh, MESHLINK_ERROR, "Could not create socketpair: %s", strerror(errno)); - return; - } - - if(fork()) { - c->socket = fd[0]; - close(fd[1]); - logger(mesh, MESHLINK_DEBUG, "Using proxy %s", command); - return; - } - - close(0); - close(1); - close(fd[0]); - dup2(fd[1], 0); - dup2(fd[1], 1); - close(fd[1]); - - // Other filedescriptors should be closed automatically by CLOEXEC - - char *host = NULL; - char *port = NULL; - - sockaddr2str(&c->address, &host, &port); - setenv("REMOTEADDRESS", host, true); - setenv("REMOTEPORT", port, true); - setenv("NODE", c->name, true); - setenv("NAME", mesh->self->name, true); - - int result = system(command); - - if(result < 0) { - logger(mesh, MESHLINK_ERROR, "Could not execute %s: %s", command, strerror(errno)); - } else if(result) { - logger(mesh, MESHLINK_ERROR, "%s exited with non-zero status %d", command, result); - } - - exit(result); -#else - logger(mesh, MESHLINK_ERROR, "Proxy type exec not supported on this platform!"); - return; -#endif -} - static void handle_meta_write(meshlink_handle_t *mesh, connection_t *c) { if(c->outbuf.len <= c->outbuf.offset) { return; @@ -503,8 +456,6 @@ begin: if(!mesh->proxytype) { c->socket = socket(c->address.sa.sa_family, SOCK_STREAM, IPPROTO_TCP); configure_tcp(c); - } else if(mesh->proxytype == PROXY_EXEC) { - do_outgoing_pipe(mesh, c, mesh->proxyhost); } else { proxyai = str2addrinfo(mesh->proxyhost, mesh->proxyport, SOCK_STREAM); @@ -532,25 +483,21 @@ begin: fcntl(c->socket, F_SETFD, FD_CLOEXEC); #endif - if(mesh->proxytype != PROXY_EXEC) { -#if defined(SOL_IPV6) && defined(IPV6_V6ONLY) - int option = 1; +#if defined(IPV6_V6ONLY) - if(c->address.sa.sa_family == AF_INET6) { - setsockopt(c->socket, SOL_IPV6, IPV6_V6ONLY, (void *)&option, sizeof(option)); - } + if(c->address.sa.sa_family == AF_INET6) { + static const int option = 1; + setsockopt(c->socket, IPPROTO_IPV6, IPV6_V6ONLY, (void *)&option, sizeof(option)); + } #endif - bind_to_address(mesh, c); - } + bind_to_address(mesh, c); /* Connect */ if(!mesh->proxytype) { result = connect(c->socket, &c->address.sa, SALEN(c->address.sa)); - } else if(mesh->proxytype == PROXY_EXEC) { - result = 0; } else { result = connect(c->socket, proxyai->ai_addr, proxyai->ai_addrlen); freeaddrinfo(proxyai);