19 #include <arpa/inet.h>
27 struct sockaddr_in *sai,
28 struct sockaddr_in6 *sai6,
35 if (!inet_pton(AF_INET, addr, &sai->sin_addr))
38 sai->sin_family = AF_INET;
39 sai->sin_port = htons(port);
41 sai->sin_len =
sizeof(
struct sockaddr_in);
43 *sa = (
struct sockaddr *) sai;
44 *salen =
sizeof(
struct sockaddr_in);
48 if (!inet_pton(AF_INET6, addr, &sai6->sin6_addr))
51 sai6->sin6_family = AF_INET6;
52 sai6->sin6_port = htons(port);
54 sai6->sin6_len =
sizeof(
struct sockaddr_in6);
56 *sa = (
struct sockaddr *) sai6;
57 *salen =
sizeof(
struct sockaddr_in6);
61 assert(af != AF_INET && af != AF_INET6);
69 unsigned *port_start,
unsigned *port_end)
72 char *sock_addr = NULL;
78 sock = strdup(sockspec);
82 sock_addr = calloc(1, INET6_ADDRSTRLEN);
83 assert(sock_addr != NULL);
84 t = strchr(sockspec,
'/');
87 memcpy(sock_addr, sockspec, t - sockspec);
88 sock_addr[t - sockspec] =
'\x00';
91 if (inet_pton(AF_INET6, sock_addr, buf)) {
93 *addr = strdup(sock_addr);
96 }
else if (inet_pton(AF_INET, sock_addr, buf)) {
98 *addr = strdup(sock_addr);
103 n = sscanf(t + 1,
"%d..%d", port_start, port_end);
105 *port_end = *port_start;
nmsg_res nmsg_sock_parse(int af, const char *addr, unsigned port, struct sockaddr_in *sai, struct sockaddr_in6 *sai6, struct sockaddr **sa, socklen_t *salen)
Parse an IP address and port number into a sockaddr.
nmsg_res nmsg_sock_parse_sockspec(const char *sockspec, int *af, char **addr, unsigned *port_start, unsigned *port_end)
Parse a "socket spec" string.