void create_socket(int family, int type, char *server, char *port) { struct addrinfo hints = { .ai_flags = AI_NUMERICSERV, .ai_family = family, .ai_socktype = type, }; struct addrinfo *records; struct addrinfo *r; int error; log_print(INFO, "Connecting to %s port %s via %s", server, port, interface); error = getaddrinfo(server, port, &hints, &records); if (error) { log_print(FATAL, "Getaddrinfo() %s", (error == EAI_SYSTEM) ? strerror(errno) : gai_strerror(error)); exit(NETWORK_ERROR); } for (r = records; r; r = r->ai_next) { int s = socket(r->ai_family, r->ai_socktype, r->ai_protocol); if (!setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE, interface, strlen(interface)) && !connect(s, r->ai_addr, r->ai_addrlen)) { the_socket = s; break; } close(s); } freeaddrinfo(records); if (the_socket == -1) { log_print(FATAL, "Connect() %s", strerror(errno)); exit(NETWORK_ERROR); } #ifdef ANDROID_CHANGES protectFromVpn(the_socket); #endif fcntl(the_socket, F_SETFD, FD_CLOEXEC); log_print(INFO, "Connection established (socket = %d)", the_socket); }
static jboolean android_net_utils_protectFromVpn(JNIEnv *env, jobject thiz, jint socket) { return (jboolean) !protectFromVpn(socket); }