int set_window_size(int fd, int window) { int send, receive; if (window <= 0) { DEBUG_MSG(LOG_NOTICE, "Getting window size of fd %d", fd); } else { DEBUG_MSG(LOG_NOTICE, "Setting window size of fd %d to %d", fd, window); } send = set_window_size_directed(fd, window, SO_SNDBUF); receive = set_window_size_directed(fd, window, SO_RCVBUF); return send < receive? send: receive; }
static int name2socket(struct _flow *flow, char *server_name, unsigned port, struct sockaddr **saptr, socklen_t *lenp, char do_connect, const int read_buffer_size_req, int *read_buffer_size, const int send_buffer_size_req, int *send_buffer_size) { int fd, n; struct addrinfo hints, *res, *ressave; struct sockaddr_in *tempv4; struct sockaddr_in6 *tempv6; char service[7]; bzero(&hints, sizeof(struct addrinfo)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; snprintf(service, sizeof(service), "%u", port); if ((n = getaddrinfo(server_name, service, &hints, &res)) != 0) { flow_error(flow, "getaddrinfo() failed: %s", gai_strerror(n)); return -1; } ressave = res; do { int rc; fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); if (fd < 0) continue; if (send_buffer_size) *send_buffer_size = set_window_size_directed(fd, send_buffer_size_req, SO_SNDBUF); if (read_buffer_size) *read_buffer_size = set_window_size_directed(fd, read_buffer_size_req, SO_RCVBUF); if (!do_connect) break; rc = connect(fd, res->ai_addr, res->ai_addrlen); if (rc == 0) { if (res->ai_family == PF_INET) { tempv4 = (struct sockaddr_in *) res->ai_addr; strncpy(server_name, inet_ntoa(tempv4->sin_addr), 256); server_name[255] = 0; } else if (res->ai_family == PF_INET6) { tempv6 = (struct sockaddr_in6 *) res->ai_addr; inet_ntop(AF_INET6, &tempv6->sin6_addr, server_name, 256); } break; } warn("failed to connect to '%s:%d' ", server_name, port); close(fd); } while ((res = res->ai_next) != NULL); if (res == NULL) { flow_error(flow, "Could not establish connection to " "\"%s:%d\": %s", server_name, port, strerror(errno)); freeaddrinfo(ressave); return -1; } if (saptr && lenp) { *saptr = malloc(res->ai_addrlen); if (*saptr == NULL) crit("malloc(): failed"); memcpy(*saptr, res->ai_addr, res->ai_addrlen); *lenp = res->ai_addrlen; } freeaddrinfo(ressave); return fd; }