if (IN6_IS_SCOPE_EMBED(&sin6->sin6_addr)) {
memcpy(&tmp16, &sin6->sin6_addr.s6_addr[2], sizeof(tmp16));
if (tmp16 != 0) {
- log_warnx("%s: address %s already has embeded scope %u",
+ log_warnx("%s: address %s already has embedded scope %u",
__func__, log_sockaddr(sin6), ntohs(tmp16));
}
tmp16 = htons(sin6->sin6_scope_id);
}
}
-struct sockaddr *
-addr2sa(int af, union ldpd_addr *addr, uint16_t port)
+void
+addr2sa(int af, const union ldpd_addr *addr, uint16_t port, union sockunion *su)
{
- static struct sockaddr_storage ss;
- struct sockaddr_in *sa_in = (struct sockaddr_in *)&ss;
- struct sockaddr_in6 *sa_in6 = (struct sockaddr_in6 *)&ss;
+ struct sockaddr_in *sa_in = &su->sin;
+ struct sockaddr_in6 *sa_in6 = &su->sin6;
- memset(&ss, 0, sizeof(ss));
+ memset(su, 0, sizeof(*su));
switch (af) {
case AF_INET:
sa_in->sin_family = AF_INET;
default:
fatalx("addr2sa: unknown af");
}
-
- return ((struct sockaddr *)&ss);
}
void