|
@@ -99,6 +99,27 @@ libc_hidden_proto(in6addr_loopback)
|
|
|
#define UNIX_PATH_MAX 108
|
|
|
#endif
|
|
|
|
|
|
+
|
|
|
+typedef int8_t socktype_t;
|
|
|
+typedef int8_t family_t;
|
|
|
+typedef int8_t protocol_t;
|
|
|
+struct BUG_too_small {
|
|
|
+ char BUG_socktype_t_too_small[(0
|
|
|
+ | SOCK_STREAM
|
|
|
+ | SOCK_DGRAM
|
|
|
+ | SOCK_RAW
|
|
|
+ ) <= 127 ? 1 : -1];
|
|
|
+ char BUG_family_t_too_small[(0
|
|
|
+ | AF_UNSPEC
|
|
|
+ | AF_INET
|
|
|
+ | AF_INET6
|
|
|
+ ) <= 127 ? 1 : -1];
|
|
|
+ char BUG_protocol_t_too_small[(0
|
|
|
+ | IPPROTO_TCP
|
|
|
+ | IPPROTO_UDP
|
|
|
+ ) <= 127 ? 1 : -1];
|
|
|
+};
|
|
|
+
|
|
|
struct gaih_service
|
|
|
{
|
|
|
const char *name;
|
|
@@ -113,8 +134,6 @@ struct gaih_servtuple
|
|
|
int port;
|
|
|
};
|
|
|
|
|
|
-static const struct gaih_servtuple nullserv;
|
|
|
-
|
|
|
struct gaih_addrtuple
|
|
|
{
|
|
|
struct gaih_addrtuple *next;
|
|
@@ -125,23 +144,22 @@ struct gaih_addrtuple
|
|
|
|
|
|
struct gaih_typeproto
|
|
|
{
|
|
|
- int socktype;
|
|
|
- int protocol;
|
|
|
+ socktype_t socktype;
|
|
|
+ protocol_t protocol;
|
|
|
+ int8_t protoflag;
|
|
|
char name[4];
|
|
|
- int protoflag;
|
|
|
};
|
|
|
-
|
|
|
|
|
|
#define GAI_PROTO_NOSERVICE 1
|
|
|
#define GAI_PROTO_PROTOANY 2
|
|
|
|
|
|
static const struct gaih_typeproto gaih_inet_typeproto[] =
|
|
|
{
|
|
|
- { 0, 0, "", 0 },
|
|
|
- { SOCK_STREAM, IPPROTO_TCP, "tcp", 0 },
|
|
|
- { SOCK_DGRAM, IPPROTO_UDP, "udp", 0 },
|
|
|
- { SOCK_RAW, 0, "raw", GAI_PROTO_PROTOANY|GAI_PROTO_NOSERVICE },
|
|
|
- { 0, 0, "", 0 }
|
|
|
+ { 0 , 0 , 0 , "" },
|
|
|
+ { SOCK_STREAM, IPPROTO_TCP, 0 , "tcp" },
|
|
|
+ { SOCK_DGRAM , IPPROTO_UDP, 0 , "udp" },
|
|
|
+ { SOCK_RAW , 0 , GAI_PROTO_PROTOANY|GAI_PROTO_NOSERVICE, "raw" },
|
|
|
+ { 0 , 0 , 0 , "" },
|
|
|
};
|
|
|
|
|
|
struct gaih
|
|
@@ -151,13 +169,6 @@ struct gaih
|
|
|
const struct addrinfo *req, struct addrinfo **pai);
|
|
|
};
|
|
|
|
|
|
-#if PF_UNSPEC == 0
|
|
|
-static const struct addrinfo default_hints;
|
|
|
-#else
|
|
|
-static const struct addrinfo default_hints =
|
|
|
-{ 0, PF_UNSPEC, 0, 0, 0, NULL, NULL, NULL };
|
|
|
-#endif
|
|
|
-
|
|
|
#define SEEN_IPV4 1
|
|
|
#define SEEN_IPV6 2
|
|
|
|
|
@@ -282,8 +293,7 @@ gaih_local (const char *name, const struct gaih_service *service,
|
|
|
{
|
|
|
if (req->ai_socktype)
|
|
|
return (GAIH_OKIFUNSPEC | -EAI_SOCKTYPE);
|
|
|
- else
|
|
|
- return (GAIH_OKIFUNSPEC | -EAI_SERVICE);
|
|
|
+ return (GAIH_OKIFUNSPEC | -EAI_SERVICE);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -435,14 +445,18 @@ static int
|
|
|
gaih_inet (const char *name, const struct gaih_service *service,
|
|
|
const struct addrinfo *req, struct addrinfo **pai)
|
|
|
{
|
|
|
+ struct gaih_servtuple nullserv;
|
|
|
+
|
|
|
const struct gaih_typeproto *tp = gaih_inet_typeproto;
|
|
|
- struct gaih_servtuple *st = (struct gaih_servtuple *) &nullserv;
|
|
|
+ struct gaih_servtuple *st = &nullserv;
|
|
|
struct gaih_addrtuple *at = NULL;
|
|
|
int rc;
|
|
|
int v4mapped = (req->ai_family == PF_UNSPEC || req->ai_family == PF_INET6) &&
|
|
|
(req->ai_flags & AI_V4MAPPED);
|
|
|
unsigned seen = __check_pf();
|
|
|
|
|
|
+ memset(&nullserv, 0, sizeof(nullserv));
|
|
|
+
|
|
|
if (req->ai_protocol || req->ai_socktype)
|
|
|
{
|
|
|
++tp;
|
|
@@ -458,8 +472,7 @@ gaih_inet (const char *name, const struct gaih_service *service,
|
|
|
{
|
|
|
if (req->ai_socktype)
|
|
|
return (GAIH_OKIFUNSPEC | -EAI_SOCKTYPE);
|
|
|
- else
|
|
|
- return (GAIH_OKIFUNSPEC | -EAI_SERVICE);
|
|
|
+ return (GAIH_OKIFUNSPEC | -EAI_SERVICE);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -509,7 +522,7 @@ gaih_inet (const char *name, const struct gaih_service *service,
|
|
|
*pst = newp;
|
|
|
pst = &(newp->next);
|
|
|
}
|
|
|
- if (st == (struct gaih_servtuple *) &nullserv)
|
|
|
+ if (st == &nullserv)
|
|
|
return (GAIH_OKIFUNSPEC | -EAI_SERVICE);
|
|
|
}
|
|
|
}
|
|
@@ -849,7 +862,7 @@ gaih_inet (const char *name, const struct gaih_service *service,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static struct gaih gaih[] =
|
|
|
+static const struct gaih gaih[] =
|
|
|
{
|
|
|
#if defined __UCLIBC_HAS_IPV6__
|
|
|
{ PF_INET6, gaih_inet },
|
|
@@ -883,8 +896,9 @@ getaddrinfo (const char *name, const char *service,
|
|
|
{
|
|
|
int i = 0, j = 0, last_i = 0;
|
|
|
struct addrinfo *p = NULL, **end;
|
|
|
- struct gaih *g = gaih, *pg = NULL;
|
|
|
+ const struct gaih *g = gaih, *pg = NULL;
|
|
|
struct gaih_service gaih_service, *pservice;
|
|
|
+ struct addrinfo default_hints;
|
|
|
|
|
|
if (name != NULL && name[0] == '*' && name[1] == 0)
|
|
|
name = NULL;
|
|
@@ -896,7 +910,12 @@ getaddrinfo (const char *name, const char *service,
|
|
|
return EAI_NONAME;
|
|
|
|
|
|
if (hints == NULL)
|
|
|
+ {
|
|
|
+ memset(&default_hints, 0, sizeof(default_hints));
|
|
|
+ if (AF_UNSPEC)
|
|
|
+ default_hints->ai_family = AF_UNSPEC;
|
|
|
hints = &default_hints;
|
|
|
+ }
|
|
|
|
|
|
if (hints->ai_flags & ~(AI_PASSIVE|AI_CANONNAME|AI_NUMERICHOST|
|
|
|
AI_ADDRCONFIG|AI_V4MAPPED|AI_NUMERICSERV|AI_ALL))
|