From dbc91f474a38c7fb649f0e515cc8a1c635168229 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 25 Jun 2014 01:53:42 +0000 Subject: [PATCH] improved address lookup for socket bind() git-svn-id: https://zerberus.eonerc.rwth-aachen.de:8443/svn/s2ss/trunk@76 8ec27952-4edc-4aab-86aa-e87bb2611832 --- src/cfg.c | 2 +- src/utils.c | 23 ++++++++--------------- 2 files changed, 9 insertions(+), 16 deletions(-) diff --git a/src/cfg.c b/src/cfg.c index 5197bb8e9..a2a12a654 100644 --- a/src/cfg.c +++ b/src/cfg.c @@ -195,7 +195,7 @@ int config_parse_node(config_setting_t *cfg, struct node **nodes) if (node->type == NODE_INVALID) cerror(cfg, "Invalid type '%s' for node '%s'", type_str, node->name); - if (resolve_addr(local_str, &node->local, 0)) + if (resolve_addr(local_str, &node->local, AI_PASSIVE)) cerror(cfg, "Failed to resolve local address '%s' of node '%s'", local_str, node->name); if (resolve_addr(remote_str, &node->remote, 0)) diff --git a/src/utils.c b/src/utils.c index 7e4ecd73a..78b63db0b 100644 --- a/src/utils.c +++ b/src/utils.c @@ -48,23 +48,17 @@ void print(enum log_level lvl, const char *fmt, ...) int resolve_addr(const char *addr, struct sockaddr_in *sa, int flags) { int ret; - char *node; - char *service; - /* Split addr into node:service */ - if (sscanf(addr, "%m[^:]:%ms", &node, &service) != 2) - return -EINVAL; + /* Split string */ + char *tmp = strdup(addr); + char *node = strtok(tmp, ":"); + char *service = strtok(NULL, ":"); - /* Check for wildcards */ - if (!strcmp(node, "*")) { - free(node); + if (node && !strcmp(node, "*")) node = NULL; - } - if (!strcmp(service, "*")) { - free(service); + if (service && !strcmp(service, "*")) service = NULL; - } /* Get IP */ struct addrinfo *result; @@ -77,12 +71,11 @@ int resolve_addr(const char *addr, struct sockaddr_in *sa, int flags) ret = getaddrinfo(node, service, &hint, &result); if (ret) - error("Failed to lookup address: %s", gai_strerror(ret)); + error("Failed to lookup address '%s': %s", addr, gai_strerror(ret)); memcpy(sa, result->ai_addr, result->ai_addrlen); - free(node); - free(service); + free(tmp); freeaddrinfo(result); return 0;