| /* |
| * Copyright (c) 2019 Linaro Limited |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #ifdef CONFIG_NET_SOCKETS |
| |
| #include <zephyr/net/socketutils.h> |
| |
| const char *net_addr_str_find_port(const char *addr_str) |
| { |
| const char *p = strrchr(addr_str, ':'); |
| |
| if (p == NULL) { |
| return NULL; |
| } |
| |
| /* If it's not IPv6 numeric notation, we guaranteedly got a port */ |
| if (*addr_str != '[') { |
| return p + 1; |
| } |
| |
| /* IPv6 numeric address, and ':' preceded by ']' */ |
| if (p[-1] == ']') { |
| return p + 1; |
| } |
| |
| /* Otherwise, just raw IPv6 address, ':' is component separator */ |
| return NULL; |
| } |
| |
| int net_getaddrinfo_addr_str(const char *addr_str, const char *def_port, |
| const struct zsock_addrinfo *hints, |
| struct zsock_addrinfo **res) |
| { |
| const char *port; |
| char host[NI_MAXHOST]; |
| |
| if (addr_str == NULL) { |
| errno = EINVAL; |
| return -1; |
| } |
| |
| port = net_addr_str_find_port(addr_str); |
| |
| if (port == NULL) { |
| port = def_port; |
| } else { |
| int host_len = port - addr_str - 1; |
| |
| if (host_len > sizeof(host) - 1) { |
| errno = EINVAL; |
| return -1; |
| } |
| strncpy(host, addr_str, host_len + 1); |
| host[host_len] = '\0'; |
| addr_str = host; |
| } |
| |
| return zsock_getaddrinfo(addr_str, port, hints, res); |
| } |
| |
| #endif |