/* Connect socket to address 'addr' on given 'port'. Returns zero on * success or NE_SOCK_* on failure with sock->error set * appropriately. */ static int connect_socket(ne_socket *sock, int fd, const ne_inet_addr *addr, unsigned int port) { #ifdef USE_GETADDRINFO #ifdef AF_INET6 /* fill in the _family field for AIX 4.3, which forgets to do so. */ if (addr->ai_family == AF_INET6) { struct sockaddr_in6 in6; memcpy(&in6, addr->ai_addr, sizeof in6); in6.sin6_port = port; in6.sin6_family = AF_INET6; return timed_connect(sock, fd, (struct sockaddr *)&in6, sizeof in6); } else #endif if (addr->ai_family == AF_INET) { struct sockaddr_in in; memcpy(&in, addr->ai_addr, sizeof in); in.sin_port = port; in.sin_family = AF_INET; return timed_connect(sock, fd, (struct sockaddr *)&in, sizeof in); } else { set_strerror(sock, EINVAL); return NE_SOCK_ERROR; } #else struct sockaddr_in sa = {0}; sa.sin_family = AF_INET; sa.sin_port = port; sa.sin_addr = *addr; return timed_connect(sock, fd, (struct sockaddr *)&sa, sizeof sa); #endif }
static int start_chain(int *fd, proxy_data * pd, char *begin_mark) { struct sockaddr_in addr; char ip_buf[16]; *fd = socket(PF_INET, SOCK_STREAM, 0); if(*fd == -1) goto error; pc_stringfromipv4(&pd->ip.octet[0], ip_buf); proxychains_write_log(LOG_PREFIX "%s " TP " %s:%d ", begin_mark, ip_buf, htons(pd->port)); pd->ps = PLAY_STATE; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = (in_addr_t) pd->ip.as_int; addr.sin_port = pd->port; if(timed_connect(*fd, (struct sockaddr *) &addr, sizeof(addr))) { pd->ps = DOWN_STATE; goto error1; } pd->ps = BUSY_STATE; return SUCCESS; error1: proxychains_write_log(TP " timeout\n"); error: if(*fd != -1) close(*fd); return SOCKET_ERROR; }
static int start_chain(int *fd, proxy_data *pd, char* begin_mark) { struct sockaddr_in addr; *fd=socket(PF_INET,SOCK_STREAM,0); if(*fd==-1) goto error; proxychains_write_log("%s-<>-%s:%d-", begin_mark, inet_ntoa(*(struct in_addr*)&pd->ip), htons(pd->port)); pd->ps=PLAY_STATE; bzero(&addr,sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = pd->ip; addr.sin_port = pd->port; if (timed_connect (*fd ,(struct sockaddr*)&addr,sizeof(addr))) { pd->ps=DOWN_STATE; goto error1; } pd->ps=BUSY_STATE; return SUCCESS; error1: proxychains_write_log("<--timeout\n"); error: if(*fd!=-1) close(*fd); return SOCKET_ERROR; }
int connect_to_tcp(char *socket_name, int port, int timeout) { struct pollfd uwsgi_poll; struct sockaddr_in uws_addr; memset(&uws_addr, 0, sizeof(struct sockaddr_in)); uws_addr.sin_family = AF_INET; uws_addr.sin_port = htons(port); if (socket_name[0] == 0) { uws_addr.sin_addr.s_addr = INADDR_ANY; } else { uws_addr.sin_addr.s_addr = inet_addr(socket_name); } uwsgi_poll.fd = socket(AF_INET, SOCK_STREAM, 0); if (uwsgi_poll.fd < 0) { uwsgi_error("socket()"); return -1; } uwsgi_poll.events = POLLIN; if (timed_connect(&uwsgi_poll, (const struct sockaddr *) &uws_addr, sizeof(struct sockaddr_in), timeout)) { uwsgi_error("connect()"); close(uwsgi_poll.fd); return -1; } return uwsgi_poll.fd; }
static int start_chain(int *fd, proxy_data * pd, char *begin_mark) { *fd = socket(PF_INET, SOCK_STREAM, 0); if(*fd == -1) goto error; char ip_buf[16]; pc_stringfromipv4(&pd->ip.octet[0], ip_buf); proxychains_write_log(LOG_PREFIX "%s " TP " %s:%d ", begin_mark, ip_buf, htons(pd->port)); pd->ps = PLAY_STATE; struct sockaddr_in addr = { .sin_family = AF_INET, .sin_port = pd->port, .sin_addr.s_addr = (in_addr_t) pd->ip.as_int }; if(timed_connect(*fd, (struct sockaddr *) &addr, sizeof(addr))) { pd->ps = DOWN_STATE; goto error1; } pd->ps = BUSY_STATE; return SUCCESS; error1: proxychains_write_log(TP " timeout\n"); error: if(*fd != -1) close(*fd); return SOCKET_ERROR; } static proxy_data *select_proxy(select_type how, proxy_data * pd, unsigned int proxy_count, unsigned int *offset) { unsigned int i = 0, k = 0; if(*offset >= proxy_count) return NULL; switch (how) { case RANDOMLY: do { k++; i = 0 + (unsigned int) (proxy_count * 1.0 * rand() / (RAND_MAX + 1.0)); } while(pd[i].ps != PLAY_STATE && k < proxy_count * 100); break; case FIFOLY: for(i = *offset; i < proxy_count; i++) { if(pd[i].ps == PLAY_STATE) { *offset = i; break; } } default: break; } if(i >= proxy_count) i = 0; return (pd[i].ps == PLAY_STATE) ? &pd[i] : NULL; }
int inet_connect(const char *addr, int block_mode, int timeout) { char *buf; char *host; char *port; struct sockaddr_in sin; int sock; /* * Translate address information to internal form. No host defaults to * the local host. */ buf = inet_parse(addr, &host, &port); if (*host == 0) host = "localhost"; memset((char *) &sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = find_inet_addr(host); sin.sin_port = find_inet_port(port, "tcp"); myfree(buf); /* * Create a client socket. */ if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) msg_fatal("socket: %m"); /* * Timed connect. */ if (timeout > 0) { non_blocking(sock, NON_BLOCKING); if (timed_connect(sock, (struct sockaddr *) & sin, sizeof(sin), timeout) < 0) { close(sock); return (-1); } if (block_mode != NON_BLOCKING) non_blocking(sock, block_mode); return (sock); } /* * Maybe block until connected. */ else { non_blocking(sock, block_mode); if (sane_connect(sock, (struct sockaddr *) & sin, sizeof(sin)) < 0 && errno != EINPROGRESS) { close(sock); return (-1); } return (sock); } }
int unix_connect(const char *addr, int block_mode, int timeout) { #undef sun struct sockaddr_un sun; int len = strlen(addr); int sock; /* * Translate address information to internal form. */ if (len >= (int) sizeof(sun.sun_path)) msg_fatal("unix-domain name too long: %s", addr); memset((char *) &sun, 0, sizeof(sun)); sun.sun_family = AF_UNIX; #ifdef HAS_SUN_LEN sun.sun_len = len + 1; #endif memcpy(sun.sun_path, addr, len + 1); /* * Create a client socket. */ if ((sock = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) return (-1); /* * Timed connect. */ if (timeout > 0) { non_blocking(sock, NON_BLOCKING); if (timed_connect(sock, (struct sockaddr *) & sun, sizeof(sun), timeout) < 0) { close(sock); return (-1); } if (block_mode != NON_BLOCKING) non_blocking(sock, block_mode); return (sock); } /* * Maybe block until connected. */ else { non_blocking(sock, block_mode); if (sane_connect(sock, (struct sockaddr *) & sun, sizeof(sun)) < 0 && errno != EINPROGRESS) { close(sock); return (-1); } return (sock); } }
static SMTP_SESSION *smtp_connect_sock(int sock, struct sockaddr *sa, int salen, SMTP_ITERATOR *iter, DSN_BUF *why, int sess_flags) { int conn_stat; int saved_errno; VSTREAM *stream; time_t start_time; const char *name = STR(iter->host); const char *addr = STR(iter->addr); unsigned port = iter->port; start_time = time((time_t *) 0); if (var_smtp_conn_tmout > 0) { non_blocking(sock, NON_BLOCKING); conn_stat = timed_connect(sock, sa, salen, var_smtp_conn_tmout); saved_errno = errno; non_blocking(sock, BLOCKING); errno = saved_errno; } else { conn_stat = sane_connect(sock, sa, salen); } if (conn_stat < 0) { if (port) dsb_simple(why, "4.4.1", "connect to %s[%s]:%d: %m", name, addr, ntohs(port)); else dsb_simple(why, "4.4.1", "connect to %s[%s]: %m", name, addr); close(sock); return (0); } stream = vstream_fdopen(sock, O_RDWR); /* * Avoid poor performance when TCP MSS > VSTREAM_BUFSIZE. */ if (sa->sa_family == AF_INET #ifdef AF_INET6 || sa->sa_family == AF_INET6 #endif ) vstream_tweak_tcp(stream); /* * Bundle up what we have into a nice SMTP_SESSION object. */ return (smtp_session_alloc(stream, iter, start_time, sess_flags)); }
int connect_to_unix(char *socket_name, int timeout, int async) { struct pollfd uwsgi_poll; struct sockaddr_un uws_addr; socklen_t un_size = sizeof(struct sockaddr_un); memset(&uws_addr, 0, sizeof(struct sockaddr_un)); uws_addr.sun_family = AF_UNIX; if (socket_name[0] == '@') { un_size = sizeof(uws_addr.sun_family) + strlen(socket_name) + 1; memcpy(uws_addr.sun_path + 1, socket_name + 1, UMIN(strlen(socket_name + 1), 101)); } else if (strlen(socket_name) > 1 && socket_name[0] == '\\' && socket_name[1] == '0') { un_size = sizeof(uws_addr.sun_family) + strlen(socket_name + 1) + 1; memcpy(uws_addr.sun_path + 1, socket_name + 2, UMIN(strlen(socket_name + 2), 101)); } else { memcpy(uws_addr.sun_path, socket_name, UMIN(strlen(socket_name), 102)); } #if defined(__linux__) && defined(SOCK_NONBLOCK) && !defined(OBSOLETE_LINUX_KERNEL) uwsgi_poll.fd = socket(AF_UNIX, SOCK_STREAM | SOCK_NONBLOCK, 0); #else uwsgi_poll.fd = socket(AF_UNIX, SOCK_STREAM, 0); #endif if (uwsgi_poll.fd < 0) { uwsgi_error("socket()"); return -1; } uwsgi_poll.events = POLLIN; if (timed_connect(&uwsgi_poll, (const struct sockaddr *) &uws_addr, un_size, timeout, async)) { // avoid error storm //uwsgi_error("connect()"); close(uwsgi_poll.fd); return -1; } return uwsgi_poll.fd; }
int connect_to_tcp(char *socket_name, int port, int timeout, int async) { struct pollfd uwsgi_poll; struct sockaddr_in uws_addr; memset(&uws_addr, 0, sizeof(struct sockaddr_in)); uws_addr.sin_family = AF_INET; uws_addr.sin_port = htons(port); if (socket_name[0] == 0) { uws_addr.sin_addr.s_addr = INADDR_ANY; } else { uws_addr.sin_addr.s_addr = inet_addr(socket_name); } socket_name[strlen(socket_name)] = ':'; #if defined(__linux__) && defined(SOCK_NONBLOCK) && !defined(OBSOLETE_LINUX_KERNEL) uwsgi_poll.fd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0); #else uwsgi_poll.fd = socket(AF_INET, SOCK_STREAM, 0); #endif if (uwsgi_poll.fd < 0) { uwsgi_error("socket()"); return -1; } uwsgi_poll.events = POLLIN; if (timed_connect(&uwsgi_poll, (const struct sockaddr *) &uws_addr, sizeof(struct sockaddr_in), timeout, async)) { //uwsgi_error("connect()"); close(uwsgi_poll.fd); return -1; } return uwsgi_poll.fd; }
Socket *SocketClient::connectToServer( HostAddress *inAddress, long inTimeoutInMilliseconds, char *outTimedOut ) { if( !Socket::isFrameworkInitialized() ) { // try to init the framework int error = Socket::initSocketFramework(); if( error == -1 ) { printf( "initializing network socket framework failed\n" ); return NULL; } } int socketID = socket( AF_INET, SOCK_STREAM, 0 ); if( socketID == INVALID_SOCKET ) { printf( "Creating socket failed.\n" ); return NULL; } union sock { struct sockaddr s; struct sockaddr_in i; } sock; //struct in_addr internet_address; //struct hostent *hp; struct in_addr *internet_address = nameToAddress( inAddress->mAddressString ); if( internet_address == NULL ) { printf( "Host name lookup failed: " ); inAddress->print(); printf( "\n" ); closesocket( socketID ); return NULL; } //hp = gethostbyname( inAddress->mAddressString ); //memcpy( &internet_address, *( hp->h_addr_list ), sizeof( struct in_addr ) ); sock.i.sin_family = AF_INET; sock.i.sin_port = htons( inAddress->mPort ); sock.i.sin_addr = *internet_address; int error; if( inTimeoutInMilliseconds != -1 ) { // use timeout error = timed_connect( socketID, &sock.s, sizeof( struct sockaddr ), inTimeoutInMilliseconds ); if( error == -2 ) { *outTimedOut = true; error = -1; } else { *outTimedOut = false; } } else { // don't use timeout error = connect( socketID, &sock.s, sizeof( struct sockaddr ) ); } delete internet_address; if( error == -1 ) { //printf( "Connecting to host failed: " ); //inAddress->print(); //printf( "\n" ); closesocket( socketID ); return NULL; } // packate into a Socket and return it Socket *returnSocket = new Socket(); int *idSpace = new int[1]; idSpace[0] = socketID; returnSocket->mNativeObjectPointer = (void *)idSpace; return returnSocket; }
KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_sendto (krb5_context context, const krb5_data *send_data, krb5_krbhst_handle handle, krb5_data *receive) { krb5_error_code ret; krb5_socket_t fd; size_t i; krb5_data_zero(receive); for (i = 0; i < context->max_retries; ++i) { krb5_krbhst_info *hi; while (krb5_krbhst_next(context, handle, &hi) == 0) { struct addrinfo *ai, *a; _krb5_debug(context, 2, "trying to communicate with host %s in realm %s", hi->hostname, _krb5_krbhst_get_realm(handle)); if (context->send_to_kdc) { struct send_to_kdc *s = context->send_to_kdc; ret = (*s->func)(context, s->data, hi, context->kdc_timeout, send_data, receive); if (ret == 0 && receive->length != 0) goto out; continue; } ret = send_via_plugin(context, hi, context->kdc_timeout, send_data, receive); if (ret == 0 && receive->length != 0) goto out; else if (ret != KRB5_PLUGIN_NO_HANDLE) continue; if(hi->proto == KRB5_KRBHST_HTTP && context->http_proxy) { if (send_via_proxy (context, hi, send_data, receive) == 0) { ret = 0; goto out; } continue; } ret = krb5_krbhst_get_addrinfo(context, hi, &ai); if (ret) continue; for (a = ai; a != NULL; a = a->ai_next) { fd = socket (a->ai_family, a->ai_socktype | SOCK_CLOEXEC, a->ai_protocol); if (rk_IS_BAD_SOCKET(fd)) continue; rk_cloexec(fd); if (timed_connect (fd, a, context->kdc_timeout) < 0) { rk_closesocket (fd); continue; } switch (hi->proto) { case KRB5_KRBHST_HTTP : ret = send_and_recv_http(fd, context->kdc_timeout, "", send_data, receive); break; case KRB5_KRBHST_TCP : ret = send_and_recv_tcp (fd, context->kdc_timeout, send_data, receive); break; case KRB5_KRBHST_UDP : ret = send_and_recv_udp (fd, context->kdc_timeout, send_data, receive); break; } rk_closesocket (fd); if(ret == 0 && receive->length != 0) goto out; } } krb5_krbhst_reset(context, handle); } krb5_clear_error_message (context); ret = KRB5_KDC_UNREACH; out: _krb5_debug(context, 2, "result of trying to talk to realm %s = %d", _krb5_krbhst_get_realm(handle), ret); return ret; }
static int send_via_proxy (krb5_context context, const krb5_krbhst_info *hi, const krb5_data *send_data, krb5_data *receive) { char *proxy2 = strdup(context->http_proxy); char *proxy = proxy2; char *prefix = NULL; char *colon; struct addrinfo hints; struct addrinfo *ai, *a; int ret; krb5_socket_t s = rk_INVALID_SOCKET; char portstr[NI_MAXSERV]; if (proxy == NULL) return ENOMEM; if (strncmp (proxy, "http://", 7) == 0) proxy += 7; colon = strchr(proxy, ':'); if(colon != NULL) *colon++ = '\0'; memset (&hints, 0, sizeof(hints)); hints.ai_family = PF_UNSPEC; hints.ai_socktype = SOCK_STREAM; snprintf (portstr, sizeof(portstr), "%d", ntohs(init_port (colon, htons(80)))); ret = getaddrinfo (proxy, portstr, &hints, &ai); free (proxy2); if (ret) return krb5_eai_to_heim_errno(ret, errno); for (a = ai; a != NULL; a = a->ai_next) { s = socket (a->ai_family, a->ai_socktype | SOCK_CLOEXEC, a->ai_protocol); if (s < 0) continue; rk_cloexec(s); if (timed_connect (s, a, context->kdc_timeout) < 0) { rk_closesocket (s); continue; } break; } if (a == NULL) { freeaddrinfo (ai); return 1; } freeaddrinfo (ai); ret = asprintf(&prefix, "http://%s/", hi->hostname); if(ret < 0 || prefix == NULL) { close(s); return 1; } ret = send_and_recv_http(s, context->kdc_timeout, prefix, send_data, receive); rk_closesocket (s); free(prefix); if(ret == 0 && receive->length != 0) return 0; return 1; }