pike.git / lib / modules / Protocols.pmod / DNS.pmod

version» Context lines:

pike.git/lib/modules/Protocols.pmod/DNS.pmod:201:    sscanf(s[next[0]..next[0]+3],"%2c%2c",m->type, m->cl);    next[0]+=4;    m->an=decode_entries(s,m->ancount,next);    m->ns=decode_entries(s,m->nscount,next);    m->ar=decode_entries(s,m->arcount,next);    return m;    }   };       + #define RETRIES 12 + #define RETRY_DELAY 5 +    class client {    inherit protocol;       static private int is_ip(string ip)    {    return(replace(ip,    ({ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "." }),    ({ "", "", "", "", "", "", "", "", "", "", "" })) == "");    }   
pike.git/lib/modules/Protocols.pmod/DNS.pmod:354:    if(arrayp(domain))    domains = domain;    else    if(stringp(domain))    domains = ({ domain });       }    }       -  // Warning: NO TIMEOUT +     mapping do_sync_query(string s)    {    object udp=spider.dumUDP();    udp->bind(0); -  udp->send(nameservers[0],53,s); +     mapping m; -  do { +  int i; +  for (i=0; i < RETRIES; i++) { +  udp->send(nameservers[i % sizeof(nameservers)], 53, s); +  while (udp->wait(RETRY_DELAY * 1.0)) {    m=udp->read(); -  } while (m->port != 53 || -  m->ip != nameservers[0] || -  m->data[0..1]!=s[0..1]); +  if ((m->port == 53) && +  (m->data[0..1] == s[0..1]) && +  (search(nameservers, m->ip) != -1)) { +  // Success.    return decode_res(m->data);    } -  +  } +  } +  // Failure. +  return 0; +  }       -  // Warning: NO TIMEOUT +     mixed *gethostbyname(string s)    {    mapping m;    if(sizeof(domains) && s[-1] != '.' && sizeof(s/".") < 3) {    m=do_sync_query(mkquery(s, C_IN, T_A));    if(!m || !m->an || !sizeof(m->an))    foreach(domains, string domain)    {    m=do_sync_query(mkquery(s+"."+domain, C_IN, T_A));    if(m && m->an && sizeof(m->an))    break;    }    } else {    m=do_sync_query(mkquery(s, C_IN, T_A));    }    -  +  if (!m) { +  return ({ 0, ({}), ({}) }); +  } +     string *names=({});    string *ips=({});    foreach(m->an, mapping x)    {    if(x->name)    names+=({x->name});    if(x->a)    ips+=({x->a});    }    return ({
pike.git/lib/modules/Protocols.pmod/DNS.pmod:413:    string arpa_from_ip(string ip)    {    return reverse(ip/".")*"."+".IN-ADDR.ARPA";    }       string ip_from_arpa(string arpa)    {    return reverse(arpa/".")[2..]*".";    }    -  // Warning: NO TIMEOUT +     mixed *gethostbyaddr(string s)    {    mapping m=do_sync_query(mkquery(arpa_from_ip(s), C_IN, T_PTR)); -  +  if (m) {    string *names=({});    string *ips=({});    foreach(m->an, mapping x)    {    if(x->ptr)    names+=({x->ptr});    if(x->name) -  +     {    ips+=({ip_from_arpa(x->name)});    }    }    return ({    sizeof(names)?names[0]:0,    ips,    names,    }); -  +  } else { +  // Lookup failed. +  return ({ 0, ({}), ({}) });    } -  +  }       string get_primary_mx(string host)    {    mapping m;    if(sizeof(domains) && host[-1] != '.' && sizeof(host/".") < 3) {    m=do_sync_query(mkquery(host, C_IN, T_MX));    if(!m || !m->an || !sizeof(m->an))    foreach(domains, string domain)    {    m=do_sync_query(mkquery(host+"."+domain, C_IN, T_MX));    if(m && m->an && sizeof(m->an))    break;    }    } else {    m=do_sync_query(mkquery(host, C_IN, T_MX));    } -  +  if (!m) { +  return 0; +  }    int minpref=29372974;    string ret;    foreach(m->an, mapping m2)    {    if(m2->preference<minpref)    {    ret=m2->mx;    minpref=m2->preference;    }    }    return ret;    }   }    - #define RETRIES 12 - #define RETRY_DELAY 5 +    #define REMOVE_DELAY 120   #define GIVE_UP_DELAY (RETRIES * RETRY_DELAY + REMOVE_DELAY)*2      class async_client   {    inherit client;    inherit spider.dumUDP : udp;    async_client next_client;       class Request