diff options
Diffstat (limited to 'src/sock.c')
-rw-r--r-- | src/sock.c | 320 |
1 files changed, 167 insertions, 153 deletions
@@ -39,34 +39,36 @@ * to indicate an error. */ static int -bind_socket(int sockfd, const char *addr) +bind_socket (int sockfd, const char *addr) { - struct addrinfo hints, *res, *ressave; + struct addrinfo hints, *res, *ressave; - assert(sockfd >= 0); - assert(addr != NULL && strlen(addr) != 0); + assert (sockfd >= 0); + assert (addr != NULL && strlen (addr) != 0); - memset(&hints, 0, sizeof(struct addrinfo)); - hints.ai_family = AF_UNSPEC; - hints.ai_socktype = SOCK_STREAM; + memset (&hints, 0, sizeof (struct addrinfo)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; - /* The local port it not important */ - if (getaddrinfo(addr, NULL, &hints, &res) != 0) - return -1; + /* The local port it not important */ + if (getaddrinfo (addr, NULL, &hints, &res) != 0) + return -1; - ressave = res; + ressave = res; - /* Loop through the addresses and try to bind to each */ - do { - if (bind(sockfd, res->ai_addr, res->ai_addrlen) == 0) - break; /* success */ - } while ((res = res->ai_next) != NULL); + /* Loop through the addresses and try to bind to each */ + do + { + if (bind (sockfd, res->ai_addr, res->ai_addrlen) == 0) + break; /* success */ + } + while ((res = res->ai_next) != NULL); - freeaddrinfo(ressave); - if (res == NULL) /* was not able to bind to any address */ - return -1; + freeaddrinfo (ressave); + if (res == NULL) /* was not able to bind to any address */ + return -1; - return sockfd; + return sockfd; } /* @@ -75,91 +77,97 @@ bind_socket(int sockfd, const char *addr) * independent implementation (mostly for IPv4 and IPv6 addresses.) */ int -opensock(const char *host, int port, const char *bind_to) +opensock (const char *host, int port, const char *bind_to) { - int sockfd, n; - struct addrinfo hints, *res, *ressave; - char portstr[6]; - - assert(host != NULL); - assert(port > 0); - - memset(&hints, 0, sizeof(struct addrinfo)); - hints.ai_family = AF_UNSPEC; - hints.ai_socktype = SOCK_STREAM; - - snprintf(portstr, sizeof(portstr), "%d", port); - - n = getaddrinfo(host, portstr, &hints, &res); - if (n != 0) { - log_message(LOG_ERR, "opensock: Could not retrieve info for %s", - host); - return -1; - } - - ressave = res; - do { - sockfd = - socket(res->ai_family, res->ai_socktype, res->ai_protocol); - if (sockfd < 0) - continue; /* ignore this one */ - - /* Bind to the specified address */ - if (bind_to) { - if (bind_socket(sockfd, bind_to) < 0) { - close(sockfd); - continue; /* can't bind, so try again */ - } - } else if (config.bind_address) { - if (bind_socket(sockfd, config.bind_address) < 0) { - close(sockfd); - continue; /* can't bind, so try again */ - } - } - - if (connect(sockfd, res->ai_addr, res->ai_addrlen) == 0) - break; /* success */ - - close(sockfd); - } while ((res = res->ai_next) != NULL); - - freeaddrinfo(ressave); - if (res == NULL) { - log_message(LOG_ERR, - "opensock: Could not establish a connection to %s", - host); - return -1; - } - - return sockfd; + int sockfd, n; + struct addrinfo hints, *res, *ressave; + char portstr[6]; + + assert (host != NULL); + assert (port > 0); + + memset (&hints, 0, sizeof (struct addrinfo)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + + snprintf (portstr, sizeof (portstr), "%d", port); + + n = getaddrinfo (host, portstr, &hints, &res); + if (n != 0) + { + log_message (LOG_ERR, "opensock: Could not retrieve info for %s", host); + return -1; + } + + ressave = res; + do + { + sockfd = socket (res->ai_family, res->ai_socktype, res->ai_protocol); + if (sockfd < 0) + continue; /* ignore this one */ + + /* Bind to the specified address */ + if (bind_to) + { + if (bind_socket (sockfd, bind_to) < 0) + { + close (sockfd); + continue; /* can't bind, so try again */ + } + } + else if (config.bind_address) + { + if (bind_socket (sockfd, config.bind_address) < 0) + { + close (sockfd); + continue; /* can't bind, so try again */ + } + } + + if (connect (sockfd, res->ai_addr, res->ai_addrlen) == 0) + break; /* success */ + + close (sockfd); + } + while ((res = res->ai_next) != NULL); + + freeaddrinfo (ressave); + if (res == NULL) + { + log_message (LOG_ERR, + "opensock: Could not establish a connection to %s", host); + return -1; + } + + return sockfd; } /* * Set the socket to non blocking -rjkaes */ int -socket_nonblocking(int sock) +socket_nonblocking (int sock) { - int flags; + int flags; - assert(sock >= 0); + assert (sock >= 0); - flags = fcntl(sock, F_GETFL, 0); - return fcntl(sock, F_SETFL, flags | O_NONBLOCK); + flags = fcntl (sock, F_GETFL, 0); + return fcntl (sock, F_SETFL, flags | O_NONBLOCK); } /* * Set the socket to blocking -rjkaes */ int -socket_blocking(int sock) +socket_blocking (int sock) { - int flags; + int flags; - assert(sock >= 0); + assert (sock >= 0); - flags = fcntl(sock, F_GETFL, 0); - return fcntl(sock, F_SETFL, flags & ~O_NONBLOCK); + flags = fcntl (sock, F_GETFL, 0); + return fcntl (sock, F_SETFL, flags & ~O_NONBLOCK); } /* @@ -169,95 +177,101 @@ socket_blocking(int sock) * - rjkaes */ int -listen_sock(uint16_t port, socklen_t * addrlen) +listen_sock (uint16_t port, socklen_t * addrlen) { - int listenfd; - const int on = 1; - struct sockaddr_in addr; - - assert(port > 0); - assert(addrlen != NULL); - - listenfd = socket(AF_INET, SOCK_STREAM, 0); - setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); - - memset(&addr, 0, sizeof(addr)); - addr.sin_family = AF_INET; - addr.sin_port = htons(port); - - if (config.ipAddr) { - addr.sin_addr.s_addr = inet_addr(config.ipAddr); - } else { - addr.sin_addr.s_addr = inet_addr("0.0.0.0"); - } - - if (bind(listenfd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { - log_message(LOG_ERR, - "Unable to bind listening socket because of %s", - strerror(errno)); - return -1; - } - - if (listen(listenfd, MAXLISTEN) < 0) { - log_message(LOG_ERR, - "Unable to start listening socket because of %s", - strerror(errno)); - return -1; - } - - *addrlen = sizeof(addr); - - return listenfd; + int listenfd; + const int on = 1; + struct sockaddr_in addr; + + assert (port > 0); + assert (addrlen != NULL); + + listenfd = socket (AF_INET, SOCK_STREAM, 0); + setsockopt (listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof (on)); + + memset (&addr, 0, sizeof (addr)); + addr.sin_family = AF_INET; + addr.sin_port = htons (port); + + if (config.ipAddr) + { + addr.sin_addr.s_addr = inet_addr (config.ipAddr); + } + else + { + addr.sin_addr.s_addr = inet_addr ("0.0.0.0"); + } + + if (bind (listenfd, (struct sockaddr *) &addr, sizeof (addr)) < 0) + { + log_message (LOG_ERR, + "Unable to bind listening socket because of %s", + strerror (errno)); + return -1; + } + + if (listen (listenfd, MAXLISTEN) < 0) + { + log_message (LOG_ERR, + "Unable to start listening socket because of %s", + strerror (errno)); + return -1; + } + + *addrlen = sizeof (addr); + + return listenfd; } /* * Takes a socket descriptor and returns the socket's IP address. */ int -getsock_ip(int fd, char *ipaddr) +getsock_ip (int fd, char *ipaddr) { - struct sockaddr_storage name; - socklen_t namelen = sizeof(name); + struct sockaddr_storage name; + socklen_t namelen = sizeof (name); - assert(fd >= 0); + assert (fd >= 0); - if (getsockname(fd, (struct sockaddr *)&name, &namelen) != 0) { - log_message(LOG_ERR, "getsock_ip: getsockname() error: %s", - strerror(errno)); - return -1; - } + if (getsockname (fd, (struct sockaddr *) &name, &namelen) != 0) + { + log_message (LOG_ERR, "getsock_ip: getsockname() error: %s", + strerror (errno)); + return -1; + } - if (get_ip_string((struct sockaddr *)&name, ipaddr, IP_LENGTH) == NULL) - return -1; + if (get_ip_string ((struct sockaddr *) &name, ipaddr, IP_LENGTH) == NULL) + return -1; - return 0; + return 0; } /* * Return the peer's socket information. */ int -getpeer_information(int fd, char *ipaddr, char *string_addr) +getpeer_information (int fd, char *ipaddr, char *string_addr) { - struct sockaddr_storage sa; - socklen_t salen = sizeof sa; + struct sockaddr_storage sa; + socklen_t salen = sizeof sa; - assert(fd >= 0); - assert(ipaddr != NULL); - assert(string_addr != NULL); + assert (fd >= 0); + assert (ipaddr != NULL); + assert (string_addr != NULL); - /* Set the strings to default values */ - ipaddr[0] = '\0'; - strlcpy(string_addr, "[unknown]", HOSTNAME_LENGTH); + /* Set the strings to default values */ + ipaddr[0] = '\0'; + strlcpy (string_addr, "[unknown]", HOSTNAME_LENGTH); - /* Look up the IP address */ - if (getpeername(fd, (struct sockaddr *) &sa, &salen) != 0) - return -1; + /* Look up the IP address */ + if (getpeername (fd, (struct sockaddr *) &sa, &salen) != 0) + return -1; - if (get_ip_string((struct sockaddr *)&sa, ipaddr, IP_LENGTH) == NULL) - return -1; + if (get_ip_string ((struct sockaddr *) &sa, ipaddr, IP_LENGTH) == NULL) + return -1; - /* Get the full host name */ - return getnameinfo((struct sockaddr *)&sa, salen, - string_addr, HOSTNAME_LENGTH, NULL, 0, 0); + /* Get the full host name */ + return getnameinfo ((struct sockaddr *) &sa, salen, + string_addr, HOSTNAME_LENGTH, NULL, 0, 0); } |