Added a generic function to split a host+port string to the host and port part supporting the two most common ipv6 notations beside domains and ipv4: with brackets for the address or a dot as port separator. --- This will be used a few times at least in pve-storage for iSCSI and will probably be useful in other areas of the code, too. src/PVE/Tools.pm | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+)
diff --git a/src/PVE/Tools.pm b/src/PVE/Tools.pm index a7bcd35..fc5710c 100644 --- a/src/PVE/Tools.pm +++ b/src/PVE/Tools.pm @@ -63,6 +63,14 @@ our $IPV6RE = "(?:" . "(?:(?:(?:(?:$IPV6H16:){0,5}$IPV6H16)?::" . ")$IPV6H16)|" . "(?:(?:(?:(?:$IPV6H16:){0,6}$IPV6H16)?::" . ")))"; +our $DOMAIN_RE = qr/[[:alnum:]\-.]+/; +our $IP_OR_DOMAIN_RE = qr/$IPV4RE|$IPV6RE|$DOMAIN_RE/; +our $IP_OR_DOMAIN_WITH_PORT_RE = qr/(?<ADDRESS>$IPV6RE)(?:\.(?<PORT>\d+))? + |(?:\[(?<ADDRESS>$IP_OR_DOMAIN_RE)\] + |(?<ADDRESS>$IPV4RE|$DOMAIN_RE)) + (?::(?<PORT>\d+))? + /x; + sub run_with_timeout { my ($timeout, $code, @param) = @_; @@ -1102,4 +1110,19 @@ sub get_host_address_family { return $res[0]->{family}; } +# Parses any sane kind of host, or host+port pair: +# The usual: name-or-ipv4:port +# The mostly available: [name-or-address]:port +# The alternative variant: ipv6.port +# The port is always optional and thus may be undef. +sub parse_host_and_port { + my ($address) = @_; + if ($address =~ /^$IP_OR_DOMAIN_WITH_PORT_RE$/) { + # appending a 1 so scalar-context evaluates to true even without a port + # so we can simply use "if(parse...)" to test the correctness of an address + return ($+{ADDRESS}, $+{PORT}, 1); + } + return undef; +} + 1; -- 2.1.4 _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel