Esempio n. 1
0
void my_read() {
	int blen, rc, qid;
	char buf[1024];
	struct nsnode *nsp = nshead;
	blen = read(dnsfd, buf, sizeof(buf));
	if (blen == -1) barf("read");
	qid = dnsgetid(buf);
	rc = dnsgetrcode(buf);
	if (debug) fprintf(stderr, "got response %d %d (bytes %d)\n", qid, rc, blen);
	nsp = nshead;
	while(nsp) {
		if (nsp->queryno == qid) {
			if (debug) fprintf(stderr, "parsing response...\n");
			if (rc == 0) {
				dnsparse(buf, blen, dnsrec, (void*)nsp);
				nsp->resprec = 1;
				}
			else if (rc == 3) {
				nsp->resprec = -3;
				}
			else {
				nsp->resprec = -1;
				}
			break;
			}
		nsp = nsp->next;
		}
	}
Esempio n. 2
0
void wait_for_a_while(uv_idle_t* handle, int status)
{
    counter++;

    if (counter == 1)
    {        ;//uv_idle_stop(handle);
        dnsparse("www.baidu.com");
    }
    sleep(2);
    printf("wait_for_a_while tid: %d\n", gettid());
}
Esempio n. 3
0
/* Called when data is ready to read on socket s */
void my_read() {
	int rc;
	char buf[1024];
	rc = read(dnsfd, buf, sizeof(buf));
	if (rc == -1) barf("read");
	write(2, "\ngot\n", 5);
	my_log_data(buf, rc);
	fprintf(stderr, "parsing...\n");
	dnsparse(buf, rc, dnsrec, NULL);
	fprintf(stderr, "parsed...\n");
	close(dnsfd);
	}
Esempio n. 4
0
File: dns.c Progetto: 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;
}