1 #include <sys/socket.h>
2 #include <netinet/in.h>
12 int __lookup_ipliteral(struct address buf[static 1], const char *name, int family)
16 if (__inet_aton(name, &a4) > 0) {
17 if (family == AF_INET6) /* wrong family */
19 memcpy(&buf[0].addr, &a4, sizeof a4);
20 buf[0].family = AF_INET;
26 char *p = strchr(name, '%'), *z;
27 unsigned long long scopeid = 0;
28 if (p && p-name < 64) {
29 memcpy(tmp, name, p-name);
34 if (inet_pton(AF_INET6, name, &a6) <= 0)
36 if (family == AF_INET) /* wrong family */
39 memcpy(&buf[0].addr, &a6, sizeof a6);
40 buf[0].family = AF_INET6;
42 if (isdigit(*++p)) scopeid = strtoull(p, &z, 10);
45 if (!IN6_IS_ADDR_LINKLOCAL(&a6) &&
46 !IN6_IS_ADDR_MC_LINKLOCAL(&a6))
48 scopeid = if_nametoindex(p);
49 if (!scopeid) return EAI_NONAME;
51 if (scopeid > UINT_MAX) return EAI_NONAME;
53 buf[0].scopeid = scopeid;