summaryrefslogtreecommitdiff
path: root/src/daemon/dlt_daemon_socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/daemon/dlt_daemon_socket.c')
-rw-r--r--src/daemon/dlt_daemon_socket.c92
1 files changed, 43 insertions, 49 deletions
diff --git a/src/daemon/dlt_daemon_socket.c b/src/daemon/dlt_daemon_socket.c
index 2e4f9ea..6dfc264 100644
--- a/src/daemon/dlt_daemon_socket.c
+++ b/src/daemon/dlt_daemon_socket.c
@@ -57,72 +57,66 @@
#include "dlt_daemon_socket.h"
-int dlt_daemon_socket_open(int *sock, unsigned int servPort, char *ip)
+int dlt_daemon_socket_open(int *sock, unsigned int servPort)
{
int yes = 1;
- int ret_inet_pton = 0;
+ char portnumbuffer[33];
+ struct addrinfo hints, *servinfo, *p;
+ int rv;
+ memset(&hints, 0, sizeof hints);
#ifdef DLT_USE_IPv6
+ hints.ai_family = AF_INET6; /* force IPv6 - will still work with IPv4 */
+#else
+ hints.ai_family = AF_INET;
+#endif
+ hints.ai_socktype = SOCK_STREAM;
+ hints.ai_flags = AI_PASSIVE; /* use my IP address */
- /* create socket */
- if ((*sock = socket(AF_INET6, SOCK_STREAM, 0)) == -1) {
- const int lastErrno = errno;
- dlt_vlog(LOG_WARNING, "dlt_daemon_socket_open: socket() error %d: %s\n", lastErrno, strerror(lastErrno));
+ snprintf(portnumbuffer, 32, "%d", servPort);
+
+ if ((rv = getaddrinfo(NULL, portnumbuffer, &hints, &servinfo)) != 0) {
+ dlt_vlog(LOG_WARNING, "getaddrinfo error %d: %s\n", rv, gai_strerror(rv));
+ return -1;
}
-#else
+ for (p = servinfo; p != NULL; p = p->ai_next) {
+ if ((*sock = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) {
+ const int lastErrno = errno;
+ dlt_vlog(LOG_WARNING, "dlt_daemon_socket_open: socket() error %d: %s\n", lastErrno, strerror(lastErrno));
+ continue;
+ }
- if ((*sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
- const int lastErrno = errno;
- dlt_vlog(LOG_WARNING, "dlt_daemon_socket_open: socket() error %d: %s\n", lastErrno, strerror(lastErrno));
- }
+ dlt_vlog(LOG_INFO, "%s: Socket created - socket_family:%i, socket_type:%i, protocol:%i\n",
+ __FUNCTION__, p->ai_family, p->ai_socktype, p->ai_protocol);
-#endif
+ if (setsockopt(*sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) {
+ const int lastErrno = errno;
+ dlt_vlog(LOG_WARNING,
+ "dlt_daemon_socket_open: Setsockopt error %d in dlt_daemon_local_connection_init: %s\n",
+ lastErrno,
+ strerror(lastErrno));
+ continue;
+ }
- dlt_vlog(LOG_INFO, "%s: Socket created\n", __FUNCTION__);
+ if (bind(*sock, p->ai_addr, p->ai_addrlen) == -1) {
+ const int lastErrno = errno; /*close() may set errno too */
+ close(*sock);
+ dlt_vlog(LOG_WARNING, "dlt_daemon_socket_open: bind() error %d: %s\n", lastErrno, strerror(lastErrno));
+ continue;
+ }
- /* setsockpt SO_REUSEADDR */
- if (setsockopt(*sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) {
- const int lastErrno = errno;
- dlt_vlog(LOG_WARNING,
- "dlt_daemon_socket_open: Setsockopt error %d in dlt_daemon_local_connection_init: %s\n",
- lastErrno,
- strerror(lastErrno));
+ break;
}
- /* bind */
-#ifdef DLT_USE_IPv6
- struct sockaddr_in6 forced_addr;
- memset(&forced_addr, 0, sizeof(forced_addr));
- forced_addr.sin6_family = AF_INET6;
- forced_addr.sin6_port = htons(servPort);
- ret_inet_pton = inet_pton(AF_INET6, ip, &forced_addr.sin6_addr);
-#else
- struct sockaddr_in forced_addr;
- memset(&forced_addr, 0, sizeof(forced_addr));
- forced_addr.sin_family = AF_INET;
- forced_addr.sin_port = htons(servPort);
- ret_inet_pton = inet_pton(AF_INET, ip, &forced_addr.sin_addr);
-#endif
-
- /* inet_pton returns 1 on success */
- if (ret_inet_pton != 1) {
- dlt_vlog(LOG_WARNING,
- "dlt_daemon_socket_open: inet_pton() error %d: %s. Cannot convert IP address: %s\n",
- errno,
- strerror(errno),
- ip);
+ if (p == NULL) {
+ dlt_log(LOG_WARNING, "failed to bind socket\n");
return -1;
}
- if (bind(*sock, (struct sockaddr *)&forced_addr, sizeof(forced_addr)) == -1) {
- const int lastErrno = errno; /*close() may set errno too */
- close(*sock);
- dlt_vlog(LOG_WARNING, "dlt_daemon_socket_open: bind() error %d: %s\n", lastErrno, strerror(lastErrno));
- }
+ freeaddrinfo(servinfo);
- /*listen */
- dlt_vlog(LOG_INFO, "%s: Listening on ip %s and port: %u\n", __FUNCTION__, ip, servPort);
+ dlt_vlog(LOG_INFO, "%s: Listening on port: %u\n", __func__, servPort);
/* get socket buffer size */
dlt_vlog(LOG_INFO, "dlt_daemon_socket_open: Socket send queue size: %d\n",