- /* Server closed connection. */
- if (fds[1].revents & POLLERR || fds[1].revents & POLLHUP) {
- break;
- }
- }
-}
-
-/* Read available data from socket from and write it to socket to. At maximum
- * 4096 bytes are read/written. */
-static int read_from_write_to(int from, int to) {
- ssize_t size_read;
- ssize_t size_written;
- char buffer[4096];
-
- size_read = read(from, buffer, sizeof(buffer));
- if (0 > size_read) {
- perror("read()");
- return -1;
- }
- /* EOF */
- if (0 == size_read) {
- return -1;
- }
-
- size_written = write(to, buffer, (size_t)size_read);
- if (0 > size_written) {
- perror("write()");
- return -1;
- }
- if (size_read != size_written) {
- printf("only written %ld of %ld bytes!\n", size_read, size_written);
- return -1;
- }
-
- return 0;
-}
-
-
-static int connect_to_host(const char *hostname, const char *port) {
- struct addrinfo gai_hints;
- struct addrinfo *gai_result;
- int gai_return;
-
- int server_socket;
- struct addrinfo *server;
-
- if (NULL == hostname || NULL == port) {
- return -1;
- }
-
- /* Get IP of hostname server. */
- memset(&gai_hints, 0, sizeof(gai_hints));
- gai_hints.ai_family = AF_UNSPEC;
- gai_hints.ai_socktype = SOCK_STREAM;
- gai_hints.ai_protocol = 0;
- gai_hints.ai_flags = AI_NUMERICSERV /* given port is numeric */
- | AI_ADDRCONFIG /* supported by this computer */
- | AI_V4MAPPED; /* support IPv4 through IPv6 */
- gai_return = getaddrinfo(hostname, port, &gai_hints, &gai_result);
- if (0 != gai_return) {
- perror("getaddrinfo()");
- return -1;
- }
-
- /* Now try to connect to each server returned by getaddrinfo(), use the
- * first successful connect. */
- for (server = gai_result; NULL != server; server = server->ai_next) {
- server_socket = socket(server->ai_family,
- server->ai_socktype,
- server->ai_protocol);
- if (-1 == server_socket) {
- perror("socket(), trying next");
- continue;
- }
-
- if (-1 != connect(server_socket, server->ai_addr,
- server->ai_addrlen)) {
- break;
- }
- perror("connect(), trying next");
-
- close(server_socket);
- }
- /* Make sure we free the result from getaddrinfo(). */
- freeaddrinfo(gai_result);
-
- if (NULL == server) {
- fprintf(stderr, "no server found, aborting\n");
- return -1;
- }
-
- return server_socket;
-}