static int reverse_lookup (question_t *q, char *name, DWORD nameserver) { int i, ret; int ready = 0; udp_Socket dom_sock; if (!nameserver || /* no nameserver, give up */ dns_timeout == 0) return (0); udp_open (&dom_sock, 997, nameserver, 53, NULL); for (i = 2; i < 17 && !_resolve_exit; i *= 2) { sock_write ((sock_type*)&dom_sock, (BYTE*)q, sizeof(*q)); ip_timer_init (&dom_sock, i); do { kbhit(); tcp_tick ((sock_type*)&dom_sock); if (watcbroke || (_resolve_hook && (*_resolve_hook)() == 0)) { _resolve_exit = 1; break; } if (ip_timer_expired(&dom_sock) || chk_timeout(resolve_timeout)) break; if (sock_dataready((sock_type*)&dom_sock)) ready = 1; } while (!ready); } if (ready) ret = getresult (&dom_sock, name); else ret = 0; sock_close ((sock_type*)&dom_sock); return (ret); }
/* Sdomain * DOMAIN based name lookup * query a domain name server to get resource record data * Returns the data on a machine from a particular RR type. * Events generated will have this number tagged with them. * Returns various negative numbers on error conditions. * * if adddom is nonzero, add default domain * * Returns true if we got data, false otherwise. */ static int Sdomain( char *mname, byte dtype, unpacker_funct unpacker, void *data, int adddom, longword nameserver, byte *timedout, sockfunct_t fn ) // S. Lawson /* int *timedout; set to 1 on timeout */ { char namebuff[512]; /* int domainsremaining; */ int /*status,*/ i; int result; int fnbroke; // S. Lawson result = 0; fnbroke = 0; // S. Lawson *timedout = 1; if (!nameserver) { /* no nameserver, give up now */ outs("No nameserver defined!\n\r"); return(0); } while (*mname && *mname < 33) mname ++; /* kill leading spaces */ if (!(*mname)) return(0); qinit(); /* initialize some flag fields */ strcpy( namebuff, mname ); if ( adddom ) { if(namebuff[strlen(namebuff)-1] != '.') { /* if no trailing dot */ if(loc_domain) { /* there is a search list */ // domainsremaining = countpaths( loc_domain ); // why this here? -md strcat(namebuff,"."); strcat(namebuff,getpath(loc_domain,1)); } } else namebuff[ strlen(namebuff)-1] = 0; /* kill trailing dot */ } /* * This is not terribly good, but it attempts to use a binary * exponentially increasing delays. */ for ( i = 2; i < 17; i *= 2) { sendom(namebuff,nameserver, 0xf001, dtype); /* try UDP */ ip_timer_init( dom_sock, i ); do { kbhit(); tcp_tick( dom_sock ); if (ip_timer_expired( dom_sock )) break; if ( watcbroke ) { break; } if (chk_timeout( timeoutwhen )) break; // S. Lawson - call the idle/break function if (fn && fn(NULL)!=0) { result=fnbroke=-1; *timedout=1; break; } if ( sock_dataready( dom_sock )) *timedout = 0; } while ( *timedout ); if ( !*timedout ) break; /* got an answer */ } if ( !*timedout && !fnbroke) // S. Lawson result = udpdom(dtype, unpacker, data); /* process the received data */ sock_close( dom_sock ); return( result ); }