int proxy_getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res) { struct servent *se = NULL; struct hostent *hp = NULL; struct sockaddr* sockaddr_space = NULL; struct addrinfo* addrinfo_space = NULL; // printf("proxy_getaddrinfo node %s service %s\n",node,service); addrinfo_space = malloc(sizeof(struct addrinfo)); if(!addrinfo_space) goto err1; sockaddr_space = malloc(sizeof(struct sockaddr)); if(!sockaddr_space) goto err2; bzero(sockaddr_space, sizeof(*sockaddr_space)); bzero(addrinfo_space, sizeof(*addrinfo_space)); if (node && !inet_aton(node,&((struct sockaddr_in*)sockaddr_space)->sin_addr)) { hp = proxy_gethostbyname(node); if (hp) memcpy(&((struct sockaddr_in*)sockaddr_space)->sin_addr, *(hp->h_addr_list), sizeof(in_addr_t)); else goto err3; } if (service) se = getservbyname(service, NULL); if (!se) { ((struct sockaddr_in*)sockaddr_space)->sin_port = htons(atoi(service?:"0")); } else
int proxy_getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res) { struct gethostbyname_data ghdata; struct addrinfo_data *space; struct servent *se = NULL; struct hostent *hp = NULL; struct servent se_buf; struct addrinfo *p; char buf[1024]; int port; // printf("proxy_getaddrinfo node %s service %s\n",node,service); space = calloc(1, sizeof(struct addrinfo_data)); if(!space) return 1; if(node && !inet_aton(node, &((struct sockaddr_in *) &space->sockaddr_space)->sin_addr)) { hp = proxy_gethostbyname(node, &ghdata); if(hp) { memcpy(&((struct sockaddr_in *) &space->sockaddr_space)->sin_addr, *(hp->h_addr_list), sizeof(in_addr_t)); } else { free(space); return 1; } } if(service) proxy_getservbyname(service, &se_buf, buf, sizeof(buf), &se); port = se ? se->s_port : htons(atoi(service ? service : "0")); ((struct sockaddr_in *) &space->sockaddr_space)->sin_port = (in_port_t)port; *res = p = &space->addrinfo_space; assert((size_t)p == (size_t) space); p->ai_addr = &space->sockaddr_space; if(node) strncpy(space->addr_name, node, sizeof(space->addr_name)); p->ai_canonname = space->addr_name; p->ai_next = NULL; p->ai_family = space->sockaddr_space.sa_family = AF_INET; p->ai_addrlen = sizeof(space->sockaddr_space); if(hints) { p->ai_socktype = hints->ai_socktype; p->ai_flags = hints->ai_flags; p->ai_protocol = hints->ai_protocol; } else { #ifdef BSD p->ai_flags = (AI_V4MAPPED | AI_ADDRCONFIG); #else p->ai_flags = (AI_ADDRCONFIG); #endif } return 0; }
unsigned int *get_address(char *hostname) { struct hostent *hp; unsigned int *sin=NULL; if ((hp = proxy_gethostbyname(hostname))) { sin = (unsigned int *) malloc(sizeof(unsigned int)); bcopy((char *)(*(hp->h_addr_list)),(char *)sin,sizeof(hp->h_addr_list)); } return sin; }
struct hostent *gethostbyname(const char *name) { if(!init_l) init_lib(); PDEBUG("gethostbyname: %s\n", name); if(proxychains_resolver) return proxy_gethostbyname(name); else return true_gethostbyname(name); return NULL; }
int proxy_getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res) { struct gethostbyname_data ghdata; struct addrinfo_data *space; struct servent *se = NULL; struct hostent *hp = NULL; struct servent se_buf; struct addrinfo *p; char buf[1024]; int port; PFUNC(); // printf("proxy_getaddrinfo node %s service %s\n",node,service); space = calloc(1, sizeof(struct addrinfo_data)); if(!space) goto err1; if(node && !inet_aton(node, &((struct sockaddr_in *) &space->sockaddr_space)->sin_addr)) { /* some folks (nmap) use getaddrinfo() with AI_NUMERICHOST to check whether a string containing a numeric ip was passed. we must return failure in that case. */ if(hints && (hints->ai_flags & AI_NUMERICHOST)) return EAI_NONAME; hp = proxy_gethostbyname(node, &ghdata); if(hp) memcpy(&((struct sockaddr_in *) &space->sockaddr_space)->sin_addr, *(hp->h_addr_list), sizeof(in_addr_t)); else goto err2; } if(service) getservbyname_r(service, NULL, &se_buf, buf, sizeof(buf), &se); port = se ? se->s_port : htons(atoi(service ? service : "0")); ((struct sockaddr_in *) &space->sockaddr_space)->sin_port = port; *res = p = &space->addrinfo_space; assert((size_t)p == (size_t) space); p->ai_addr = &space->sockaddr_space; if(node) snprintf(space->addr_name, sizeof(space->addr_name), "%s", node); p->ai_canonname = space->addr_name; p->ai_next = NULL; p->ai_family = space->sockaddr_space.sa_family = AF_INET; p->ai_addrlen = sizeof(space->sockaddr_space); if(hints) { p->ai_socktype = hints->ai_socktype; p->ai_flags = hints->ai_flags; p->ai_protocol = hints->ai_protocol; } else { #ifndef AI_V4MAPPED #define AI_V4MAPPED 0 #endif p->ai_flags = (AI_V4MAPPED | AI_ADDRCONFIG); } goto out; err2: free(space); err1: return 1; out: return 0; }