12 #include <sys/socket.h>
13 #include <netinet/in.h>
22 freeaddrinfo(struct addrinfo *res)
24 struct addrinfo *info;
26 while((info = res) != 0){
28 free(info->ai_canonname);
35 sockfamily(char *addr)
37 if(strchr(addr, ':') != 0)
44 sockproto(char *proto)
46 if(strcmp(proto, "tcp") == 0)
48 if(strcmp(proto, "udp") == 0)
50 if(strcmp(proto, "il") == 0)
56 filladdrinfo(char *s, struct addrinfo *a, struct addrinfo *h)
63 if((q = strchr(s, ' ')) == 0)
67 if((p = strrchr(s+1, '/')) == 0)
70 if((p = strrchr(s+1, '/')) == 0)
76 if((a->ai_socktype = sockproto(p)) == 0)
78 if((p = strchr(q, '!')) != 0){
80 a->ai_family = sockfamily(q);
84 if((a->ai_family = h->ai_family) == 0)
85 a->ai_family = AF_INET;
87 if((a->ai_socktype == SOCK_RDM || h->ai_socktype != 0)
88 && (a->ai_socktype != h->ai_socktype))
90 if(h->ai_family != 0 && a->ai_family != h->ai_family)
92 if(_sock_inaddr(a->ai_family, q, p, &sa, &a->ai_addrlen) <= 0)
94 if((a->ai_addr = malloc(a->ai_addrlen)) == 0)
96 memmove(a->ai_addr, &sa, a->ai_addrlen);
101 getaddrinfo(char *node, char *serv, struct addrinfo *hints, struct addrinfo **res)
103 static struct addrinfo nohints;
104 struct addrinfo *a, *head, **tail;
105 char buf[1024], *proto;
115 switch(hints->ai_family){
120 switch(hints->ai_socktype){
145 if(hints->ai_flags & AI_PASSIVE)
147 else if(hints->ai_family == AF_INET6)
153 if((fd = open("/net/cs", O_RDWR)) < 0)
156 snprintf(buf, sizeof(buf), "%s!%s!%s", proto, node, serv);
158 if(write(fd, buf, n) != n){
167 if((n = read(fd, buf, sizeof(buf)-1)) <= 0)
170 if((a = malloc(sizeof(*a))) == 0){
175 memset(a, 0, sizeof(*a));
176 if((err = filladdrinfo(buf, a, hints)) != 0){
193 if((hints->ai_flags & AI_CANONNAME) != 0 && (hints->ai_flags & AI_NUMERICHOST) == 0){
194 n = _sock_ipattr(node);
195 if(n != Tsys && n != Tdom){
196 if(getnameinfo(head->ai_addr, head->ai_addrlen, buf, sizeof(buf), 0, 0, NI_NAMEREQD) == 0)
203 if((head->ai_canonname = malloc(n)) == 0){
207 memmove(head->ai_canonname, node, n);