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
;