Пример #1
0
void *
thread_main_dns(void *arg)
{
	int dnsrequest(const char *name, uint32 *ipaddr);
	int connfd, *number, count, total;
	char  *domain ;
	uint32 *ipptr;
	pthread_mutex_t *mutex;
	printf("dns thread %d starting \n", (int)arg );

	for(;;){

		Pthread_mutex_lock(&dns_array_mutex);

		while(iget == iput)
			Pthread_cond_wait(&dns_array_cond,
					&dns_array_mutex);
		
		printf("thread %d  working \n", pthread_self());

		connfd	= dns_array[iget].sockfd;
		domain  = dns_array[iget].domain;
		number	= dns_array[iget].number;
 		count	= dns_array[iget].count;
		total	= dns_array[iget].total;
		ipptr	= dns_array[iget].ipptr;
		mutex	= dns_array[iget].mutex;
		
		if(++iget == ARRAYSIZE)
			iget = 0;		

		Pthread_mutex_unlock(&dns_array_mutex);

		//do our job 
		if(dnsrequest(domain, ipptr + count) != 0) 
			inet_pton(AF_INET, "127.0.0.1", ipptr+count);
		dc_free(domain);	//dc_free the memory of domain
		Pthread_mutex_lock(mutex);
		(*number)--;
		Pthread_mutex_unlock(mutex);
		if((*number) == 0){
			write(connfd, ipptr, total*sizeof(uint32));
			printf("sended\n");
	//		close(connfd);	//todo
			dc_free(ipptr);
			dc_free(number);
			dc_free(mutex);
		} 


	}

}
Пример #2
0
Файл: dns.c Проект: GNS3/vpcs
int hostresolv(pcs *pc, char *name, char *ipstr)
{
	
	struct packet *m;
	char data[512];
	char *pdn = NULL;
	int dlen;

	struct timeval tv;
	int ok;
	int namelen;
	int i;
	
	char dname[64];
	u_short magicid;
	int reqcnt = 0;
	int atype = 1;
	int cnt4 = 0;
	int cnt6 = 0;
	u_char ip[20];
	int tryagain = 0;
	
	appenddomain(pc, dname, name);
	
	while (reqcnt++ < 3) {
		tryagain = 0;
		
		magicid = random();
		dlen = dnsrequest(magicid, dname, atype, data, &namelen);
		if (dlen == 0) 
			return 0;

		pdn = data + sizeof(dnshdr);
		for (i = 0; i < 4 && !tryagain; i++) {
			if (cnt4 < 2) {
				m = dns4(pc, cnt4, data, dlen);
				cnt4++;
				if (m == NULL)
					continue;
			} else if (cnt6 < 2) {
				m = dns6(pc, cnt6, data, dlen);
				cnt6++;
				if (m == NULL)
					continue;
			}
			gettimeofday(&(tv), (void*)0);
			enq(&pc->oq, m);
			while (!timeout(tv, 1000) && !ctrl_c) {
				delay_ms(1);
				ok = 0;
				while ((m = deq(&pc->iq)) != NULL && !ok) {
					ok = dnsparse(m, magicid, dname, namelen, ip);
					free(m);
				}
				if (ok == 2) {
					tryagain = 1;
					break;
				}
				if (ok == 6) {
					atype = 28;
					cnt4 = 0;
					cnt6 = 0;
					tryagain = 1;
					break;
				}
				if (ok) {
					strcpy(name, dname);
					ip2str(ip, ipstr);
					return 1;
				}
			}
		}
	}
	
	return 0;
}