3 #include <sys/socket.h>
6 #include <netinet/in.h>
11 int gethostbyname2_r(const char *name
, int af
,
12 struct hostent
*h
, char *buf
, size_t buflen
,
13 struct hostent
**res
, int *err
)
15 struct address addrs
[MAXADDRS
];
21 cnt
= __lookup_name(addrs
, canon
, name
, af
, AI_CANONNAME
);
22 if (cnt
<0) switch (cnt
) {
24 *err
= HOST_NOT_FOUND
;
40 h
->h_length
= af
==AF_INET6
? 16 : 4;
43 align
= -(uintptr_t)buf
& sizeof(char *)-1;
45 need
= 4*sizeof(char *);
46 need
+= (cnt
+ 1) * (sizeof(char *) + h
->h_length
);
47 need
+= strlen(name
)+1;
48 need
+= strlen(canon
)+1;
51 if (need
> buflen
) return ERANGE
;
54 h
->h_aliases
= (void *)buf
;
55 buf
+= 3*sizeof(char *);
56 h
->h_addr_list
= (void *)buf
;
57 buf
+= (cnt
+1)*sizeof(char *);
59 for (i
=0; i
<cnt
; i
++) {
60 h
->h_addr_list
[i
] = (void *)buf
;
62 memcpy(h
->h_addr_list
[i
], addrs
[i
].addr
, h
->h_length
);
64 h
->h_addr_list
[i
] = 0;
66 h
->h_name
= h
->h_aliases
[0] = buf
;
67 strcpy(h
->h_name
, canon
);
68 buf
+= strlen(h
->h_name
)+1;
70 if (strcmp(h
->h_name
, name
)) {
71 h
->h_aliases
[1] = buf
;
72 strcpy(h
->h_aliases
[1], name
);
73 buf
+= strlen(h
->h_aliases
[1])+1;
74 } else h
->h_aliases
[1] = 0;