#include #include #include #include #include #include extern const char *__progname; #include "blocker.h" #include "stringgetter.h" #include "resolver.h" int resolverfd; void resolver_main(void) { STRINGGETTER *g; STRINGGOT s; char *hs; struct addrinfo hints; int e; struct addrinfo *ai0; FILE *r; FILE *w; FILE *b; struct addrinfo *ai; setproctitle("resolver [%d]",getppid()); r = fdopen(resolverfd,"r"); w = fdopen(resolverfd,"w"); g = sg_init_pull(&sg_get_stdio,&sg_term_nul,r); while (1) { fflush(w); s = sg_get(g); if (s.len < 0) exit(0); hs = strdup(s.str); s = sg_get(g); if (s.len < 0) { fprintf(stderr,"%s: resolver process: got host but not port\n",__progname); exit(1); } b = fwrap_w_blocked(w); hints.ai_flags = AI_NUMERICSERV; hints.ai_family = PF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = 0; hints.ai_addrlen = 0; hints.ai_canonname = 0; hints.ai_addr = 0; hints.ai_next = 0; e = getaddrinfo(hs,s.str,&hints,&ai0); if (e) { fprintf(b,"%s/%s: %s",hs,s.str,gai_strerror(e)); } else { if (ai0) { fclose(b); for (ai=ai0;ai;ai=ai->ai_next) { b = fwrap_w_blocked(w); fwrite(&ai->ai_family,sizeof(int),1,b); fwrite(&ai->ai_socktype,sizeof(int),1,b); fwrite(&ai->ai_protocol,sizeof(int),1,b); fwrite(&ai->ai_addrlen,sizeof(size_t),1,b); fwrite(ai->ai_addr,1,ai->ai_addrlen,b); fclose(b); } b = fwrap_w_blocked(w); freeaddrinfo(ai0); } else { fprintf(b,"%s/%s: getaddrinfo succeeded but no addresses",hs,s.str); } } fclose(b); free(hs); } }