Example #1
0
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 
Example #2
0
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;
}
Example #3
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;
}
Example #4
0
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;
}
Example #5
0
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;
}