summaryrefslogtreecommitdiff
path: root/config.c
diff options
context:
space:
mode:
authorDavid Härdeman <david@hardeman.nu>2020-06-19 00:07:33 +0200
committerDavid Härdeman <david@hardeman.nu>2020-06-19 00:07:33 +0200
commitb32800e33ec16f7c592fa09b1a8b1f30a2e9df77 (patch)
tree591605397c24a7876d46a41fb264085eda3bc8d8 /config.c
parent723458dfa7e6246b5de7c7943175c78cf901366a (diff)
Add an addrstr to struct sockaddr_in46, rename to struct saddr
Diffstat (limited to 'config.c')
-rw-r--r--config.c130
1 files changed, 71 insertions, 59 deletions
diff --git a/config.c b/config.c
index 5affeff..de0522e 100644
--- a/config.c
+++ b/config.c
@@ -67,7 +67,7 @@ strtosockaddrs(const char *str, struct list_head *list)
char *tmp;
uint16_t port;
int r;
- struct sockaddr_in46 *addr;
+ struct saddr *saddr;
if (!str || *str == '\0' || !list)
return false;
@@ -83,14 +83,16 @@ strtosockaddrs(const char *str, struct list_head *list)
goto out;
*tmp = '\0';
- addr = zmalloc(sizeof(*addr));
- if (!addr)
+ saddr = zmalloc(sizeof(*saddr));
+ if (!saddr)
goto out;
- list_add(&addr->list, list);
+
+ /* early list_add to make sure saddr is free():d on error */
+ list_add(&saddr->list, list);
if (!strcmp(str, "*"))
- addr->in6.sin6_addr = in6addr_any;
- else if (inet_pton(AF_INET6, str, &addr->in6.sin6_addr) <= 0)
+ saddr->in6.sin6_addr = in6addr_any;
+ else if (inet_pton(AF_INET6, str, &saddr->in6.sin6_addr) <= 0)
goto out;
tmp++;
@@ -101,9 +103,10 @@ strtosockaddrs(const char *str, struct list_head *list)
if (strtou16_strict(tmp, &port) < 0)
goto out;
- addr->in6.sin6_family = AF_INET6;
- addr->in6.sin6_port = htons(port);
- addr->addrlen = sizeof(addr->in6);
+ saddr->in6.sin6_family = AF_INET6;
+ saddr->in6.sin6_port = htons(port);
+ saddr->addrlen = sizeof(saddr->in6);
+ saddr_set_str(saddr);
} else if (*str == '*') {
/* IPv4, *:p */
@@ -117,15 +120,16 @@ strtosockaddrs(const char *str, struct list_head *list)
if (strtou16_strict(str, &port) < 0)
goto out;
- addr = zmalloc(sizeof(*addr));
- if (!addr)
+ saddr = zmalloc(sizeof(*saddr));
+ if (!saddr)
goto out;
- list_add(&addr->list, list);
- addr->in4.sin_family = AF_INET;
- addr->in4.sin_addr.s_addr = INADDR_ANY;
- addr->in4.sin_port = htons(port);
- addr->addrlen = sizeof(addr->in4);
+ saddr->in4.sin_family = AF_INET;
+ saddr->in4.sin_addr.s_addr = INADDR_ANY;
+ saddr->in4.sin_port = htons(port);
+ saddr->addrlen = sizeof(saddr->in4);
+ saddr_set_str(saddr);
+ list_add(&saddr->list, list);
} else if ((tmp = strchr(str, ':'))) {
/* IPv4, a.b.c.d:p or IPv4/6 hostname:p */
@@ -136,19 +140,20 @@ strtosockaddrs(const char *str, struct list_head *list)
if (strtou16_strict(tmp, &port) < 0)
goto out;
- addr = zmalloc(sizeof(*addr));
- if (!addr)
+ saddr = zmalloc(sizeof(*saddr));
+ if (!saddr)
goto out;
- if (inet_pton(AF_INET, str, &addr->in4.sin_addr) > 0) {
+ if (inet_pton(AF_INET, str, &saddr->in4.sin_addr) > 0) {
debug(DBG_CFG, "got an IPv4:port (%s)\n", str);
- addr->in4.sin_family = AF_INET;
- addr->in4.sin_port = htons(port);
- addr->addrlen = sizeof(addr->in4);
- list_add(&addr->list, list);
+ saddr->in4.sin_family = AF_INET;
+ saddr->in4.sin_port = htons(port);
+ saddr->addrlen = sizeof(saddr->in4);
+ saddr_set_str(saddr);
+ list_add(&saddr->list, list);
goto success;
} else {
- xfree(addr);
+ xfree(saddr);
}
struct addrinfo hints = {
@@ -168,8 +173,8 @@ strtosockaddrs(const char *str, struct list_head *list)
debug(DBG_CFG, "got a hostname:port (%s)\n", str);
for (ai = results; ai; ai = ai->ai_next) {
- addr = zmalloc(sizeof(*addr));
- if (!addr) {
+ saddr = zmalloc(sizeof(*saddr));
+ if (!saddr) {
freeaddrinfo(results);
goto out;
}
@@ -178,27 +183,29 @@ strtosockaddrs(const char *str, struct list_head *list)
case AF_INET: {
struct sockaddr_in *naddr = (struct sockaddr_in *)ai->ai_addr;
- addr->in4.sin_family = AF_INET;
- addr->in4.sin_addr = naddr->sin_addr;
- addr->in4.sin_port = naddr->sin_port;
- addr->addrlen = sizeof(addr->in4);
- list_add(&addr->list, list);
+ saddr->in4.sin_family = AF_INET;
+ saddr->in4.sin_addr = naddr->sin_addr;
+ saddr->in4.sin_port = naddr->sin_port;
+ saddr->addrlen = sizeof(saddr->in4);
+ saddr_set_str(saddr);
+ list_add(&saddr->list, list);
break;
}
case AF_INET6: {
struct sockaddr_in6 *naddr = (struct sockaddr_in6 *)ai->ai_addr;
- addr->in6.sin6_family = AF_INET6;
- addr->in6.sin6_addr = naddr->sin6_addr;
- addr->in6.sin6_port = naddr->sin6_port;
- addr->addrlen = sizeof(addr->in6);
- list_add(&addr->list, list);
+ saddr->in6.sin6_family = AF_INET6;
+ saddr->in6.sin6_addr = naddr->sin6_addr;
+ saddr->in6.sin6_port = naddr->sin6_port;
+ saddr->addrlen = sizeof(saddr->in6);
+ saddr_set_str(saddr);
+ list_add(&saddr->list, list);
break;
}
default:
error("getaddrinfo(%s): unknown address family (%i)\n",
str, ai->ai_family);
- xfree(addr);
+ xfree(saddr);
continue;
}
}
@@ -209,23 +216,28 @@ strtosockaddrs(const char *str, struct list_head *list)
/* Port */
debug(DBG_CFG, "attempting to parse a port number (%s)\n", str);
- addr = zmalloc(sizeof(*addr));
- if (!addr)
+ saddr = zmalloc(sizeof(*saddr));
+ if (!saddr)
goto out;
- addr->in6.sin6_family = AF_INET6;
- addr->in6.sin6_addr = in6addr_any;
- addr->in6.sin6_port = htons(port);
- addr->addrlen = sizeof(addr->in6);
- list_add(&addr->list, list);
-
- addr = zmalloc(sizeof(*addr));
- if (!addr)
+
+ saddr->in6.sin6_family = AF_INET6;
+ saddr->in6.sin6_addr = in6addr_any;
+ saddr->in6.sin6_port = htons(port);
+ saddr->addrlen = sizeof(saddr->in6);
+ saddr_set_str(saddr);
+ list_add(&saddr->list, list);
+
+ saddr = zmalloc(sizeof(*saddr));
+ if (!saddr)
goto out;
- addr->in4.sin_family = AF_INET;
- addr->in4.sin_addr.s_addr = INADDR_ANY;
- addr->in4.sin_port = htons(port);
- addr->addrlen = sizeof(addr->in4);
- list_add(&addr->list, list);
+
+ saddr->in4.sin_family = AF_INET;
+ saddr->in4.sin_addr.s_addr = INADDR_ANY;
+ saddr->in4.sin_port = htons(port);
+ saddr->addrlen = sizeof(saddr->in4);
+ saddr_set_str(saddr);
+ list_add(&saddr->list, list);
+
} else {
/* Unknown */
error("unable to parse address: %s\n", str);
@@ -239,7 +251,7 @@ success:
} else {
int i = 0;
- list_for_each_entry(addr, list, list)
+ list_for_each_entry(saddr, list, list)
i++;
debug(DBG_CFG, "parsed to %i addresses\n", i);
@@ -249,11 +261,11 @@ success:
out:
if (!list_empty(list)) {
- struct sockaddr_in46 *tmp;
+ struct saddr *tmp;
- list_for_each_entry_safe(addr, tmp, list, list) {
- list_del(&addr->list);
- xfree(addr);
+ list_for_each_entry_safe(saddr, tmp, list, list) {
+ list_del(&saddr->list);
+ xfree(saddr);
}
}
return false;
@@ -328,9 +340,9 @@ config_parse_line(struct cfg *cfg, const char *filename, char **buf,
}
case CFG_VAL_TYPE_ADDRS: {
- if (!strtosockaddrs(tmp, &rvalue->addrs))
+ if (!strtosockaddrs(tmp, &rvalue->saddrs))
goto out;
- if (list_empty(&rvalue->addrs)) {
+ if (list_empty(&rvalue->saddrs)) {
error("empty address list\n");
goto out;
}