1 #include <sys/socket.h>
2 #include <netinet/in.h>
12 int __inet_aton(const char *, struct in_addr *);
14 int __lookup_ipliteral(struct address buf[static 1], const char *name, int family)
18 if (family != AF_INET6 && __inet_aton(name, &a4)>0) {
19 memcpy(&buf[0].addr, &a4, sizeof a4);
20 buf[0].family = AF_INET;
24 if (family != AF_INET) {
26 char *p = strchr(name, '%'), *z;
27 unsigned long long scopeid;
28 if (p && p-name < 64) {
29 memcpy(tmp, name, p-name);
33 if (inet_pton(AF_INET6, name, &a6)<=0) return 0;
34 memcpy(&buf[0].addr, &a6, sizeof a6);
35 buf[0].family = AF_INET6;
37 if (isdigit(*++p)) scopeid = strtoull(p, &z, 10);
40 if (!IN6_IS_ADDR_LINKLOCAL(&a6) &&
41 !IN6_IS_ADDR_MC_LINKLOCAL(&a6))
43 scopeid = if_nametoindex(p);
44 if (!scopeid) return EAI_NONAME;
46 if (scopeid > UINT_MAX) return EAI_NONAME;
47 buf[0].scopeid = scopeid;