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; } }
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()); }
/* 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); }
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; }