Mercurial > dovecot > core-2.2
diff src/lib/net.c @ 19680:55831f9d2e66
lib: Added net_str2hostport()
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Fri, 29 Jan 2016 17:32:30 +0200 |
parents | 0f22db71df7a |
children | f3e249261abd |
line wrap: on
line diff
--- a/src/lib/net.c Fri Jan 29 16:23:57 2016 +0200 +++ b/src/lib/net.c Fri Jan 29 17:32:30 2016 +0200 @@ -977,6 +977,42 @@ return 0; } +int net_str2hostport(const char *str, in_port_t default_port, + const char **host_r, in_port_t *port_r) +{ + const char *p, *host; + in_port_t port; + + if (str[0] == '[') { + /* [IPv6] address, possibly followed by :port */ + p = strchr(str, ']'); + if (p == NULL) + return -1; + host = t_strdup_until(str+1, p++); + } else { + p = strchr(str, ':'); + if (p == NULL || strchr(p+1, ':') != NULL) { + /* host or IPv6 address */ + *host_r = str; + *port_r = default_port; + return 0; + } + host = t_strdup_until(str, p); + } + if (p[0] == '\0') { + *host_r = host; + *port_r = default_port; + return 0; + } + if (p[0] != ':') + return -1; + if (net_str2port(p+1, &port) < 0) + return -1; + *host_r = host; + *port_r = port; + return 0; +} + int net_ipv6_mapped_ipv4_convert(const struct ip_addr *src, struct ip_addr *dest) {