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); } } }
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; }